diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index a9e5e6882..2f889f0db 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -1971,16 +1971,18 @@ _rcl_parse_param_rule( // TODO(hidmic): switch to _rcl_parse_resource_match() when parameter names // are standardized to use slashes in lieu of dots. ret = _rcl_parse_param_name(&lex_lookahead, params->allocator, ¶m_name); - if (RCL_RET_OK != ret) { - if (RCL_RET_WRONG_LEXEME == ret) { - ret = RCL_RET_INVALID_PARAM_RULE; - } - goto cleanup; + if (RCL_RET_OK == ret) { + ret = rcl_lexer_lookahead2_expect(&lex_lookahead, RCL_LEXEME_SEPARATOR, NULL, NULL); } - - ret = rcl_lexer_lookahead2_expect(&lex_lookahead, RCL_LEXEME_SEPARATOR, NULL, NULL); - if (RCL_RET_WRONG_LEXEME == ret) { + if (RCL_RET_WRONG_LEXEME == ret || RCL_RET_INVALID_REMAP_RULE == ret) { + rcl_error_string_t prev_error_string = rcl_get_error_string(); + rcl_reset_error(); + RCL_SET_ERROR_MSG_WITH_FORMAT_STRING( + "Parameter override rule must have the format 'name:=value'. Error: %s", + prev_error_string.str); ret = RCL_RET_INVALID_PARAM_RULE; + } + if (RCL_RET_OK != ret) { goto cleanup; } diff --git a/rcl/test/rcl/test_arguments.cpp b/rcl/test/rcl/test_arguments.cpp index 3d944f510..38b6b5e4e 100644 --- a/rcl/test/rcl/test_arguments.cpp +++ b/rcl/test/rcl/test_arguments.cpp @@ -293,6 +293,22 @@ TEST_F(TestArgumentsFixture, check_valid_vs_invalid_args) { EXPECT_FALSE(are_valid_ros_args({"--ros-args", "--log-file-name"})); } +TEST_F(TestArgumentsFixture, test_parameter_override_missing_assignment_error) { + const char * const argv[] = {"process_name", "--ros-args", "-p", "bla"}; + const int argc = sizeof(argv) / sizeof(const char *); + rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments(); + + EXPECT_EQ( + RCL_RET_INVALID_ROS_ARGS, + rcl_parse_arguments(argc, argv, rcl_get_default_allocator(), &parsed_args)); + const std::string error_message = rcl_get_error_string().str; + EXPECT_NE( + std::string::npos, + error_message.find("Parameter override rule must have the format 'name:=value'")); + EXPECT_NE(std::string::npos, error_message.find("Expected lexeme type")); + rcl_reset_error(); +} + TEST_F(TestArgumentsFixture, test_no_args) { rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments(); rcl_ret_t ret = rcl_parse_arguments(0, NULL, rcl_get_default_allocator(), &parsed_args);