Skip to content

Commit ba6168c

Browse files
authored
Use separate randomized port for each TCP test case. (#37144) (#38777)
Previously, all test cases in a single test run were using the same random port, and it caused some flakiness because sometimes the kernel could still be holding on to the previous test case port and, as a result, the next test case failed to bind throwing an "Address Already In Use" error.
1 parent 19aeeb3 commit ba6168c

File tree

1 file changed

+52
-41
lines changed

1 file changed

+52
-41
lines changed

src/transport/raw/tests/TestTCP.cpp

Lines changed: 52 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ namespace {
5353
constexpr size_t kMaxTcpActiveConnectionCount = 4;
5454
constexpr size_t kMaxTcpPendingPackets = 4;
5555
constexpr size_t kPacketSizeBytes = sizeof(uint32_t);
56-
uint16_t gChipTCPPort = static_cast<uint16_t>(CHIP_PORT + chip::Crypto::GetRandU16() % 100);
5756
chip::Transport::AppTCPConnectionCallbackCtxt gAppTCPConnCbCtxt;
5857
chip::Transport::ActiveTCPConnectionState * gActiveTCPConnState = nullptr;
5958

@@ -66,6 +65,11 @@ constexpr uint32_t kMessageCounter = 18;
6665

6766
const char PAYLOAD[] = "Hello!";
6867

68+
uint16_t GetRandomPort()
69+
{
70+
return static_cast<uint16_t>(CHIP_PORT + chip::Crypto::GetRandU16() % 100);
71+
}
72+
6973
class MockTransportMgrDelegate : public chip::TransportMgrDelegate
7074
{
7175
public:
@@ -134,11 +138,10 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
134138
}
135139
}
136140

137-
void InitializeMessageTest(TCPImpl & tcp, const IPAddress & addr)
141+
void InitializeMessageTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
138142
{
139-
CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(mIOContext->GetTCPEndPointManager())
140-
.SetAddressType(addr.Type())
141-
.SetListenPort(gChipTCPPort));
143+
CHIP_ERROR err = tcp.Init(
144+
Transport::TcpListenParameters(mIOContext->GetTCPEndPointManager()).SetAddressType(addr.Type()).SetListenPort(port));
142145

143146
// retry a few times in case the port is somehow in use.
144147
// this is a WORKAROUND for flaky testing if we run tests very fast after each other.
@@ -159,7 +162,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
159162
chip::test_utils::SleepMillis(100);
160163
err = tcp.Init(Transport::TcpListenParameters(mIOContext->GetTCPEndPointManager())
161164
.SetAddressType(addr.Type())
162-
.SetListenPort(gChipTCPPort));
165+
.SetListenPort(port));
163166
}
164167

165168
EXPECT_EQ(err, CHIP_NO_ERROR);
@@ -177,7 +180,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
177180
gAppTCPConnCbCtxt.connClosedCb = nullptr;
178181
}
179182

180-
void SingleMessageTest(TCPImpl & tcp, const IPAddress & addr)
183+
void SingleMessageTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
181184
{
182185
chip::System::PacketBufferHandle buffer = chip::System::PacketBufferHandle::NewWithData(PAYLOAD, sizeof(PAYLOAD));
183186
ASSERT_FALSE(buffer.IsNull());
@@ -192,7 +195,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
192195
EXPECT_EQ(err, CHIP_NO_ERROR);
193196

194197
// Should be able to send a message to itself by just calling send.
195-
err = tcp.SendMessage(Transport::PeerAddress::TCP(addr, gChipTCPPort), std::move(buffer));
198+
err = tcp.SendMessage(Transport::PeerAddress::TCP(addr, port), std::move(buffer));
196199
EXPECT_EQ(err, CHIP_NO_ERROR);
197200

198201
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mReceiveHandlerCallCount != 0; });
@@ -201,38 +204,38 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
201204
SetCallback(nullptr);
202205
}
203206

204-
void ConnectTest(TCPImpl & tcp, const IPAddress & addr)
207+
void ConnectTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
205208
{
206209
// Connect and wait for seeing active connection
207-
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
210+
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, port), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
208211
EXPECT_EQ(err, CHIP_NO_ERROR);
209212

210213
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return tcp.HasActiveConnections(); });
211214
EXPECT_EQ(tcp.HasActiveConnections(), true);
212215
}
213216

214-
void HandleConnectCompleteCbCalledTest(TCPImpl & tcp, const IPAddress & addr)
217+
void HandleConnectCompleteCbCalledTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
215218
{
216219
// Connect and wait for seeing active connection and connection complete
217220
// handler being called.
218-
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
221+
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, port), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
219222
EXPECT_EQ(err, CHIP_NO_ERROR);
220223

221224
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mHandleConnectionCompleteCalled; });
222225
EXPECT_EQ(mHandleConnectionCompleteCalled, true);
223226
}
224227

225-
void HandleConnectCloseCbCalledTest(TCPImpl & tcp, const IPAddress & addr)
228+
void HandleConnectCloseCbCalledTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
226229
{
227230
// Connect and wait for seeing active connection and connection complete
228231
// handler being called.
229-
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
232+
CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, port), &gAppTCPConnCbCtxt, &gActiveTCPConnState);
230233
EXPECT_EQ(err, CHIP_NO_ERROR);
231234

232235
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mHandleConnectionCompleteCalled; });
233236
EXPECT_EQ(mHandleConnectionCompleteCalled, true);
234237

235-
tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, gChipTCPPort));
238+
tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, port));
236239
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); });
237240
EXPECT_EQ(mHandleConnectionCloseCalled, true);
238241
}
@@ -245,10 +248,10 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate
245248
EXPECT_EQ(tcp.HasActiveConnections(), false);
246249
}
247250

