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+ std::lock_guard<std::mutex> lk (g_connection_mutex);
53+ g_connection_condition.notify_one ();
54+ }
55+
56+ virtual void disconnectionCallback (const socket_t filedescriptor)
57+ {
58+ URCL_LOG_DEBUG (" There are %zu disconnection callbacks registered." , disconnect_callbacks_.size ());
59+ control::ReverseInterface::disconnectionCallback (filedescriptor);
60+ connected = false ;
61+ std::lock_guard<std::mutex> lk (g_connection_mutex);
62+ g_connection_condition.notify_one ();
63+ }
64+
65+ std::atomic<bool > connected = false ;
66+ };
3767
3868class ReverseIntefaceTest : public ::testing::Test
3969{
@@ -153,8 +183,11 @@ class ReverseIntefaceTest : public ::testing::Test
153183 control::ReverseInterfaceConfig config;
154184 config.port = 50001 ;
155185 config.handle_program_state = std::bind (&ReverseIntefaceTest::handleProgramState, this , std::placeholders::_1);
156- reverse_interface_.reset (new control::ReverseInterface (config));
186+ reverse_interface_.reset (new TestableReverseInterface (config));
157187 client_.reset (new Client (50001 ));
188+ std::unique_lock<std::mutex> lk (g_connection_mutex);
189+ g_connection_condition.wait_for (lk, std::chrono::seconds (1 ),
190+ [&]() { return reverse_interface_->connected .load (); });
158191 }
159192
160193 void TearDown ()
@@ -187,7 +220,7 @@ class ReverseIntefaceTest : public ::testing::Test
187220 return false ;
188221 }
189222
190- std::unique_ptr<control::ReverseInterface > reverse_interface_;
223+ std::unique_ptr<TestableReverseInterface > reverse_interface_;
191224 std::unique_ptr<Client> client_;
192225
193226private:
@@ -473,7 +506,8 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
473506 // Close the client connection
474507 client_->close ();
475508 EXPECT_TRUE (waitForProgramState (1000 , false ));
476- sleep (1 );
509+ std::unique_lock<std::mutex> lk (g_connection_mutex);
510+ g_connection_condition.wait_for (lk, std::chrono::seconds (1 ), [&]() { return !reverse_interface_->connected .load (); });
477511 EXPECT_TRUE (disconnect_called_1);
478512 EXPECT_TRUE (disconnect_called_2);
479513
@@ -484,7 +518,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
484518 EXPECT_TRUE (waitForProgramState (1000 , true ));
485519 reverse_interface_->unregisterDisconnectionCallback (disconnection_callback_id_1);
486520 client_->close ();
487- sleep ( 1 );
521+ g_connection_condition. wait_for (lk, std::chrono::seconds ( 1 ), [&]() { return !reverse_interface_-> connected . load (); } );
488522 EXPECT_TRUE (waitForProgramState (1000 , false ));
489523 EXPECT_FALSE (disconnect_called_1);
490524 EXPECT_TRUE (disconnect_called_2);
@@ -496,7 +530,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
496530 EXPECT_TRUE (waitForProgramState (1000 , true ));
497531 reverse_interface_->unregisterDisconnectionCallback (disconnection_callback_id_2);
498532 client_->close ();
499- sleep ( 1 );
533+ g_connection_condition. wait_for (lk, std::chrono::seconds ( 1 ), [&]() { return !reverse_interface_-> connected . load (); } );
500534 EXPECT_TRUE (waitForProgramState (1000 , false ));
501535 EXPECT_FALSE (disconnect_called_1);
502536 EXPECT_FALSE (disconnect_called_2);
@@ -505,6 +539,7 @@ TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
505539int main (int argc, char * argv[])
506540{
507541 ::testing::InitGoogleTest (&argc, argv);
542+ urcl::setLogLevel (LogLevel::INFO );
508543
509544 return RUN_ALL_TESTS ();
510- }
545+ }
0 commit comments