mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Retry RST expectation in tcp_synrcvd_reset_test
Deflake this test by retransmitting the ACK and retrying RST expectation after the supposed state transition to CLOSED. This gives time for the state transition to complete. Without such a retransmit from the test, the ACK could get silently dropped by the listener when the passively connecting endpoint has not yet completely updated the state (in gVisor this would be endpoint state and decrement of synRcvdCount). PiperOrigin-RevId: 356825562
This commit is contained in:
@@ -42,10 +42,22 @@ func TestTCPSynRcvdReset(t *testing.T) {
|
||||
t.Fatalf("expected SYN-ACK %s", err)
|
||||
}
|
||||
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)})
|
||||
|
||||
// Expect the connection to have transitioned SYN-RCVD to CLOSED.
|
||||
// TODO(gvisor.dev/issue/478): Check for TCP_INFO on the dut side.
|
||||
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck)})
|
||||
if _, err := conn.ExpectData(t, &testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)}, nil, time.Second); err != nil {
|
||||
t.Fatalf("expected a TCP RST %s", err)
|
||||
//
|
||||
// Retransmit the ACK a few times to give time for the DUT to
|
||||
// transition to CLOSED. We cannot use TCP_INFO to lookup the state
|
||||
// as this is a passive DUT connection.
|
||||
i := 0
|
||||
for ; i < 5; i++ {
|
||||
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck)})
|
||||
if _, err := conn.ExpectData(t, &testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)}, nil, time.Second); err != nil {
|
||||
t.Logf("retransmit%d ACK as we did not get the expected RST, %s", i, err)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
if i == 5 {
|
||||
t.Fatalf("expected a TCP RST")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user