1818#include < string>
1919#include < vector>
2020
21+ #include " geometry_msgs/msg/transform_stamped.hpp"
2122#include " gtest/gtest.h"
22- #include " nav2_util/lifecycle_node .hpp"
23+ #include " lifecycle_msgs/msg/state .hpp"
2324#include " nav2_controller/controller_server.hpp"
25+ #include " nav2_core/controller_exceptions.hpp"
26+ #include " nav2_util/lifecycle_node.hpp"
2427#include " rclcpp/rclcpp.hpp"
28+ #include " tf2_ros/buffer.hpp"
2529
2630class ControllerShim : public nav2_controller ::ControllerServer
2731{
@@ -59,7 +63,7 @@ class RclCppFixture
5963};
6064RclCppFixture g_rclcppfixture;
6165
62- TEST (WPTest , test_dynamic_parameters)
66+ TEST (ControllerServerTest , test_dynamic_parameters)
6367{
6468 auto controller = std::make_shared<ControllerShim>();
6569 controller->setDynamicCallback ();
@@ -86,3 +90,39 @@ TEST(WPTest, test_dynamic_parameters)
8690 EXPECT_EQ (controller->get_parameter (" min_theta_velocity_threshold" ).as_double (), 100.0 );
8791 EXPECT_EQ (controller->get_parameter (" failure_tolerance" ).as_double (), 5.0 );
8892}
93+
94+ class GoalReachTestController : public nav2_controller ::ControllerServer
95+ {
96+ public:
97+ using nav2_controller::ControllerServer::ControllerServer;
98+
99+ void setEndPoseFrame (const std::string & frame) {end_pose_.header .frame_id = frame;}
100+ bool callIsGoalReached () {return isGoalReached ();}
101+ tf2_ros::Buffer & getTfBuffer () {return *costmap_ros_->getTfBuffer ();}
102+ };
103+
104+ TEST (ControllerServerTest, IsGoalReachedThrowsOnTfFailure)
105+ {
106+ rclcpp::NodeOptions options;
107+ options.parameter_overrides ({
108+ rclcpp::Parameter (" progress_checker_plugins" , std::vector<std::string>{}),
109+ rclcpp::Parameter (" goal_checker_plugins" , std::vector<std::string>{}),
110+ rclcpp::Parameter (" controller_plugins" , std::vector<std::string>{}),
111+ });
112+
113+ auto server = std::make_shared<GoalReachTestController>(options);
114+ ASSERT_EQ (
115+ server->configure ().id (),
116+ lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE );
117+
118+ geometry_msgs::msg::TransformStamped tf_msg;
119+ tf_msg.header .stamp = server->now ();
120+ tf_msg.header .frame_id = " map" ;
121+ tf_msg.child_frame_id = " base_link" ;
122+ tf_msg.transform .rotation .w = 1.0 ;
123+ server->getTfBuffer ().setTransform (tf_msg, " test" , true );
124+
125+ server->setEndPoseFrame (" nonexistent_frame_xyz" );
126+ EXPECT_THROW (server->callIsGoalReached (), nav2_core::ControllerTFError);
127+ server->cleanup ();
128+ }
0 commit comments