Skip to content

Commit f2f9056

Browse files
committed
Add tests for reverse interface callback lists
1 parent 6c401cc commit f2f9056

File tree

5 files changed

+107
-4
lines changed

5 files changed

+107
-4
lines changed

include/ur_client_library/ur/instruction_executor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class InstructionExecutor
187187
return trajectory_running_;
188188
}
189189

190-
private:
190+
protected:
191191
void trajDoneCallback(const urcl::control::TrajectoryResult& result);
192192
void trajDisconnectCallback(const int filedescriptor);
193193

src/control/reverse_interface.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,13 @@ void ReverseInterface::disconnectionCallback(const socket_t filedescriptor)
238238
URCL_LOG_INFO("Connection to reverse interface dropped.", filedescriptor);
239239
client_fd_ = INVALID_SOCKET;
240240
handle_program_state_(false);
241+
if (!disconnect_callbacks_.empty())
242+
{
243+
for (auto handler : disconnect_callbacks_)
244+
{
245+
handler.function(filedescriptor);
246+
}
247+
}
241248
}
242249

243250
void ReverseInterface::messageCallback(const socket_t filedescriptor, char* buffer, int nbytesrecv)

src/control/trajectory_point_interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ void TrajectoryPointInterface::connectionCallback(const socket_t filedescriptor)
275275
void TrajectoryPointInterface::disconnectionCallback(const socket_t filedescriptor)
276276
{
277277
URCL_LOG_DEBUG("Connection to trajectory interface dropped.");
278-
if (!trajectory_end_callbacks_.empty())
278+
if (!disconnect_callbacks_.empty())
279279
{
280280
for (auto handler : disconnect_callbacks_)
281281
{

tests/test_reverse_interface.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,61 @@ TEST_F(ReverseIntefaceTest, deprecated_set_keep_alive_count)
450450
EXPECT_EQ(expected_read_timeout, received_read_timeout);
451451
}
452452

453+
TEST_F(ReverseIntefaceTest, disconnected_callbacks_are_called)
454+
{
455+
// Wait for the client to connect to the server
456+
EXPECT_TRUE(waitForProgramState(1000, true));
457+
458+
std::atomic<bool> disconnect_called_1 = false;
459+
std::atomic<bool> disconnect_called_2 = false;
460+
461+
// Register disconnection callbacks
462+
int disconnection_callback_id_1 =
463+
reverse_interface_->registerDisconnectionCallback([&disconnect_called_1](const int fd) {
464+
std::cout << "Disconnection 1 callback called with fd: " << fd << std::endl;
465+
disconnect_called_1 = true;
466+
});
467+
int disconnection_callback_id_2 =
468+
reverse_interface_->registerDisconnectionCallback([&disconnect_called_2](const int fd) {
469+
std::cout << "Disconnection 2 callback called with fd: " << fd << std::endl;
470+
disconnect_called_2 = true;
471+
});
472+
473+
// Close the client connection
474+
client_->close();
475+
EXPECT_TRUE(waitForProgramState(1000, false));
476+
sleep(1);
477+
EXPECT_TRUE(disconnect_called_1);
478+
EXPECT_TRUE(disconnect_called_2);
479+
480+
// Unregister 1. 2 should still be called
481+
disconnect_called_1 = false;
482+
disconnect_called_2 = false;
483+
client_.reset(new Client(50001));
484+
EXPECT_TRUE(waitForProgramState(1000, true));
485+
reverse_interface_->unregisterDisconnectionCallback(disconnection_callback_id_1);
486+
client_->close();
487+
sleep(1);
488+
EXPECT_TRUE(waitForProgramState(1000, false));
489+
EXPECT_FALSE(disconnect_called_1);
490+
EXPECT_TRUE(disconnect_called_2);
491+
492+
// Unregister both. None should be called
493+
disconnect_called_1 = false;
494+
disconnect_called_2 = false;
495+
client_.reset(new Client(50001));
496+
EXPECT_TRUE(waitForProgramState(1000, true));
497+
reverse_interface_->unregisterDisconnectionCallback(disconnection_callback_id_2);
498+
client_->close();
499+
sleep(1);
500+
EXPECT_TRUE(waitForProgramState(1000, false));
501+
EXPECT_FALSE(disconnect_called_1);
502+
EXPECT_FALSE(disconnect_called_2);
503+
}
504+
453505
int main(int argc, char* argv[])
454506
{
455507
::testing::InitGoogleTest(&argc, argv);
456508

457509
return RUN_ALL_TESTS();
458-
}
510+
}

tests/test_trajectory_point_interface.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,9 +599,53 @@ TEST_F(TrajectoryPointInterfaceTest, unsupported_motion_type_throws)
599599
EXPECT_THROW(traj_point_interface_->writeMotionPrimitive(primitive), urcl::UnsupportedMotionType);
600600
}
601601

602+
TEST_F(TrajectoryPointInterfaceTest, disconnected_callbacks_are_called_correctly)
603+
{
604+
std::atomic<bool> disconnect_called_1 = false;
605+
std::atomic<bool> disconnect_called_2 = false;
606+
607+
// Register disconnection callbacks
608+
int disconnection_callback_id_1 =
609+
traj_point_interface_->registerDisconnectionCallback([&disconnect_called_1](const int fd) {
610+
std::cout << "Disconnection 1 callback called with fd: " << fd << std::endl;
611+
disconnect_called_1 = true;
612+
});
613+
int disconnection_callback_id_2 =
614+
traj_point_interface_->registerDisconnectionCallback([&disconnect_called_2](const int fd) {
615+
std::cout << "Disconnection 2 callback called with fd: " << fd << std::endl;
616+
disconnect_called_2 = true;
617+
});
618+
619+
// Close the client connection
620+
client_->close();
621+
sleep(1);
622+
EXPECT_TRUE(disconnect_called_1);
623+
EXPECT_TRUE(disconnect_called_2);
624+
625+
// Unregister 1. 2 should still be called
626+
disconnect_called_1 = false;
627+
disconnect_called_2 = false;
628+
client_.reset(new Client(50003));
629+
traj_point_interface_->unregisterDisconnectionCallback(disconnection_callback_id_1);
630+
client_->close();
631+
sleep(1);
632+
EXPECT_FALSE(disconnect_called_1);
633+
EXPECT_TRUE(disconnect_called_2);
634+
635+
// Unregister both. None should be called
636+
disconnect_called_1 = false;
637+
disconnect_called_2 = false;
638+
client_.reset(new Client(50003));
639+
traj_point_interface_->unregisterDisconnectionCallback(disconnection_callback_id_2);
640+
client_->close();
641+
sleep(1);
642+
EXPECT_FALSE(disconnect_called_1);
643+
EXPECT_FALSE(disconnect_called_2);
644+
}
645+
602646
int main(int argc, char* argv[])
603647
{
604648
::testing::InitGoogleTest(&argc, argv);
605649

606650
return RUN_ALL_TESTS();
607-
}
651+
}

0 commit comments

Comments
 (0)