66 "fmt"
77 "net"
88 "net/netip"
9- "runtime"
109 "strings"
1110 "sync"
1211 "testing"
@@ -95,7 +94,7 @@ func testICMPRouterEcho(t *testing.T, sendIPv4 bool) {
9594 },
9695 }
9796 require .NoError (t , router .Request (ctx , & pk , & responder ))
98- validateEchoFlow (t , muxer , & pk )
97+ validateEchoFlow (t , <- muxer . cfdToEdge , & pk )
9998 }
10099 }
101100 cancel ()
@@ -148,25 +147,35 @@ func TestTraceICMPRouterEcho(t *testing.T) {
148147 }
149148
150149 require .NoError (t , router .Request (ctx , & pk , & responder ))
151- // On Windows, request span is returned before reply
152- if runtime .GOOS != "windows" {
153- validateEchoFlow (t , muxer , & pk )
150+ firstPK := <- muxer .cfdToEdge
151+ var requestSpan * quicpogs.TracingSpanPacket
152+ // The order of receiving reply or request span is not deterministic
153+ switch firstPK .Type () {
154+ case quicpogs .DatagramTypeIP :
155+ // reply packet
156+ validateEchoFlow (t , firstPK , & pk )
157+ case quicpogs .DatagramTypeTracingSpan :
158+ // Request span
159+ requestSpan = firstPK .(* quicpogs.TracingSpanPacket )
160+ require .NotEmpty (t , requestSpan .Spans )
161+ require .True (t , bytes .Equal (serializedIdentity , requestSpan .TracingIdentity ))
162+ default :
163+ panic (fmt .Sprintf ("received unexpected packet type %d" , firstPK .Type ()))
154164 }
155165
156- // Request span
157- receivedPacket := <- muxer .cfdToEdge
158- requestSpan , ok := receivedPacket .(* quicpogs.TracingSpanPacket )
159- require .True (t , ok )
160- require .NotEmpty (t , requestSpan .Spans )
161- require .True (t , bytes .Equal (serializedIdentity , requestSpan .TracingIdentity ))
162-
163- if runtime .GOOS == "windows" {
164- validateEchoFlow (t , muxer , & pk )
166+ secondPK := <- muxer .cfdToEdge
167+ if requestSpan != nil {
168+ // If first packet is request span, second packet should be the reply
169+ validateEchoFlow (t , secondPK , & pk )
170+ } else {
171+ requestSpan = secondPK .(* quicpogs.TracingSpanPacket )
172+ require .NotEmpty (t , requestSpan .Spans )
173+ require .True (t , bytes .Equal (serializedIdentity , requestSpan .TracingIdentity ))
165174 }
166175
167176 // Reply span
168- receivedPacket = <- muxer .cfdToEdge
169- replySpan , ok := receivedPacket .(* quicpogs.TracingSpanPacket )
177+ thirdPacket : = <- muxer .cfdToEdge
178+ replySpan , ok := thirdPacket .(* quicpogs.TracingSpanPacket )
170179 require .True (t , ok )
171180 require .NotEmpty (t , replySpan .Spans )
172181 require .True (t , bytes .Equal (serializedIdentity , replySpan .TracingIdentity ))
@@ -179,10 +188,10 @@ func TestTraceICMPRouterEcho(t *testing.T) {
179188 datagramMuxer : muxer ,
180189 }
181190 require .NoError (t , router .Request (ctx , & pk , & newResponder ))
182- validateEchoFlow (t , muxer , & pk )
191+ validateEchoFlow (t , <- muxer . cfdToEdge , & pk )
183192
184193 select {
185- case receivedPacket = <- muxer .cfdToEdge :
194+ case receivedPacket : = <- muxer .cfdToEdge :
186195 panic (fmt .Sprintf ("Receive unexpected packet %+v" , receivedPacket ))
187196 default :
188197 }
@@ -240,7 +249,7 @@ func TestConcurrentRequestsToSameDst(t *testing.T) {
240249 },
241250 }
242251 require .NoError (t , router .Request (ctx , pk , & responder ))
243- validateEchoFlow (t , muxer , pk )
252+ validateEchoFlow (t , <- muxer . cfdToEdge , pk )
244253 }
245254 }()
246255 go func () {
@@ -268,7 +277,7 @@ func TestConcurrentRequestsToSameDst(t *testing.T) {
268277 },
269278 }
270279 require .NoError (t , router .Request (ctx , pk , & responder ))
271- validateEchoFlow (t , muxer , pk )
280+ validateEchoFlow (t , <- muxer . cfdToEdge , pk )
272281 }
273282 }()
274283 }
@@ -357,33 +366,10 @@ func testICMPRouterRejectNotEcho(t *testing.T, srcDstIP netip.Addr, msgs []icmp.
357366 }
358367}
359368
360- type echoFlowResponder struct {
361- lock sync.Mutex
362- decoder * packet.ICMPDecoder
363- respChan chan []byte
364- }
365-
366- func (efr * echoFlowResponder ) SendPacket (dst netip.Addr , pk packet.RawPacket ) error {
367- efr .lock .Lock ()
368- defer efr .lock .Unlock ()
369- copiedPacket := make ([]byte , len (pk .Data ))
370- copy (copiedPacket , pk .Data )
371- efr .respChan <- copiedPacket
372- return nil
373- }
374-
375- func (efr * echoFlowResponder ) Close () error {
376- efr .lock .Lock ()
377- defer efr .lock .Unlock ()
378- close (efr .respChan )
379- return nil
380- }
381-
382- func validateEchoFlow (t * testing.T , muxer * mockMuxer , echoReq * packet.ICMP ) {
383- pk := <- muxer .cfdToEdge
369+ func validateEchoFlow (t * testing.T , pk quicpogs.Packet , echoReq * packet.ICMP ) {
384370 decoder := packet .NewICMPDecoder ()
385371 decoded , err := decoder .Decode (packet.RawPacket {Data : pk .Payload ()})
386- require .NoError (t , err )
372+ require .NoError (t , err , pk )
387373 require .Equal (t , decoded .Src , echoReq .Dst )
388374 require .Equal (t , decoded .Dst , echoReq .Src )
389375 require .Equal (t , echoReq .Protocol , decoded .Protocol )
0 commit comments