248-
void DisconnectTest(TCPImpl & tcp, const IPAddress & addr)
251+
void DisconnectTest(TCPImpl & tcp, const IPAddress & addr, uint16_t port)
249252
{
250253
// Disconnect and wait for seeing peer close
251-
tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, gChipTCPPort));
254+
tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, port));
252255
mIOContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); });
253256
EXPECT_EQ(tcp.HasActiveConnections(), false);
254257
}
@@ -448,8 +451,9 @@ class TestTCP : public ::testing::Test
448451
{
449452
TCPImpl tcp;
450453

451-
CHIP_ERROR err = tcp.Init(
452-
Transport::TcpListenParameters(mIOContext->GetTCPEndPointManager()).SetAddressType(type).SetListenPort(gChipTCPPort));
454+
uint16_t port = GetRandomPort();
455+
CHIP_ERROR err =
456+
tcp.Init(Transport::TcpListenParameters(mIOContext->GetTCPEndPointManager()).SetAddressType(type).SetListenPort(port));
453457

454458
EXPECT_EQ(err, CHIP_NO_ERROR);
455459
}
@@ -459,51 +463,56 @@ class TestTCP : public ::testing::Test
459463
{
460464
TCPImpl tcp;
461465

466+
uint16_t port = GetRandomPort();
462467
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
463-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
464-
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr);
465-
gMockTransportMgrDelegate.DisconnectTest(tcp, addr);
468+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
469+
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr, port);
470+
gMockTransportMgrDelegate.DisconnectTest(tcp, addr, port);
466471
}
467472

468473
void ConnectToSelfTest(const IPAddress & addr)
469474
{
470475
TCPImpl tcp;
471476

477+
uint16_t port = GetRandomPort();
472478
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
473-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
474-
gMockTransportMgrDelegate.ConnectTest(tcp, addr);
475-
gMockTransportMgrDelegate.DisconnectTest(tcp, addr);
479+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
480+
gMockTransportMgrDelegate.ConnectTest(tcp, addr, port);
481+
gMockTransportMgrDelegate.DisconnectTest(tcp, addr, port);
476482
}
477483

478484
void ConnectSendMessageThenCloseTest(const IPAddress & addr)
479485
{
480486
TCPImpl tcp;
481487

488+
uint16_t port = GetRandomPort();
482489
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
483-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
484-
gMockTransportMgrDelegate.ConnectTest(tcp, addr);
485-
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr);
486-
gMockTransportMgrDelegate.DisconnectTest(tcp, addr);
490+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
491+
gMockTransportMgrDelegate.ConnectTest(tcp, addr, port);
492+
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr, port);
493+
gMockTransportMgrDelegate.DisconnectTest(tcp, addr, port);
487494
}
488495

489496
void HandleConnCompleteTest(const IPAddress & addr)
490497
{
491498
TCPImpl tcp;
492499

500+
uint16_t port = GetRandomPort();
493501
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
494-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
495-
gMockTransportMgrDelegate.HandleConnectCompleteCbCalledTest(tcp, addr);
496-
gMockTransportMgrDelegate.DisconnectTest(tcp, addr);
502+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
503+
gMockTransportMgrDelegate.HandleConnectCompleteCbCalledTest(tcp, addr, port);
504+
gMockTransportMgrDelegate.DisconnectTest(tcp, addr, port);
497505
}
498506

499507
void HandleConnCloseTest(const IPAddress & addr)
500508
{
501509
TCPImpl tcp;
502510

511+
uint16_t port = GetRandomPort();
503512
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
504-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
505-
gMockTransportMgrDelegate.HandleConnectCloseCbCalledTest(tcp, addr);
506-
gMockTransportMgrDelegate.DisconnectTest(tcp, addr);
513+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
514+
gMockTransportMgrDelegate.HandleConnectCloseCbCalledTest(tcp, addr, port);
515+
gMockTransportMgrDelegate.DisconnectTest(tcp, addr, port);
507516
}
508517

509518
// Callback used by CheckProcessReceivedBuffer.
@@ -616,11 +625,12 @@ TEST_F(TestTCP, CheckTCPEndpointAfterCloseTest)
616625
IPAddress addr;
617626
IPAddress::FromString("::1", addr);
618627

628+
uint16_t port = GetRandomPort();
619629
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
620-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
621-
gMockTransportMgrDelegate.ConnectTest(tcp, addr);
630+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
631+
gMockTransportMgrDelegate.ConnectTest(tcp, addr, port);
622632

623-
Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr, gChipTCPPort);
633+
Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr, port);
624634
void * state = TestAccess::FindActiveConnection(tcp, lPeerAddress);
625635
ASSERT_NE(state, nullptr);
626636
TCPEndPoint * lEndPoint = TestAccess::GetEndpoint(state);
@@ -639,14 +649,15 @@ TEST_F(TestTCP, CheckProcessReceivedBuffer)
639649
IPAddress addr;
640650
IPAddress::FromString("::1", addr);
641651

652+
uint16_t port = GetRandomPort();
642653
MockTransportMgrDelegate gMockTransportMgrDelegate(mIOContext);
643-
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr);
654+
gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr, port);
644655

645656
// Send a packet to get TCP going, so that we can find a TCPEndPoint to pass to ProcessReceivedBuffer.
646657
// (The current TCPEndPoint implementation is not effectively mockable.)
647-
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr);
658+
gMockTransportMgrDelegate.SingleMessageTest(tcp, addr, port);
648659

649-
Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr, gChipTCPPort);
660+
Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr, port);
650661
void * state = TestAccess::FindActiveConnection(tcp, lPeerAddress);
651662
ASSERT_NE(state, nullptr);
652663
TCPEndPoint * lEndPoint = TestAccess::GetEndpoint(state);

0 commit comments

Comments
 (0)