From 8ca6f42f290336ca5ba3d9ee2a4eedbbcc6cc38b Mon Sep 17 00:00:00 2001 From: Stephen Brawner Date: Tue, 1 Sep 2020 10:58:37 -0700 Subject: [PATCH] variant_copy Signed-off-by: Stephen Brawner --- rcl_yaml_param_parser/test/test_parser.cpp | 7 +--- .../test/test_yaml_variant.cpp | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/rcl_yaml_param_parser/test/test_parser.cpp b/rcl_yaml_param_parser/test/test_parser.cpp index a124a52a4..abf88bd7e 100644 --- a/rcl_yaml_param_parser/test/test_parser.cpp +++ b/rcl_yaml_param_parser/test/test_parser.cpp @@ -340,7 +340,6 @@ TEST(RclYamlParamParser, test_parse_file_with_bad_allocator) { }); ASSERT_TRUE(rcutils_exists(path)) << "No test YAML file found at " << path; - // Check sporadic failing malloc calls RCUTILS_FAULT_INJECTION_TEST( { rcutils_allocator_t allocator = rcutils_get_default_allocator(); @@ -355,12 +354,8 @@ TEST(RclYamlParamParser, test_parse_file_with_bad_allocator) { (void)res; // If `rcutils_string_array_fini` fails, there will be a small memory leak here. - // Pausing fault injection so this test runs clean - int64_t count = rcutils_fault_injection_get_count(); - rcutils_fault_injection_set_count(RCUTILS_FAULT_INJECTION_NEVER_FAIL); + // However, it's necessary for coverage rcl_yaml_node_struct_fini(params_hdl); - rcutils_fault_injection_set_count(count); - params_hdl = NULL; }); } diff --git a/rcl_yaml_param_parser/test/test_yaml_variant.cpp b/rcl_yaml_param_parser/test/test_yaml_variant.cpp index 67ea7b6b8..ecfdaeec2 100644 --- a/rcl_yaml_param_parser/test/test_yaml_variant.cpp +++ b/rcl_yaml_param_parser/test/test_yaml_variant.cpp @@ -182,3 +182,35 @@ TEST(TestYamlVariant, copy_string_array_values) { src_variant.string_array_value->data[i], dest_variant.string_array_value->data[i]); } } + +TEST(TestYamlVariant, copy_string_array_maybe_fail) { + rcl_variant_t src_variant{}; + rcutils_allocator_t allocator = rcutils_get_default_allocator(); + constexpr size_t size = 3u; + src_variant.string_array_value = + static_cast( + allocator.allocate(sizeof(rcutils_string_array_t), allocator.state)); + ASSERT_NE(nullptr, src_variant.string_array_value); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + rcl_yaml_variant_fini(&src_variant, allocator); + }); + *src_variant.string_array_value = rcutils_get_zero_initialized_string_array(); + ASSERT_EQ( + RCUTILS_RET_OK, rcutils_string_array_init(src_variant.string_array_value, size, &allocator)); + src_variant.string_array_value->size = size; + src_variant.string_array_value->data[0] = rcutils_strdup("string1", allocator); + src_variant.string_array_value->data[1] = rcutils_strdup("string2", allocator); + src_variant.string_array_value->data[2] = rcutils_strdup("string3", allocator); + for (size_t i = 0; i < size; ++i) { + ASSERT_NE(nullptr, src_variant.string_array_value->data[i]); + } + + RCUTILS_FAULT_INJECTION_TEST( + { + rcl_variant_t dest_variant{}; + rcutils_ret_t ret = rcl_yaml_variant_copy(&dest_variant, &src_variant, allocator); + (void)ret; + rcl_yaml_variant_fini(&dest_variant, allocator); + }); +}