@@ -309,6 +309,7 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_alloc_unpar
309309 const int argc = sizeof (argv) / sizeof (const char *);
310310 rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
311311 rcl_allocator_t bad_alloc = get_failing_allocator ();
312+ rcl_allocator_t allocator = rcl_get_default_allocator ();
312313 rcl_ret_t ret = rcl_parse_arguments (argc, argv, rcl_get_default_allocator (), &parsed_args);
313314 ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
314315 EXPECT_EQ (2 , rcl_arguments_get_count_unparsed (&parsed_args));
@@ -317,13 +318,36 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_alloc_unpar
317318 EXPECT_EQ (
318319 RCL_RET_BAD_ALLOC, rcl_arguments_get_unparsed (&parsed_args, bad_alloc, &actual_unparsed));
319320 rcl_reset_error ();
321+
320322 EXPECT_EQ (
321323 RCL_RET_BAD_ALLOC, rcl_arguments_get_unparsed_ros (&parsed_args, bad_alloc, &actual_unparsed));
322324 rcl_reset_error ();
323325
326+ EXPECT_EQ (
327+ RCL_RET_INVALID_ARGUMENT,
328+ rcl_arguments_get_unparsed_ros (nullptr , allocator, &actual_unparsed));
329+ rcl_reset_error ();
330+
324331 EXPECT_EQ (RCL_RET_OK, rcl_arguments_fini (&parsed_args));
325332}
326333
334+ TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_empty_unparsed) {
335+ rcl_allocator_t allocator = rcl_get_default_allocator ();
336+ rcl_arguments_t empty_parsed_args = rcl_get_zero_initialized_arguments ();
337+ int * actual_unparsed = NULL ;
338+ int * actual_unparsed_ros = NULL ;
339+
340+ EXPECT_EQ (
341+ RCL_RET_INVALID_ARGUMENT,
342+ rcl_arguments_get_unparsed (&empty_parsed_args, allocator, &actual_unparsed));
343+ rcl_reset_error ();
344+
345+ EXPECT_EQ (
346+ RCL_RET_INVALID_ARGUMENT,
347+ rcl_arguments_get_unparsed_ros (&empty_parsed_args, allocator, &actual_unparsed_ros));
348+ rcl_reset_error ();
349+ }
350+
327351TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_params_get_counts) {
328352 rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
329353 EXPECT_EQ (-1 , rcl_arguments_get_count_unparsed (nullptr ));
@@ -698,6 +722,35 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_remove_ros_
698722 EXPECT_EQ (0 , nonros_argc);
699723}
700724
725+ TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_alloc_remove_ros_args) {
726+ const char * const argv[] = {
727+ " process_name" , " -d" , " --ros-args" , " -r" , " __ns:=/foo/bar" , " -r" , " __ns:=/fiz/buz" , " --" ,
728+ " --foo=bar" , " --baz" , " --ros-args" , " --ros-args" , " -p" , " bar:=baz" , " --" , " --" , " arg" ,
729+ };
730+ const int argc = sizeof (argv) / sizeof (const char *);
731+
732+ rcl_allocator_t alloc = rcl_get_default_allocator ();
733+ rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
734+ rcl_ret_t ret = rcl_parse_arguments (argc, argv, alloc, &parsed_args);
735+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
736+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
737+ {
738+ EXPECT_EQ (RCL_RET_OK, rcl_arguments_fini (&parsed_args));
739+ });
740+
741+ int nonros_argc = 0 ;
742+ const char ** nonros_argv = NULL ;
743+ rcl_allocator_t bomb_alloc = get_time_bombed_allocator ();
744+ set_time_bombed_allocator_count (bomb_alloc, 1 );
745+ ret = rcl_remove_ros_arguments (
746+ argv,
747+ &parsed_args,
748+ bomb_alloc,
749+ &nonros_argc,
750+ &nonros_argv);
751+ EXPECT_EQ (RCL_RET_BAD_ALLOC, ret);
752+ }
753+
701754TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_remove_ros_args) {
702755 const char * const argv[] = {
703756 " process_name" , " -d" , " --ros-args" , " -r" , " __ns:=/foo/bar" , " -r" , " __ns:=/fiz/buz" , " --" ,
@@ -854,6 +907,17 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_param_argument_
854907 }
855908 alloc.deallocate (parameter_files, alloc.state );
856909
910+ // Test bad alloc
911+ rcl_allocator_t bad_alloc = get_failing_allocator ();
912+ rcl_params_t * params_test = NULL ;
913+ rcl_allocator_t saved_alloc = parsed_args.impl ->allocator ;
914+ parsed_args.impl ->parameter_overrides ->allocator = bad_alloc;
915+ ret = rcl_arguments_get_param_overrides (&parsed_args, ¶ms_test);
916+ EXPECT_EQ (RCL_RET_BAD_ALLOC, ret) << rcl_get_error_string ().str ;
917+ EXPECT_EQ (NULL , params_test);
918+ parsed_args.impl ->parameter_overrides ->allocator = saved_alloc;
919+
920+ // Expected usage
857921 rcl_params_t * params = NULL ;
858922 ret = rcl_arguments_get_param_overrides (&parsed_args, ¶ms);
859923 EXPECT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
@@ -943,6 +1007,35 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_param_argument_
9431007 EXPECT_FALSE (param_value->bool_array_value ->values [2 ]);
9441008}
9451009
1010+ TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_param_arguments_copy) {
1011+ const std::string parameters_filepath1 = (test_path / " test_parameters.1.yaml" ).string ();
1012+ const std::string parameters_filepath2 = (test_path / " test_parameters.2.yaml" ).string ();
1013+ const char * const argv[] = {
1014+ " process_name" , " --ros-args" , " --params-file" , parameters_filepath1.c_str (),
1015+ " -r" , " __ns:=/namespace" , " random:=arg" , " --params-file" , parameters_filepath2.c_str ()
1016+ };
1017+ const int argc = sizeof (argv) / sizeof (const char *);
1018+ rcl_ret_t ret;
1019+
1020+ rcl_allocator_t alloc = rcl_get_default_allocator ();
1021+ rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
1022+
1023+ ret = rcl_parse_arguments (argc, argv, alloc, &parsed_args);
1024+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
1025+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
1026+ {
1027+ EXPECT_EQ (RCL_RET_OK, rcl_arguments_fini (&parsed_args));
1028+ });
1029+
1030+ int parameter_filecount = rcl_arguments_get_param_files_count (&parsed_args);
1031+ EXPECT_EQ (2 , parameter_filecount);
1032+
1033+ rcl_arguments_t copied_args = rcl_get_zero_initialized_arguments ();
1034+ ret = rcl_arguments_copy (&parsed_args, &copied_args);
1035+ EXPECT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
1036+ EXPECT_EQ (2 , rcl_arguments_get_param_files_count (&copied_args));
1037+ }
1038+
9461039TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_no_param_overrides) {
9471040 const char * const argv[] = {" process_name" };
9481041 const int argc = sizeof (argv) / sizeof (const char *);
@@ -966,6 +1059,11 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_no_param_overri
9661059 EXPECT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
9671060 rcl_reset_error ();
9681061
1062+ rcl_arguments_t empty_parsed_arg = rcl_get_zero_initialized_arguments ();
1063+ ret = rcl_arguments_get_param_overrides (&empty_parsed_arg, ¶ms);
1064+ EXPECT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
1065+ rcl_reset_error ();
1066+
9691067 rcl_params_t preallocated_params;
9701068 params = &preallocated_params;
9711069 ret = rcl_arguments_get_param_overrides (&parsed_args, ¶ms);
@@ -1099,3 +1197,60 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_allocs_copy
10991197 }
11001198 parsed_args.impl ->allocator = saved_alloc;
11011199}
1200+
1201+ TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_null_get_param_files) {
1202+ const std::string parameters_filepath1 = (test_path / " test_parameters.1.yaml" ).string ();
1203+ const char * const argv[] = {
1204+ " process_name" , " --ros-args" , " --params-file" , parameters_filepath1.c_str ()
1205+ };
1206+ const int argc = sizeof (argv) / sizeof (const char *);
1207+
1208+ rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
1209+ char ** parameter_files = NULL ;
1210+ rcl_allocator_t allocator = rcl_get_default_allocator ();
1211+ rcl_ret_t ret = rcl_parse_arguments (argc, argv, allocator, &parsed_args);
1212+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
1213+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
1214+ {
1215+ EXPECT_EQ (RCL_RET_OK, rcl_arguments_fini (&parsed_args));
1216+ });
1217+
1218+ ret = rcl_arguments_get_param_files (nullptr , allocator, ¶meter_files);
1219+ EXPECT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
1220+ EXPECT_TRUE (rcl_error_is_set ());
1221+ rcl_reset_error ();
1222+
1223+ ret = rcl_arguments_get_param_files (&parsed_args, allocator, nullptr );
1224+ EXPECT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
1225+ EXPECT_TRUE (rcl_error_is_set ());
1226+ rcl_reset_error ();
1227+
1228+ rcl_arguments_t empty_parsed_args = rcl_get_zero_initialized_arguments ();
1229+ ret = rcl_arguments_get_param_files (&empty_parsed_args, allocator, ¶meter_files);
1230+ EXPECT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
1231+ EXPECT_TRUE (rcl_error_is_set ());
1232+ rcl_reset_error ();
1233+ }
1234+
1235+ TEST_F (CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_bad_alloc_parse_arg) {
1236+ const std::string parameters_filepath1 = (test_path / " test_parameters.1.yaml" ).string ();
1237+ const char * const argv[] = {
1238+ " process_name" , " --ros-args" , " --params-file" , parameters_filepath1.c_str ()
1239+ };
1240+ const int argc = sizeof (argv) / sizeof (const char *);
1241+
1242+ rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments ();
1243+ rcl_allocator_t bomb_alloc = get_time_bombed_allocator ();
1244+
1245+ for (int i = 0 ; i < 100 ; i++) {
1246+ set_time_bombed_allocator_count (bomb_alloc, i);
1247+ rcl_ret_t ret = rcl_parse_arguments (argc, argv, bomb_alloc, &parsed_args);
1248+ if (RCL_RET_OK == ret) {
1249+ EXPECT_EQ (RCL_RET_OK, rcl_arguments_fini (&parsed_args));
1250+ break ;
1251+ } else {
1252+ EXPECT_EQ (RCL_RET_BAD_ALLOC, ret);
1253+ rcl_reset_error ();
1254+ }
1255+ }
1256+ }
0 commit comments