Skip to content

Commit 8d7bb9f

Browse files
Blast545ahcorde
authored andcommitted
Adding tests to arguments.c (#752)
* Add nullptr tests get_param_files * Add bad alloc tests * Add missing tests * Add bad alloc tests rcl_arguments_copy * Remove repeated test * Remove spaces * Restore erased test * Relocate test * Refactor bomb allocator test * Add missing rcl_reset_error() checks Signed-off-by: Jorge Perez <[email protected]>
1 parent 31f5c99 commit 8d7bb9f

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

rcl/test/rcl/test_arguments.cpp

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
327351
TEST_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+
701754
TEST_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, &params_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, &params);
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+
9461039
TEST_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, &params);
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, &params);
@@ -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, &parameter_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, &parameter_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

Comments
 (0)