mirror of
https://github.com/netbirdio/netbird.git
synced 2026-03-31 06:24:18 -04:00
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials/insecure"
|
|
|
|
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
|
|
)
|
|
|
|
func TestMaxRecvMsgSize(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
envValue string
|
|
expected int
|
|
}{
|
|
{name: "unset returns 0", envValue: "", expected: 0},
|
|
{name: "valid value", envValue: "10485760", expected: 10485760},
|
|
{name: "non-numeric returns 0", envValue: "abc", expected: 0},
|
|
{name: "negative returns 0", envValue: "-1", expected: 0},
|
|
{name: "zero returns 0", envValue: "0", expected: 0},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Setenv(EnvMaxRecvMsgSize, tt.envValue)
|
|
if tt.envValue == "" {
|
|
os.Unsetenv(EnvMaxRecvMsgSize)
|
|
}
|
|
assert.Equal(t, tt.expected, MaxRecvMsgSize())
|
|
})
|
|
}
|
|
}
|
|
|
|
// largeSyncServer implements just the Sync RPC, returning a response larger than the default 4MB limit.
|
|
type largeSyncServer struct {
|
|
mgmtProto.UnimplementedManagementServiceServer
|
|
responseSize int
|
|
}
|
|
|
|
func (s *largeSyncServer) GetServerKey(_ context.Context, _ *mgmtProto.Empty) (*mgmtProto.ServerKeyResponse, error) {
|
|
// Return a response with a large WiretrusteeConfig to exceed the default limit.
|
|
padding := strings.Repeat("x", s.responseSize)
|
|
return &mgmtProto.ServerKeyResponse{
|
|
Key: padding,
|
|
}, nil
|
|
}
|
|
|
|
func TestMaxRecvMsgSizeIntegration(t *testing.T) {
|
|
const payloadSize = 5 * 1024 * 1024 // 5MB, exceeds 4MB default
|
|
|
|
lis, err := net.Listen("tcp", "127.0.0.1:0")
|
|
require.NoError(t, err)
|
|
|
|
srv := grpc.NewServer()
|
|
mgmtProto.RegisterManagementServiceServer(srv, &largeSyncServer{responseSize: payloadSize})
|
|
go func() { _ = srv.Serve(lis) }()
|
|
t.Cleanup(srv.Stop)
|
|
|
|
t.Run("default limit rejects large message", func(t *testing.T) {
|
|
conn, err := grpc.NewClient(
|
|
lis.Addr().String(),
|
|
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
|
)
|
|
require.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
client := mgmtProto.NewManagementServiceClient(conn)
|
|
_, err = client.GetServerKey(context.Background(), &mgmtProto.Empty{})
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "received message larger than max")
|
|
})
|
|
|
|
t.Run("increased limit accepts large message", func(t *testing.T) {
|
|
conn, err := grpc.NewClient(
|
|
lis.Addr().String(),
|
|
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
|
grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(10*1024*1024)),
|
|
)
|
|
require.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
client := mgmtProto.NewManagementServiceClient(conn)
|
|
resp, err := client.GetServerKey(context.Background(), &mgmtProto.Empty{})
|
|
require.NoError(t, err)
|
|
assert.Len(t, resp.Key, payloadSize)
|
|
})
|
|
}
|