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