summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMithun Iyer <iyerm@google.com>2021-02-10 14:20:18 -0800
committergVisor bot <gvisor-bot@google.com>2021-02-10 14:22:16 -0800
commit380ede9b73822a7d373653f20b4f74ef1695ad24 (patch)
tree68494cfe429e8f7afbbbd0b60928cc1ccbb7bc23
parentc2f204658ed4a6b0bd110577f22fbfd4104a6f96 (diff)
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
-rw-r--r--test/packetimpact/tests/tcp_synrcvd_reset_test.go20
1 files changed, 16 insertions, 4 deletions
diff --git a/test/packetimpact/tests/tcp_synrcvd_reset_test.go b/test/packetimpact/tests/tcp_synrcvd_reset_test.go
index c5bbd29ee..4ab9509ec 100644
--- a/test/packetimpact/tests/tcp_synrcvd_reset_test.go
+++ b/test/packetimpact/tests/tcp_synrcvd_reset_test.go
@@ -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")
}
}