Skip to content

Commit 2f0f072

Browse files
committed
Increased the size of the payload in loopback tests.
In loopback tests, receving and sendings are not done in the same thread to avoid SSL_write() to hang in case of sending a big payload.
1 parent eac66a6 commit 2f0f072

File tree

1 file changed

+68
-54
lines changed

1 file changed

+68
-54
lines changed

SocketTest/Tests.cpp

Lines changed: 68 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -150,65 +150,62 @@ TEST_F(TCPTest, TestClient)
150150
}
151151
*/
152152

153-
TEST_F(TCPTest, TestLoopback)
153+
TEST_F(TCPTest, TestLoopbackTenMegaBytes)
154154
{
155155
if (TCP_TEST_ENABLED)
156156
{
157-
const std::string strSendData = "Hello World !";
158-
char szRcvBuffer[14] = {};
157+
srand(static_cast<unsigned>(time(nullptr)));
158+
159+
const size_t tenMeg = 10*1024*1024;
160+
std::vector<char> TenMbData(tenMeg);
161+
std::vector<char> RcvBuffer(tenMeg);
162+
std::generate (TenMbData.begin(), TenMbData.end(), []{ return (std::rand() % 256); });
163+
159164
ASocket::Socket ConnectedClient;
160165

161166
ASSERT_NO_THROW(m_pTCPServer.reset(new CTCPServer(PRINT_LOG, TCP_SERVER_PORT)));
162167

163-
#ifdef WINDOWS
164168
// Not always starts a new thread, std::launch::async must be passed to force it.
165169
std::future<bool> futListen = std::async(std::launch::async,
166170
[&] { return m_pTCPServer->Listen(ConnectedClient); });
167-
#else
168-
auto ListenTask = [&] { return m_pTCPServer->Listen(ConnectedClient); };
169-
std::packaged_task< bool(void) > packageListen { ListenTask };
170-
std::future<bool> futListen = packageListen.get_future();
171-
std::thread ListenThread { std::move(packageListen) }; // pack. task is not copyable
172-
#endif
173-
174-
// client side
175-
// send period between 50 and 999 ms
176-
srand(static_cast<unsigned>(time(nullptr)));
177-
unsigned iPeriod = 50 + (rand() % (999 - 50));
178171

179172
// give time to let the server object reach the accept instruction.
180173
SleepMs(500);
181174

182175
ASSERT_TRUE(m_pTCPClient->Connect("localhost", "6669"));
183-
#ifdef WINDOWS
184176
ASSERT_TRUE(futListen.get());
185-
#else
186-
/* with std::thread we can't easily get the result of Listen
187-
* unlike std::async/promise/packaged_task
188-
*/
189-
ASSERT_TRUE(futListen.get());
190-
ListenThread.join();
191-
#endif
177+
178+
auto ClientReceive = [&]() {
179+
return m_pTCPClient->Receive(RcvBuffer.data(), tenMeg);
180+
};
181+
182+
// launch the receive in another thread to prevent server from
183+
// hanging when sending "many" bytes.
184+
std::future<int> futClientReceive = std::async(std::launch::async, ClientReceive);
185+
192186
ASSERT_FALSE(ConnectedClient == INVALID_SOCKET);
193187

194-
// perform 3 checks
195-
unsigned uCount = 0;
196-
while (uCount++ < 3)
197-
{
198-
// server -> client
199-
EXPECT_TRUE(m_pTCPServer->Send(ConnectedClient, strSendData));
200-
EXPECT_GT(m_pTCPClient->Receive(szRcvBuffer, 13), 0);
201-
EXPECT_EQ(strSendData, szRcvBuffer);
202-
memset(szRcvBuffer, '\0', 14);
203-
204-
// client -> server
205-
EXPECT_TRUE(m_pTCPClient->Send(strSendData));
206-
EXPECT_GT(m_pTCPServer->Receive(ConnectedClient, szRcvBuffer, 13), 0);
207-
EXPECT_EQ(strSendData, szRcvBuffer);
208-
memset(szRcvBuffer, '\0', 14);
209-
210-
SleepMs(iPeriod);
211-
}
188+
// server -> client
189+
EXPECT_TRUE(m_pTCPServer->Send(ConnectedClient, TenMbData));
190+
191+
int nRcvdBytes = futClientReceive.get();
192+
193+
EXPECT_EQ(nRcvdBytes, tenMeg);
194+
EXPECT_TRUE(std::equal(TenMbData.begin(), TenMbData.end(), RcvBuffer.begin()));
195+
196+
std::fill(RcvBuffer.begin(), RcvBuffer.end(), 0);
197+
198+
// client -> server
199+
auto ServerReceive = [&]() {
200+
return m_pTCPServer->Receive(ConnectedClient, RcvBuffer.data(), tenMeg);
201+
};
202+
std::future<int> futServerReceive = std::async(std::launch::async, ServerReceive);
203+
204+
EXPECT_TRUE(m_pTCPClient->Send(TenMbData));
205+
nRcvdBytes = futServerReceive.get();
206+
207+
EXPECT_EQ(nRcvdBytes, tenMeg);
208+
EXPECT_TRUE(std::equal(TenMbData.begin(), TenMbData.end(), RcvBuffer.begin()));
212209

213210
// disconnect
214211
EXPECT_TRUE(m_pTCPClient->Disconnect());
@@ -328,16 +325,16 @@ TEST_F(SSLTCPTest, TestServer)
328325
}
329326
*/
330327

331-
TEST_F(SSLTCPTest, TestLoopback)
328+
TEST_F(SSLTCPTest, TestLoopbackTenMegabytes)
332329
{
333330
if (SECURE_TCP_TEST_ENABLED)
334331
{
335332
srand(static_cast<unsigned>(time(nullptr)));
336333

337-
const size_t oneMeg = 1024*1024;
338-
std::vector<char> OneMbData(oneMeg);
339-
std::vector<char> RcvBuffer(oneMeg);
340-
std::generate (OneMbData.begin(), OneMbData.end(), []{ return (std::rand() % 256); });
334+
const size_t tenMeg = 10*1024*1024;
335+
std::vector<char> TenMbData(tenMeg);
336+
std::vector<char> RcvBuffer(tenMeg);
337+
std::generate (TenMbData.begin(), TenMbData.end(), []{ return (std::rand() % 256); });
341338

342339
ASecureSocket::SSLSocket ConnectedClient;
343340

@@ -349,7 +346,7 @@ TEST_F(SSLTCPTest, TestLoopback)
349346

350347
#ifdef WINDOWS
351348
// Not always starts a new thread, std::launch::async must be passed to force it.
352-
std::future<bool> futListen = std::async(std::launch::async,
349+
std::future<bool> futConnect = std::async(std::launch::async,
353350
[&]() -> bool
354351
{
355352
// give time to let the server object reach the accept instruction.
@@ -382,30 +379,47 @@ TEST_F(SSLTCPTest, TestLoopback)
382379
m_pSSLTCPServer->Listen(ConnectedClient);
383380

384381
#ifdef WINDOWS
385-
ASSERT_TRUE(futListen.get());
382+
ASSERT_TRUE(futConnect.get());
386383
#else
387384
/* with std::thread we can't easily get the result of Listen
388385
* contrary to std::async/promise/packaged_task
389386
*/
390387
ASSERT_TRUE(futConnect.get());
391388
ConnectThread.join();
392389
#endif
390+
auto ClientReceive = [&]() {
391+
return m_pSSLTCPClient->Receive(RcvBuffer.data(), tenMeg);
392+
};
393+
394+
// launch the receive in another thread to prevent server from
395+
// hanging when sending "many" bytes.
396+
std::future<int> futClientReceive = std::async(std::launch::async, ClientReceive);
393397

394398
ASSERT_FALSE(ConnectedClient.m_pSSL == nullptr);
395399
ASSERT_FALSE(ConnectedClient.m_pCTXSSL == nullptr);
396400
ASSERT_FALSE(ConnectedClient.m_SockFd == INVALID_SOCKET);
397401

398402
// server -> client
399-
EXPECT_TRUE(m_pSSLTCPServer->Send(ConnectedClient, OneMbData));
400-
EXPECT_GT(m_pSSLTCPClient->Receive(RcvBuffer.data(), oneMeg), 0);
401-
EXPECT_TRUE(std::equal(OneMbData.begin(), OneMbData.end(), RcvBuffer.begin()));
403+
EXPECT_TRUE(m_pSSLTCPServer->Send(ConnectedClient, TenMbData));
404+
405+
int nRcvdBytes = futClientReceive.get();
406+
407+
EXPECT_EQ(nRcvdBytes, tenMeg);
408+
EXPECT_TRUE(std::equal(TenMbData.begin(), TenMbData.end(), RcvBuffer.begin()));
402409

403410
std::fill(RcvBuffer.begin(), RcvBuffer.end(), 0);
404411

405412
// client -> server
406-
EXPECT_TRUE(m_pSSLTCPClient->Send(OneMbData));
407-
EXPECT_GT(m_pSSLTCPServer->Receive(ConnectedClient, RcvBuffer.data(), oneMeg), 0);
408-
EXPECT_TRUE(std::equal(OneMbData.begin(), OneMbData.end(), RcvBuffer.begin()));
413+
auto ServerReceive = [&]() {
414+
return m_pSSLTCPServer->Receive(ConnectedClient, RcvBuffer.data(), tenMeg);
415+
};
416+
std::future<int> futServerReceive = std::async(std::launch::async, ServerReceive);
417+
418+
EXPECT_TRUE(m_pSSLTCPClient->Send(TenMbData));
419+
nRcvdBytes = futServerReceive.get();
420+
421+
EXPECT_EQ(nRcvdBytes, tenMeg);
422+
EXPECT_TRUE(std::equal(TenMbData.begin(), TenMbData.end(), RcvBuffer.begin()));
409423

410424
// disconnect
411425
EXPECT_TRUE(m_pSSLTCPClient->Disconnect());

0 commit comments

Comments
 (0)