@@ -131,6 +131,11 @@ class CollisionMonitorWrapper : public nav2_collision_monitor::CollisionMonitor
131131    }
132132    return  false ;
133133  }
134+ 
135+   bool  isEnabled () const 
136+   {
137+     return  enabled_;
138+   }
134139};  //  CollisionMonitorWrapper
135140
136141class  Tester  : public ::testing::Test
@@ -180,6 +185,9 @@ class Tester : public ::testing::Test
180185    const  std::chrono::nanoseconds & timeout);
181186  bool  waitActionState (const  std::chrono::nanoseconds & timeout);
182187  bool  waitCollisionPointsMarker (const  std::chrono::nanoseconds & timeout);
188+   bool  waitToggle (
189+     rclcpp::Client<nav2_msgs::srv::Toggle>::SharedFuture result_future,
190+     const  std::chrono::nanoseconds & timeout);
183191
184192protected: 
185193  void  cmdVelOutCallback (geometry_msgs::msg::Twist::SharedPtr msg);
@@ -215,6 +223,9 @@ class Tester : public ::testing::Test
215223
216224  //  Service client for setting CollisionMonitor parameters
217225  rclcpp::Client<rcl_interfaces::srv::SetParameters>::SharedPtr parameters_client_;
226+ 
227+   //  Service client for toggling collision monitor
228+   rclcpp::Client<nav2_msgs::srv::Toggle>::SharedPtr toggle_client_;
218229};  //  Tester
219230
220231Tester::Tester ()
@@ -249,6 +260,8 @@ Tester::Tester()
249260    cm_->create_client <rcl_interfaces::srv::SetParameters>(
250261    std::string (
251262      cm_->get_name ()) + " /set_parameters" 
263+ 
264+   toggle_client_ = cm_->create_client <nav2_msgs::srv::Toggle>(" ~/toggle" 
252265}
253266
254267Tester::~Tester ()
@@ -745,6 +758,22 @@ bool Tester::waitFuture(
745758  return  false ;
746759}
747760
761+ bool  Tester::waitToggle (
762+   rclcpp::Client<nav2_msgs::srv::Toggle>::SharedFuture result_future,
763+   const  std::chrono::nanoseconds & timeout)
764+ {
765+   rclcpp::Time start_time = cm_->now ();
766+   while  (rclcpp::ok () && cm_->now () - start_time <= rclcpp::Duration (timeout)) {
767+     std::future_status status = result_future.wait_for (10ms);
768+     if  (status == std::future_status::ready) {
769+       return  true ;
770+     }
771+     rclcpp::spin_some (cm_->get_node_base_interface ());
772+     std::this_thread::sleep_for (10ms);
773+   }
774+   return  false ;
775+ }
776+ 
748777bool  Tester::waitActionState (const  std::chrono::nanoseconds & timeout)
749778{
750779  rclcpp::Time start_time = cm_->now ();
@@ -786,6 +815,39 @@ void Tester::collisionPointsMarkerCallback(visualization_msgs::msg::MarkerArray:
786815  collision_points_marker_msg_ = msg;
787816}
788817
818+ TEST_F (Tester, testToggleService)
819+ {
820+   //  Set parameters for collision monitor
821+   setCommonParameters ();
822+   addPolygon (" Stop" 1.0 , " stop" 
823+   addSource (SCAN_NAME, SCAN);
824+   setVectors ({" Stop" 
825+ 
826+   //  Start collision monitor node
827+   cm_->start ();
828+ 
829+   auto  request = std::make_shared<nav2_msgs::srv::Toggle::Request>();
830+ 
831+   //  Disable test
832+   request->enable  = false ;
833+   {
834+     auto  result_future = toggle_client_->async_send_request (request);
835+     ASSERT_TRUE (waitToggle (result_future.share (), 2s));
836+   }
837+   ASSERT_FALSE (cm_->isEnabled ());
838+ 
839+   //  Enable test
840+   request->enable  = true ;
841+   {
842+     auto  result_future = toggle_client_->async_send_request (request);
843+     ASSERT_TRUE (waitToggle (result_future.share (), 2s));
844+   }
845+   ASSERT_TRUE (cm_->isEnabled ());
846+ 
847+   //  Stop the collision monitor
848+   cm_->stop ();
849+ }
850+ 
789851TEST_F (Tester, testProcessStopSlowdownLimit)
790852{
791853  rclcpp::Time curr_time = cm_->now ();
0 commit comments