Skip to content

Commit 206dc65

Browse files
committed
test(backend, transport): cover TCP/UDP server handlers
1 parent 9e9d939 commit 206dc65

1 file changed

Lines changed: 110 additions & 0 deletions

File tree

backend/pkg/transport/transport_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,19 @@ func getAvailablePort(t testing.TB) string {
281281
return listener.Addr().String()
282282
}
283283

284+
func getAvailableUDPPort(t testing.TB) uint16 {
285+
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
286+
if err != nil {
287+
t.Fatalf("Failed to resolve UDP addr: %v", err)
288+
}
289+
conn, err := net.ListenUDP("udp", addr)
290+
if err != nil {
291+
t.Fatalf("Failed to listen UDP: %v", err)
292+
}
293+
defer conn.Close()
294+
return uint16(conn.LocalAddr().(*net.UDPAddr).Port)
295+
}
296+
284297
// waitForCondition waits for a condition to be true within a timeout
285298
func waitForCondition(condition func() bool, timeout time.Duration, message string) error {
286299
deadline := time.Now().Add(timeout)
@@ -884,6 +897,103 @@ func TestTransport_ReconnectionBehavior(t *testing.T) {
884897
}
885898
}
886899

900+
func TestHandleServer_AcceptsAndDispatches(t *testing.T) {
901+
tr, api := createTestTransport(t)
902+
target := abstraction.TransportTarget("SERVER_TARGET")
903+
tr.SetTargetIp("127.0.0.1", target)
904+
tr.SetIdTarget(100, target)
905+
906+
local := getAvailablePort(t)
907+
cfg := tcp.NewServerConfig()
908+
ctx, cancel := context.WithCancel(context.Background())
909+
cfg.Context = ctx
910+
defer cancel()
911+
912+
done := make(chan struct{})
913+
go func() {
914+
_ = tr.HandleServer(cfg, local)
915+
close(done)
916+
}()
917+
918+
var conn net.Conn
919+
var err error
920+
deadline := time.Now().Add(500 * time.Millisecond)
921+
for time.Now().Before(deadline) {
922+
conn, err = net.Dial("tcp", local)
923+
if err == nil {
924+
break
925+
}
926+
time.Sleep(20 * time.Millisecond)
927+
}
928+
if conn == nil {
929+
t.Fatalf("failed to dial server: %v", err)
930+
}
931+
defer conn.Close()
932+
933+
packet := data.NewPacket(100)
934+
packet.SetTimestamp(time.Unix(0, 0))
935+
buf, err := tr.encoder.Encode(packet)
936+
if err != nil {
937+
t.Fatalf("encode failed: %v", err)
938+
}
939+
defer tr.encoder.ReleaseBuffer(buf)
940+
941+
if _, err := conn.Write(buf.Bytes()); err != nil {
942+
t.Fatalf("failed to write packet: %v", err)
943+
}
944+
945+
if err := waitForCondition(func() bool {
946+
return len(api.GetNotifications()) > 0
947+
}, 2*time.Second, "Should receive notification from server connection"); err != nil {
948+
t.Fatal(err)
949+
}
950+
951+
cancel()
952+
select {
953+
case <-done:
954+
case <-time.After(500 * time.Millisecond):
955+
}
956+
}
957+
958+
func TestHandleUDPServer_Dispatches(t *testing.T) {
959+
tr, api := createTestTransport(t)
960+
tr.SetpropagateFault(false)
961+
962+
port := getAvailableUDPPort(t)
963+
logger := zerolog.Nop()
964+
server := udp.NewServer("127.0.0.1", port, &logger)
965+
if err := server.Start(); err != nil {
966+
t.Fatalf("failed to start UDP server: %v", err)
967+
}
968+
defer server.Stop()
969+
970+
go tr.HandleUDPServer(server)
971+
972+
packet := data.NewPacket(100)
973+
packet.SetTimestamp(time.Unix(0, 0))
974+
buf, err := tr.encoder.Encode(packet)
975+
if err != nil {
976+
t.Fatalf("encode failed: %v", err)
977+
}
978+
defer tr.encoder.ReleaseBuffer(buf)
979+
980+
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: int(port)})
981+
if err != nil {
982+
t.Fatalf("failed to dial UDP server: %v", err)
983+
}
984+
defer conn.Close()
985+
986+
if _, err := conn.Write(buf.Bytes()); err != nil {
987+
t.Fatalf("failed to send UDP packet: %v", err)
988+
}
989+
990+
if err := waitForCondition(func() bool {
991+
return len(api.GetNotifications()) > 0
992+
}, 2*time.Second, "Should receive notification from UDP server"); err != nil {
993+
t.Fatal(err)
994+
}
995+
}
996+
887997
// Helper function to mimic errors.As behavior
888998
func ErrorAs(err error, target interface{}) bool {
889999
switch target := target.(type) {

0 commit comments

Comments
 (0)