@@ -107,3 +107,107 @@ TEST_F(TestControllerManager, controller_lifecycle)
107107 lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, test_controller->get_state ().id ());
108108 EXPECT_EQ (1 , test_controller.use_count ());
109109}
110+
111+
112+
113+ TEST_F (TestControllerManager, per_controller_update_rate) {
114+ auto test_controller = std::make_shared<test_controller::TestController>();
115+ cm_->add_controller (
116+ test_controller, test_controller::TEST_CONTROLLER_NAME,
117+ test_controller::TEST_CONTROLLER_CLASS_NAME);
118+ EXPECT_EQ (1u , cm_->get_loaded_controllers ().size ());
119+ EXPECT_EQ (2 , test_controller.use_count ());
120+
121+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
122+ EXPECT_EQ (
123+ 0u ,
124+ test_controller->internal_counter ) <<
125+ " Update should not reach an unconfigured controller" ;
126+
127+ EXPECT_EQ (
128+ lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED,
129+ test_controller->get_state ().id ());
130+
131+ test_controller->get_node ()->set_parameter ({" update_rate" , 4 });
132+ // configure controller
133+ cm_->configure_controller (test_controller::TEST_CONTROLLER_NAME);
134+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
135+ EXPECT_EQ (0u , test_controller->internal_counter ) << " Controller is not started" ;
136+
137+ EXPECT_EQ (
138+ lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE,
139+ test_controller->get_state ().id ());
140+
141+ // Start controller, will take effect at the end of the update function
142+ std::vector<std::string> start_controllers = {test_controller::TEST_CONTROLLER_NAME};
143+ std::vector<std::string> stop_controllers = {};
144+ auto switch_future = std::async (
145+ std::launch::async,
146+ &controller_manager::ControllerManager::switch_controller, cm_,
147+ start_controllers, stop_controllers,
148+ STRICT, true , rclcpp::Duration (0 , 0 ));
149+
150+ ASSERT_EQ (
151+ std::future_status::timeout,
152+ switch_future.wait_for (std::chrono::milliseconds (100 ))) <<
153+ " switch_controller should be blocking until next update cycle" ;
154+
155+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
156+ EXPECT_EQ (0u , test_controller->internal_counter ) << " Controller is started at the end of update" ;
157+ {
158+ ControllerManagerRunner cm_runner (this );
159+ EXPECT_EQ (
160+ controller_interface::return_type::OK,
161+ switch_future.get ()
162+ );
163+ }
164+
165+ EXPECT_EQ (
166+ lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE,
167+ test_controller->get_state ().id ());
168+
169+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
170+ EXPECT_GE (test_controller->internal_counter , 1u );
171+ EXPECT_EQ (test_controller->get_update_rate (), 4 );
172+ }
173+
174+ TEST_F (TestControllerManager, inactive_controller_does_not_get_updated)
175+ {
176+ // trying to get the cm's internal update rate, but not sure what is the right way to do that
177+ // TestableControllerManager test_cm(std::move(cm_->resource_manager_), cm_->executor_, "controller_manager", "");
178+ // int internal_update_counter = test_cm.get_internal_update_counter();
179+
180+ auto test_controller = std::make_shared<test_controller::TestController>();
181+ cm_->add_controller (
182+ test_controller, test_controller::TEST_CONTROLLER_NAME,
183+ test_controller::TEST_CONTROLLER_CLASS_NAME);
184+ EXPECT_EQ (1u , cm_->get_loaded_controllers ().size ());
185+ EXPECT_EQ (2 , test_controller.use_count ());
186+
187+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
188+ EXPECT_EQ (
189+ 0u ,
190+ test_controller->internal_counter ) <<
191+ " Update should not reach an unconfigured controller" ;
192+
193+ EXPECT_EQ (
194+ lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED,
195+ test_controller->get_state ().id ());
196+
197+ test_controller->get_node ()->set_parameter ({" update_rate" , 4 });
198+ // configure controller
199+ cm_->configure_controller (test_controller::TEST_CONTROLLER_NAME);
200+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
201+ EXPECT_EQ (0u , test_controller->internal_counter ) << " Controller is not started" ;
202+
203+ // "Attempt to update the controller a couple of times"
204+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
205+ EXPECT_EQ (controller_interface::return_type::OK, cm_->update ());
206+
207+ EXPECT_EQ (
208+ lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE,
209+ test_controller->get_state ().id ());
210+
211+
212+ // EXPECT_EQ(0, internal_update_counter);
213+ }
0 commit comments