diff --git a/rclcpp/src/rclcpp/node_interfaces/node_type_descriptions.cpp b/rclcpp/src/rclcpp/node_interfaces/node_type_descriptions.cpp index 550aa6107d..0a681b1942 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_type_descriptions.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_type_descriptions.cpp @@ -65,11 +65,11 @@ class NodeTypeDescriptions::NodeTypeDescriptionsImpl : logger_(node_logging->get_logger()), node_base_(node_base) { + rclcpp::ParameterValue enable_param; const std::string enable_param_name = "start_type_description_service"; - bool enabled = false; - try { - auto enable_param = node_parameters->declare_parameter( + if (!node_parameters->has_parameter(enable_param_name)) { + enable_param = node_parameters->declare_parameter( enable_param_name, rclcpp::ParameterValue(true), rcl_interfaces::msg::ParameterDescriptor() @@ -77,13 +77,21 @@ class NodeTypeDescriptions::NodeTypeDescriptionsImpl .set__type(rclcpp::PARAMETER_BOOL) .set__description("Start the ~/get_type_description service for this node.") .set__read_only(true)); - enabled = enable_param.get(); - } catch (const rclcpp::exceptions::InvalidParameterTypeException & exc) { - RCLCPP_ERROR(logger_, "%s", exc.what()); - throw; + } else { + enable_param = node_parameters->get_parameter(enable_param_name).get_parameter_value(); + } + if (enable_param.get_type() != rclcpp::PARAMETER_BOOL) { + RCLCPP_ERROR( + logger_, + "Invalid type '%s' for parameter 'start_type_description_service', should be 'bool'", + rclcpp::to_string(enable_param.get_type()).c_str()); + std::ostringstream ss; + ss << "Wrong parameter type, parameter {" << enable_param_name << "} is of type {bool}, " + << "setting it to {" << to_string(enable_param.get_type()) << "} is not allowed."; + throw rclcpp::exceptions::InvalidParameterTypeException(enable_param_name, ss.str()); } - if (enabled) { + if (enable_param.get()) { auto * rcl_node = node_base->get_rcl_node_handle(); std::shared_ptr rcl_srv( new rcl_service_t, diff --git a/rclcpp/test/rclcpp/node_interfaces/test_node_type_descriptions.cpp b/rclcpp/test/rclcpp/node_interfaces/test_node_type_descriptions.cpp index 1a4603528a..47d1417ff4 100644 --- a/rclcpp/test/rclcpp/node_interfaces/test_node_type_descriptions.cpp +++ b/rclcpp/test/rclcpp/node_interfaces/test_node_type_descriptions.cpp @@ -37,6 +37,38 @@ TEST_F(TestNodeTypeDescriptions, interface_created) ASSERT_NE(nullptr, node.get_node_type_descriptions_interface()); } +TEST_F(TestNodeTypeDescriptions, automatically_declare_parameters_from_overrides) +{ + rclcpp::NodeOptions node_options; + node_options.automatically_declare_parameters_from_overrides(true); + node_options.append_parameter_override("start_type_description_service", false); + ASSERT_NO_THROW( + { + auto node = std::make_shared("node", "ns", node_options); + (void) node; + }); +} + +TEST_F(TestNodeTypeDescriptions, bad_parameter_type) +{ + rclcpp::NodeOptions node_options; + node_options.append_parameter_override("start_type_description_service", "unexpected_type"); + + ASSERT_THROW( + { + node_options.automatically_declare_parameters_from_overrides(false); + auto node = std::make_shared("node", "ns", node_options); + (void) node; + }, rclcpp::exceptions::InvalidParameterTypeException); + + ASSERT_THROW( + { + node_options.automatically_declare_parameters_from_overrides(true); + auto node = std::make_shared("node", "ns", node_options); + (void) node; + }, rclcpp::exceptions::InvalidParameterTypeException); +} + TEST_F(TestNodeTypeDescriptions, disabled_no_service) { rclcpp::NodeOptions node_options;