@@ -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
285298func 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
888998func ErrorAs (err error , target interface {}) bool {
889999 switch target := target .(type ) {
0 commit comments