Files
netbird/signal/loadtest/loadtest_test.go
Maycon Santos 6d26c9d1ba add loadtest
2025-10-09 22:57:05 +02:00

92 lines
2.4 KiB
Go

package loadtest
import (
"context"
"fmt"
"net"
"testing"
"time"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel"
"google.golang.org/grpc"
"github.com/netbirdio/netbird/shared/signal/proto"
"github.com/netbirdio/netbird/signal/server"
)
func TestSignalLoadTest_SinglePair(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
grpcServer, serverAddr := startTestSignalServer(t, ctx)
defer grpcServer.Stop()
sender, err := NewClient(serverAddr, "sender-peer-id")
require.NoError(t, err)
defer sender.Close()
receiver, err := NewClient(serverAddr, "receiver-peer-id")
require.NoError(t, err)
defer receiver.Close()
err = sender.Connect()
require.NoError(t, err, "Sender should connect successfully")
err = receiver.Connect()
require.NoError(t, err, "Receiver should connect successfully")
time.Sleep(100 * time.Millisecond)
testMessage := []byte("test message payload")
t.Log("Sending message from sender to receiver")
err = sender.SendMessage("receiver-peer-id", testMessage)
require.NoError(t, err, "Sender should send message successfully")
t.Log("Waiting for receiver to receive message")
receiveDone := make(chan struct{})
var msg *proto.EncryptedMessage
var receiveErr error
go func() {
msg, receiveErr = receiver.ReceiveMessage()
close(receiveDone)
}()
select {
case <-receiveDone:
require.NoError(t, receiveErr, "Receiver should receive message")
require.NotNil(t, msg, "Received message should not be nil")
require.Greater(t, len(msg.Body), 0, "Encrypted message body size should be greater than 0")
require.Equal(t, "sender-peer-id", msg.Key)
require.Equal(t, "receiver-peer-id", msg.RemoteKey)
t.Log("Message received successfully")
case <-time.After(5 * time.Second):
t.Fatal("Timeout waiting for message")
}
}
func startTestSignalServer(t *testing.T, ctx context.Context) (*grpc.Server, string) {
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
grpcServer := grpc.NewServer()
signalServer, err := server.NewServer(ctx, otel.Meter("test"))
require.NoError(t, err)
proto.RegisterSignalExchangeServer(grpcServer, signalServer)
go func() {
if err := grpcServer.Serve(listener); err != nil {
t.Logf("Server stopped: %v", err)
}
}()
time.Sleep(100 * time.Millisecond)
return grpcServer, fmt.Sprintf("http://%s", listener.Addr().String())
}