@@ -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