Skip to content

Commit b1de2a7

Browse files
committed
TUN-6876: Fix flaky TestTraceICMPRouterEcho by taking account request span can return before reply
1 parent 4d32a64 commit b1de2a7

File tree

2 files changed

+34
-48
lines changed

2 files changed

+34
-48
lines changed

ingress/icmp_posix_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,21 @@ func TestFunnelIdleTimeout(t *testing.T) {
5757
datagramMuxer: muxer,
5858
}
5959
require.NoError(t, proxy.Request(ctx, &pk, &responder))
60-
validateEchoFlow(t, muxer, &pk)
60+
validateEchoFlow(t, <-muxer.cfdToEdge, &pk)
6161

6262
// Send second request, should reuse the funnel
6363
require.NoError(t, proxy.Request(ctx, &pk, &packetResponder{
6464
datagramMuxer: nil,
6565
}))
66-
validateEchoFlow(t, muxer, &pk)
66+
validateEchoFlow(t, <-muxer.cfdToEdge, &pk)
6767

6868
time.Sleep(idleTimeout * 2)
6969
newMuxer := newMockMuxer(0)
7070
newResponder := packetResponder{
7171
datagramMuxer: newMuxer,
7272
}
7373
require.NoError(t, proxy.Request(ctx, &pk, &newResponder))
74-
validateEchoFlow(t, newMuxer, &pk)
74+
validateEchoFlow(t, <-newMuxer.cfdToEdge, &pk)
7575

7676
cancel()
7777
<-proxyDone

ingress/origin_icmp_proxy_test.go

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
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

Comments
 (0)