3232#include  < ur_client_library/control/reverse_interface.h> 
3333#include  < ur_client_library/comm/tcp_socket.h> 
3434#include  < ur_client_library/exceptions.h> 
35+ #include  " ur_client_library/log.h" 
3536
3637using  namespace  urcl ; 
38+ std::mutex g_connection_mutex;
39+ std::condition_variable g_connection_condition;
40+ 
41+ class  TestableReverseInterface  : public  control ::ReverseInterface
42+ {
43+ public: 
44+   TestableReverseInterface (const  control::ReverseInterfaceConfig& config) : control::ReverseInterface(config)
45+   {
46+   }
47+ 
48+   virtual  void  connectionCallback (const  socket_t  filedescriptor)
49+   {
50+     control::ReverseInterface::connectionCallback (filedescriptor);
51+     connected = true ;
52+   }
53+ 
54+   virtual  void  disconnectionCallback (const  socket_t  filedescriptor)
55+   {
56+     URCL_LOG_DEBUG (" There are %zu disconnection callbacks registered."  , disconnect_callbacks_.size ());
57+     control::ReverseInterface::disconnectionCallback (filedescriptor);
58+     connected = false ;
59+     std::lock_guard<std::mutex> lk (g_connection_mutex);
60+     g_connection_condition.notify_one ();
61+   }
62+ 
63+   std::atomic<bool > connected = false ;
64+ };
3765
3866class  ReverseIntefaceTest  : public ::testing::Test
3967{
@@ -153,7 +181,7 @@ class ReverseIntefaceTest : public ::testing::Test
153181    control::ReverseInterfaceConfig config;
154182    config.port  = 50001 ;
155183    config.handle_program_state  = std::bind (&ReverseIntefaceTest::handleProgramState, this , std::placeholders::_1);
156-     reverse_interface_.reset (new  control::ReverseInterface (config));
184+     reverse_interface_.reset (new  TestableReverseInterface (config));
157185    client_.reset (new  Client (50001 ));
158186  }
159187
@@ -187,7 +215,7 @@ class ReverseIntefaceTest : public ::testing::Test
187215    return  false ;
188216  }
189217
190-   std::unique_ptr<control::ReverseInterface > reverse_interface_;
218+   std::unique_ptr<TestableReverseInterface > reverse_interface_;
191219  std::unique_ptr<Client> client_;
192220
193221private: 
@@ -473,7 +501,8 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
473501  //  Close the client connection
474502  client_->close ();
475503  EXPECT_TRUE (waitForProgramState (1000 , false ));
476-   sleep (1 );
504+   std::unique_lock<std::mutex> lk (g_connection_mutex);
505+   g_connection_condition.wait_for (lk, std::chrono::seconds (1 ), [&]() { return  !reverse_interface_->connected .load (); });
477506  EXPECT_TRUE (disconnect_called_1);
478507  EXPECT_TRUE (disconnect_called_2);
479508
@@ -484,7 +513,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
484513  EXPECT_TRUE (waitForProgramState (1000 , true ));
485514  reverse_interface_->unregisterDisconnectionCallback (disconnection_callback_id_1);
486515  client_->close ();
487-   sleep ( 1 );
516+   g_connection_condition. wait_for (lk,  std::chrono::seconds ( 1 ), [&]() {  return  !reverse_interface_-> connected . load (); } );
488517  EXPECT_TRUE (waitForProgramState (1000 , false ));
489518  EXPECT_FALSE (disconnect_called_1);
490519  EXPECT_TRUE (disconnect_called_2);
@@ -496,7 +525,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
496525  EXPECT_TRUE (waitForProgramState (1000 , true ));
497526  reverse_interface_->unregisterDisconnectionCallback (disconnection_callback_id_2);
498527  client_->close ();
499-   sleep ( 1 );
528+   g_connection_condition. wait_for (lk,  std::chrono::seconds ( 1 ), [&]() {  return  !reverse_interface_-> connected . load (); } );
500529  EXPECT_TRUE (waitForProgramState (1000 , false ));
501530  EXPECT_FALSE (disconnect_called_1);
502531  EXPECT_FALSE (disconnect_called_2);
@@ -505,6 +534,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
505534int  main (int  argc, char * argv[])
506535{
507536  ::testing::InitGoogleTest (&argc, argv);
537+   urcl::setLogLevel (LogLevel::INFO);
508538
509539  return  RUN_ALL_TESTS ();
510- }
540+ }
0 commit comments