From f391200e5abf1c762daaaf4f4b2c9b72c295f8ec Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 6 Aug 2020 17:05:15 -0300 Subject: [PATCH 01/24] Add mocking tools Signed-off-by: Jorge Perez --- rcl/test/CMakeLists.txt | 2 +- rcl/test/rcl/test_init.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rcl/test/CMakeLists.txt b/rcl/test/CMakeLists.txt index fcc4eafab..a85568bcb 100644 --- a/rcl/test/CMakeLists.txt +++ b/rcl/test/CMakeLists.txt @@ -158,7 +158,7 @@ function(test_target_function) SRCS rcl/test_init.cpp ENV ${rmw_implementation_env_var} ${memory_tools_ld_preload_env_var} APPEND_LIBRARY_DIRS ${extra_lib_dirs} - LIBRARIES ${PROJECT_NAME} osrf_testing_tools_cpp::memory_tools + LIBRARIES ${PROJECT_NAME} mimick osrf_testing_tools_cpp::memory_tools AMENT_DEPENDENCIES ${rmw_implementation} ) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index efcddd7cc..6fb36dc5f 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -26,6 +26,7 @@ #include "./allocator_testing_utils.h" #include "../src/rcl/init_options_impl.h" +#include "../mocking_utils/patch.hpp" #ifdef RMW_IMPLEMENTATION # define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX From e60f44f3b1f7f43def6fe2bcb17890357fae1656 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 6 Aug 2020 18:24:01 -0300 Subject: [PATCH 02/24] Add mocked tests fail init/fini Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 67 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index 6fb36dc5f..ca62c467f 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -411,3 +411,70 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_acce EXPECT_EQ(RCL_RET_ALREADY_INIT, rcl_init_options_copy(&init_options, &init_options_dst)); EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)); } + +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, ==) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, <) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, >) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, !=) + +// Tests rcl_init_options_init() mocked to fail +TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_mocked_rcl_init_options_ini) { + rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); + auto mock = mocking_utils::patch( + "lib:rcl", rmw_init_options_init, [](auto...) {return RMW_RET_ERROR;}); + EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_init(&init_options, rcl_get_default_allocator())); + rcl_reset_error(); +} + +// Tests rcl_init_options_fini() mocked to fail +TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_mocked_rcl_init_options_fini) { + rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); + rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + auto mock = mocking_utils::patch( + "lib:rcl", rmw_init_options_fini, [](auto...) {return RMW_RET_ERROR;}); + EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_fini(&init_options)); + rcl_reset_error(); +} + +// Mock rcl_init_options_copy to fail +TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_copy_mocked_fail_fini) { + rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); + rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str; + }); + rcl_init_options_t init_options_dst = rcl_get_zero_initialized_init_options(); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; + }); + + auto mock = mocking_utils::patch( + "lib:rcl", rmw_init_options_fini, [](auto...) {return RMW_RET_ERROR;}); + EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); + rcl_reset_error(); +} + +// Mock rcl_init_options_copy to fail +TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_copy_fail_rmw_copy) { + rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); + rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str; + }); + rcl_init_options_t init_options_dst = rcl_get_zero_initialized_init_options(); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; + }); + + auto mock = mocking_utils::patch( + "lib:rcl", rmw_init_options_copy, [](auto...) {return RMW_RET_ERROR;}); + EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); + rcl_reset_error(); +} From 4d11ecfe210448d233b40adde2c2203a39fb2524 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 12:19:05 -0300 Subject: [PATCH 03/24] Reformat tests with helper macro Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index ca62c467f..55492f3e7 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -420,8 +420,7 @@ MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, !=) // Tests rcl_init_options_init() mocked to fail TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_mocked_rcl_init_options_ini) { rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); - auto mock = mocking_utils::patch( - "lib:rcl", rmw_init_options_init, [](auto...) {return RMW_RET_ERROR;}); + auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_init, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_init(&init_options, rcl_get_default_allocator())); rcl_reset_error(); } @@ -431,8 +430,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_mocked_rcl_init_optio rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; - auto mock = mocking_utils::patch( - "lib:rcl", rmw_init_options_fini, [](auto...) {return RMW_RET_ERROR;}); + auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_fini(&init_options)); rcl_reset_error(); } @@ -452,8 +450,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_copy_mocked_ EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; }); - auto mock = mocking_utils::patch( - "lib:rcl", rmw_init_options_fini, [](auto...) {return RMW_RET_ERROR;}); + auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); rcl_reset_error(); } @@ -473,8 +470,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_copy EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; }); - auto mock = mocking_utils::patch( - "lib:rcl", rmw_init_options_copy, [](auto...) {return RMW_RET_ERROR;}); + auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_copy, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); rcl_reset_error(); } From 226f21a4265df25099c1108ae20777b2980ab7b1 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 12:29:40 -0300 Subject: [PATCH 04/24] Fix returned value expected Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index 55492f3e7..9f53e938b 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -467,10 +467,15 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_copy rcl_init_options_t init_options_dst = rcl_get_zero_initialized_init_options(); OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( { - EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; + // dst is in a invalid state after failed copy + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; + rcl_reset_error(); }); + // rmw_init_options_copy error is logged auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_copy, RMW_RET_ERROR); - EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_init_options_copy(&init_options, &init_options_dst)); rcl_reset_error(); } From 310b9f513cbff94228eb8c6539168c8f1a20f34b Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 15:25:23 -0300 Subject: [PATCH 05/24] Add nullptr/invalid tests Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 39 +++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index 9f53e938b..5c07bf9e5 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -105,16 +105,34 @@ struct FakeTestArgv */ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_init) { rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); - rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); + + // fini a not empty options + rcl_ret_t ret = rcl_init_options_fini(&init_options); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; + rcl_reset_error(); + + // Expected usage + ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( { EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str; }); + // Already init ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); EXPECT_EQ(RCL_RET_ALREADY_INIT, ret) << rcl_get_error_string().str; rcl_reset_error(); + + // nullptr + ret = rcl_init_options_init(nullptr, rcl_get_default_allocator()); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; + rcl_reset_error(); + + // nullptr + ret = rcl_init_options_fini(nullptr); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; + rcl_reset_error(); } /* Tests calling rcl_init() with invalid arguments fails. @@ -365,6 +383,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_get_instance_id) TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_access) { rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); + rcl_init_options_t not_ini_init_options = rcl_get_zero_initialized_init_options(); rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( @@ -376,14 +395,21 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_acce ASSERT_NE(nullptr, options); EXPECT_EQ(0u, options->instance_id); EXPECT_EQ(nullptr, options->impl); + EXPECT_EQ(NULL, rcl_init_options_get_rmw_init_options(nullptr)); + EXPECT_EQ(NULL, rcl_init_options_get_rmw_init_options(¬_ini_init_options)); const rcl_allocator_t * options_allocator = rcl_init_options_get_allocator(&init_options); EXPECT_TRUE(rcutils_allocator_is_valid(options_allocator)); + EXPECT_EQ(NULL, rcl_init_options_get_allocator(nullptr)); + EXPECT_EQ(NULL, rcl_init_options_get_allocator(¬_ini_init_options)); size_t domain_id; ret = rcl_init_options_get_domain_id(NULL, &domain_id); ASSERT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; rcl_reset_error(); + ret = rcl_init_options_get_domain_id(¬_ini_init_options, &domain_id); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; + rcl_reset_error(); ret = rcl_init_options_get_domain_id(&init_options, NULL); ASSERT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; rcl_reset_error(); @@ -393,6 +419,9 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_acce ret = rcl_init_options_set_domain_id(NULL, domain_id); ASSERT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; rcl_reset_error(); + ret = rcl_init_options_set_domain_id(¬_ini_init_options, domain_id); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string().str; + rcl_reset_error(); ret = rcl_init_options_get_domain_id(&init_options, &domain_id); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; @@ -404,6 +433,14 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_acce EXPECT_EQ(0U, domain_id); rcl_init_options_t init_options_dst = rcl_get_zero_initialized_init_options(); + + // nullptr copy cases + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, rcl_init_options_copy(nullptr, &init_options_dst)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, rcl_init_options_copy(&init_options, nullptr)); + + // Expected usage copy ASSERT_EQ(RCL_RET_OK, rcl_init_options_copy(&init_options, &init_options_dst)); ret = rcl_init_options_get_domain_id(&init_options_dst, &domain_id); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; From 4d63f1c6da0a03d5e2da6279985c022fbe930f8a Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 15:51:39 -0300 Subject: [PATCH 06/24] Add domain_id mocked tests Signed-off-by: Jorge Perez --- rcl/test/CMakeLists.txt | 2 +- rcl/test/rcl/test_domain_id.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/rcl/test/CMakeLists.txt b/rcl/test/CMakeLists.txt index a85568bcb..74a2c1dfd 100644 --- a/rcl/test/CMakeLists.txt +++ b/rcl/test/CMakeLists.txt @@ -361,7 +361,7 @@ rcl_add_custom_gtest(test_validate_enclave_name rcl_add_custom_gtest(test_domain_id SRCS rcl/test_domain_id.cpp APPEND_LIBRARY_DIRS ${extra_lib_dirs} - LIBRARIES ${PROJECT_NAME} + LIBRARIES ${PROJECT_NAME} mimick ) rcl_add_custom_gtest(test_localhost diff --git a/rcl/test/rcl/test_domain_id.cpp b/rcl/test/rcl/test_domain_id.cpp index b5d4616bc..55a0413a5 100644 --- a/rcl/test/rcl/test_domain_id.cpp +++ b/rcl/test/rcl/test_domain_id.cpp @@ -20,6 +20,8 @@ #include "rcl/error_handling.h" #include "rcutils/env.h" +#include "../mocking_utils/patch.hpp" + TEST(TestGetDomainId, test_nominal) { ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "42")); size_t domain_id = RCL_DEFAULT_DOMAIN_ID; @@ -50,3 +52,13 @@ TEST(TestGetDomainId, test_nominal) { EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_get_default_domain_id(nullptr)); } + +TEST(TestGetDomainId, test_mock_get_default_domain_id) { + auto mock = mocking_utils::patch_and_return( + "lib:rcl", rcutils_get_env, "argument env_name is null"); + size_t domain_id = RCL_DEFAULT_DOMAIN_ID; + EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id)); + EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); +} From 7171d7128bd775f45ab3a13e2a3396467ac3d3d7 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 17:05:58 -0300 Subject: [PATCH 07/24] Add mimick support for test_log_level Signed-off-by: Jorge Perez --- rcl/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/test/CMakeLists.txt b/rcl/test/CMakeLists.txt index 74a2c1dfd..e520fe2c2 100644 --- a/rcl/test/CMakeLists.txt +++ b/rcl/test/CMakeLists.txt @@ -399,7 +399,7 @@ rcl_add_custom_gtest(test_common rcl_add_custom_gtest(test_log_level SRCS rcl/test_log_level.cpp APPEND_LIBRARY_DIRS ${extra_lib_dirs} - LIBRARIES ${PROJECT_NAME} + LIBRARIES ${PROJECT_NAME} mimick AMENT_DEPENDENCIES "osrf_testing_tools_cpp" ) From 85f95a0ddc9ca7f23f50ac002c34249b31b52e56 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 17:07:04 -0300 Subject: [PATCH 08/24] Add fini/ini tests log_level Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index cddd8bac4..1bb1a9695 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -14,12 +14,14 @@ #include +#include "rcl/allocator.h" #include "rcl/rcl.h" #include "rcl/log_level.h" #include "rcl/error_handling.h" #include "rcutils/logging.h" #include "./arg_macros.hpp" +#include "../mocking_utils/patch.hpp" int setup_and_parse_log_level_args(const char * log_level_string) { @@ -193,6 +195,38 @@ TEST(TestLogLevel, log_level_dot_logger_name) { EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[0].level); } +TEST(TestLogLevel, log_level_init_fini) { + rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); + rcl_allocator_t allocator = rcl_get_default_allocator(); + const size_t capacity_count = 1; + EXPECT_EQ( + RCL_RET_OK, + rcl_log_levels_init(&log_levels, &allocator, capacity_count)); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); + }); + + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_init(nullptr, &allocator, capacity_count)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_init(&log_levels, nullptr, capacity_count)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_init(&log_levels, &allocator, capacity_count)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(1ul, log_levels.num_logger_settings); + EXPECT_STREQ("test.abc", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[0].level); +} + int main(int argc, char ** argv) { ::testing::InitGoogleTest(&argc, argv); From 8fd4d0eebf10ffa59a437b9fd05ce8a160314830 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 7 Aug 2020 17:09:17 -0300 Subject: [PATCH 09/24] Add fini nullptr test Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 1bb1a9695..9907da622 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -221,10 +221,7 @@ TEST(TestLogLevel, log_level_init_fini) { EXPECT_TRUE(rcl_error_is_set()); rcl_reset_error(); - EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); - EXPECT_EQ(1ul, log_levels.num_logger_settings); - EXPECT_STREQ("test.abc", log_levels.logger_settings[0].name); - EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[0].level); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_fini(nullptr)); } int main(int argc, char ** argv) From 34c3ce84e153dd4c93e1060b32b1bf462d080d6c Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Mon, 10 Aug 2020 15:52:05 -0300 Subject: [PATCH 10/24] Add mocked tests rmw_impl_id_check Signed-off-by: Jorge Perez --- rcl/test/CMakeLists.txt | 2 +- rcl/test/rcl/test_rmw_impl_id_check_func.cpp | 88 ++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/rcl/test/CMakeLists.txt b/rcl/test/CMakeLists.txt index e520fe2c2..21d47f8d5 100644 --- a/rcl/test/CMakeLists.txt +++ b/rcl/test/CMakeLists.txt @@ -288,7 +288,7 @@ function(test_target_function) SRCS rcl/test_rmw_impl_id_check_func.cpp ENV ${rmw_implementation_env_var} APPEND_LIBRARY_DIRS ${extra_lib_dirs} - LIBRARIES ${PROJECT_NAME} + LIBRARIES ${PROJECT_NAME} mimick AMENT_DEPENDENCIES ${rmw_implementation} ) diff --git a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp index 64da8c35c..d621de55b 100644 --- a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp +++ b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp @@ -15,11 +15,15 @@ #include #include "rcutils/env.h" +#include "rcutils/strdup.h" +#include "rcl/allocator.h" #include "rcl/error_handling.h" #include "rcl/rcl.h" #include "rcl/rmw_implementation_identifier_check.h" +#include "../mocking_utils/patch.hpp" + TEST(TestRmwCheck, test_rmw_check_id_impl) { EXPECT_EQ(RCL_RET_OK, rcl_rmw_implementation_identifier_check()); } @@ -70,3 +74,87 @@ TEST(TestRmwCheck, test_failing_configuration) { EXPECT_TRUE(rcutils_set_env(RMW_IMPLEMENTATION_ENV_VAR_NAME, expected_rmw_impl_env)); EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, expected_rmw_id_matches)); } + +// Define dummy comparison operators for rcutils_allocator_t type for use with the Mimick Library +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, ==) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, <) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, >) +MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, !=) + +// Mock internal calls to external libraries to fail +TEST(TestRmwCheck, test_mock_rmw_impl_check) { + { + // Fail reading RMW_IMPLEMENTATION_ENV_VAR_NAME + auto mock = mocking_utils::patch_and_return( + "lib:rcl", rcutils_get_env, "invalid arg"); + EXPECT_EQ(RCL_RET_ERROR, rcl_rmw_implementation_identifier_check()); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + } + { + // Fail copying RMW_IMPLEMENTATION_ENV_VAR_NAME env result + auto mock = mocking_utils::patch_and_return( + "lib:rcl", rcutils_strdup, static_cast(NULL)); + EXPECT_EQ(RCL_RET_BAD_ALLOC, rcl_rmw_implementation_identifier_check()); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + } + { + // Fail reading RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME + auto mock = mocking_utils::patch( + "lib:rcl", rcutils_get_env, [](auto, const char ** env_value) { + static int counter = 1; + *env_value = ""; + if (counter == 1) { + counter++; + return static_cast(NULL); + } else { + return "argument env_value is null"; + } + }); + EXPECT_EQ(RCL_RET_ERROR, rcl_rmw_implementation_identifier_check()); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + } + { + // Fail copying RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME env result + // Set the variable, as is not set by default + const char * expected_rmw_id_matches = NULL; + const char * get_env_id_matches_name = rcutils_get_env( + RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, + &expected_rmw_id_matches); + EXPECT_FALSE(get_env_id_matches_name); + EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, "some_random_name")); + + // Return an allocated string as strdup would do for the first case + // calling the function + rcl_allocator_t allocator = rcl_get_default_allocator(); + size_t dummy_str_size = 3u; + char * new_string = static_cast(allocator.allocate(dummy_str_size, allocator.state)); + memset(new_string, '\0', dummy_str_size); + + auto mock = mocking_utils::patch( + "lib:rcl", rcutils_strdup, [&new_string](auto...) { + static int counter = 1; + if (counter == 1) { + counter++; + return new_string; + } else { + return static_cast(NULL); + } + }); + EXPECT_EQ(RCL_RET_BAD_ALLOC, rcl_rmw_implementation_identifier_check()); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, expected_rmw_id_matches)); + allocator.deallocate(new_string, allocator.state); + } + { + // Fail reading rmw_impl_identifier + auto mock = mocking_utils::patch_and_return( + "lib:rcl", rmw_get_implementation_identifier, static_cast(NULL)); + EXPECT_EQ(RCL_RET_ERROR, rcl_rmw_implementation_identifier_check()); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + } +} From 34d140e01f5a3b507f5680ba53ff3c90594744b2 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Wed, 12 Aug 2020 13:30:30 -0300 Subject: [PATCH 11/24] Add tests log_level Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 9907da622..2571d7a58 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -21,6 +21,7 @@ #include "rcutils/logging.h" #include "./arg_macros.hpp" +#include "./allocator_testing_utils.h" #include "../mocking_utils/patch.hpp" int setup_and_parse_log_level_args(const char * log_level_string) @@ -224,6 +225,59 @@ TEST(TestLogLevel, log_level_init_fini) { EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_fini(nullptr)); } +TEST(TestLogLevel, logger_log_level_copy) { + // Init to debug level to test before copy + rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); + GET_LOG_LEVEL_FROM_ARGUMENTS( + log_levels, "process_name", "--ros-args", + "--log-level", "rcl:=debug"); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); + }); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(1ul, log_levels.num_logger_settings); + EXPECT_STREQ("rcl", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, log_levels.logger_settings[0].level); + + // Expected usage + rcl_log_levels_t copied_log_levels = rcl_get_zero_initialized_log_levels(); + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_copy(&log_levels, &copied_log_levels)); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, copied_log_levels.default_logger_level); + EXPECT_EQ(log_levels.default_logger_level, copied_log_levels.default_logger_level); + EXPECT_EQ(1ul, copied_log_levels.num_logger_settings); + EXPECT_EQ(log_levels.num_logger_settings, copied_log_levels.num_logger_settings); + EXPECT_STREQ("rcl", copied_log_levels.logger_settings[0].name); + EXPECT_STREQ(log_levels.logger_settings[0].name, copied_log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, copied_log_levels.logger_settings[0].level); + EXPECT_EQ(log_levels.logger_settings[0].level, copied_log_levels.logger_settings[0].level); + + // Bad usage + rcl_log_levels_t empty_log_levels = rcl_get_zero_initialized_log_levels(); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_copy(nullptr, &empty_log_levels)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_copy(&log_levels, nullptr)); + // Already copied + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_copy(&log_levels, &copied_log_levels)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + + // null alloc + rcl_allocator_t saved_allocator = log_levels.allocator; + log_levels.allocator = {NULL, NULL, NULL, NULL, NULL}; + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_copy(&log_levels, &empty_log_levels)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + + // bad allocation + rcl_allocator_t bad_allocator = get_failing_allocator(); + log_levels.allocator = bad_allocator; + EXPECT_EQ(RCL_RET_BAD_ALLOC, rcl_log_levels_copy(&log_levels, &empty_log_levels)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + + log_levels.allocator = saved_allocator; +} + int main(int argc, char ** argv) { ::testing::InitGoogleTest(&argc, argv); From 98cdcfc1391e0404ff8f676da7a82120629fc07f Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Wed, 12 Aug 2020 13:46:06 -0300 Subject: [PATCH 12/24] Add bad_alloc test Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 2571d7a58..0f922cb81 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -222,6 +222,11 @@ TEST(TestLogLevel, log_level_init_fini) { EXPECT_TRUE(rcl_error_is_set()); rcl_reset_error(); + rcl_allocator_t bad_allocator = get_failing_allocator(); + rcl_log_levels_t empty_log_levels = rcl_get_zero_initialized_log_levels(); + EXPECT_EQ( + RCL_RET_BAD_ALLOC, rcl_log_levels_init(&empty_log_levels, &bad_allocator, capacity_count)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_log_levels_fini(nullptr)); } From a6f8e992b5ad13c299fa721a6338256659b242ee Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Wed, 12 Aug 2020 16:03:49 -0300 Subject: [PATCH 13/24] Add ini/fini for size 0 Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 0f922cb81..a53f05501 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -199,6 +199,14 @@ TEST(TestLogLevel, log_level_dot_logger_name) { TEST(TestLogLevel, log_level_init_fini) { rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); rcl_allocator_t allocator = rcl_get_default_allocator(); + + // Test zero size ini/fini + const size_t zero_count = 0; + EXPECT_EQ( + RCL_RET_OK, + rcl_log_levels_init(&log_levels, &allocator, &zero_count)); + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); + const size_t capacity_count = 1; EXPECT_EQ( RCL_RET_OK, From 19a3842f85bc8b4e8d80e7e6fca80958ef516785 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 10:00:22 -0300 Subject: [PATCH 14/24] Add tests add_logger_setting Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 59 ++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index a53f05501..22857390e 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -181,6 +181,24 @@ TEST(TestLogLevel, multiple_log_level_rightmost_prevail) { EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[0].level); } +TEST(TestLogLevel, multiple_log_level_names) { + rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); + GET_LOG_LEVEL_FROM_ARGUMENTS( + log_levels, "process_name", "--ros-args", + "--log-level", "debug", "--log-level", "rcl:=debug", + "--log-level", "test:=info"); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); + }); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, log_levels.default_logger_level); + EXPECT_EQ(2ul, log_levels.num_logger_settings); + EXPECT_STREQ("rcl", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, log_levels.logger_settings[0].level); + EXPECT_STREQ("test", log_levels.logger_settings[1].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[1].level); +} + TEST(TestLogLevel, log_level_dot_logger_name) { rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); GET_LOG_LEVEL_FROM_ARGUMENTS( @@ -204,7 +222,7 @@ TEST(TestLogLevel, log_level_init_fini) { const size_t zero_count = 0; EXPECT_EQ( RCL_RET_OK, - rcl_log_levels_init(&log_levels, &allocator, &zero_count)); + rcl_log_levels_init(&log_levels, &allocator, zero_count)); EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); const size_t capacity_count = 1; @@ -291,6 +309,45 @@ TEST(TestLogLevel, logger_log_level_copy) { log_levels.allocator = saved_allocator; } +TEST(TestLogLevel, test_add_logger_setting) { + rcl_log_levels_t log_levels = rcl_get_zero_initialized_log_levels(); + rcl_allocator_t allocator = rcl_get_default_allocator(); + size_t logger_count = 2u; + EXPECT_EQ( + RCL_RET_OK, rcl_log_levels_init(&log_levels, &allocator, logger_count)); + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_log_levels_fini(&log_levels)); + }); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(0ul, log_levels.num_logger_settings); + + EXPECT_EQ( + RCL_RET_OK, rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(1ul, log_levels.num_logger_settings); + EXPECT_STREQ("rcl", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, log_levels.logger_settings[0].level); + + EXPECT_EQ( + RCL_RET_OK, + rcl_log_levels_add_logger_setting(&log_levels, "rcutils", RCUTILS_LOG_SEVERITY_INFO)); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(2ul, log_levels.num_logger_settings); + EXPECT_STREQ("rcl", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, log_levels.logger_settings[0].level); + EXPECT_STREQ("rcutils", log_levels.logger_settings[1].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[1].level); + + // Can't add more than logger_count + EXPECT_EQ( + RCL_RET_ERROR, + rcl_log_levels_add_logger_setting(&log_levels, "rmw", RCUTILS_LOG_SEVERITY_DEBUG)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + EXPECT_EQ(2ul, log_levels.num_logger_settings); +} + int main(int argc, char ** argv) { ::testing::InitGoogleTest(&argc, argv); From ffd0890516050e271fac479050dca798e2295f7b Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 10:19:26 -0300 Subject: [PATCH 15/24] Add tests logger_settings Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 22857390e..0602d6330 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -322,6 +322,38 @@ TEST(TestLogLevel, test_add_logger_setting) { EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); EXPECT_EQ(0ul, log_levels.num_logger_settings); + // Invalid arguments + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_add_logger_setting(nullptr, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); + + rcl_log_levels_t not_ini_log_levels = rcl_get_zero_initialized_log_levels(); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_add_logger_setting(¬_ini_log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); + + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_add_logger_setting(&log_levels, nullptr, RCUTILS_LOG_SEVERITY_DEBUG)); + + rcl_allocator_t saved_allocator = log_levels.allocator; + log_levels.allocator = {NULL, NULL, NULL, NULL, NULL}; + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + + rcl_allocator_t bad_allocator = get_failing_allocator(); + log_levels.allocator = bad_allocator; + EXPECT_EQ( + RCL_RET_BAD_ALLOC, + rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); + EXPECT_TRUE(rcl_error_is_set()); + rcl_reset_error(); + log_levels.allocator = saved_allocator; + + // Expected usage EXPECT_EQ( RCL_RET_OK, rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); @@ -346,6 +378,17 @@ TEST(TestLogLevel, test_add_logger_setting) { EXPECT_TRUE(rcl_error_is_set()); rcl_reset_error(); EXPECT_EQ(2ul, log_levels.num_logger_settings); + + // Replacing saved logger + EXPECT_EQ( + RCL_RET_OK, + rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_INFO)); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_UNSET, log_levels.default_logger_level); + EXPECT_EQ(2ul, log_levels.num_logger_settings); + EXPECT_STREQ("rcl", log_levels.logger_settings[0].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[0].level); + EXPECT_STREQ("rcutils", log_levels.logger_settings[1].name); + EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, log_levels.logger_settings[1].level); } int main(int argc, char ** argv) From 19952dfe71f38a27c865b9ec38536d14377c03b0 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 10:29:30 -0300 Subject: [PATCH 16/24] Fix indentation Signed-off-by: Jorge Perez --- rcl/test/rcl/test_log_level.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/test/rcl/test_log_level.cpp b/rcl/test/rcl/test_log_level.cpp index 0602d6330..fbbe51944 100644 --- a/rcl/test/rcl/test_log_level.cpp +++ b/rcl/test/rcl/test_log_level.cpp @@ -338,7 +338,7 @@ TEST(TestLogLevel, test_add_logger_setting) { rcl_allocator_t saved_allocator = log_levels.allocator; log_levels.allocator = {NULL, NULL, NULL, NULL, NULL}; - EXPECT_EQ( + EXPECT_EQ( RCL_RET_INVALID_ARGUMENT, rcl_log_levels_add_logger_setting(&log_levels, "rcl", RCUTILS_LOG_SEVERITY_DEBUG)); EXPECT_TRUE(rcl_error_is_set()); From 6ad074c6bc8e38fca5154d397f4306910d05dab6 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 10:49:53 -0300 Subject: [PATCH 17/24] Remove extra deallocation Signed-off-by: Jorge Perez --- rcl/test/rcl/test_rmw_impl_id_check_func.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp index d621de55b..dfd295f5e 100644 --- a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp +++ b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp @@ -147,7 +147,8 @@ TEST(TestRmwCheck, test_mock_rmw_impl_check) { EXPECT_TRUE(rcl_error_is_set()); rcl_reset_error(); EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, expected_rmw_id_matches)); - allocator.deallocate(new_string, allocator.state); + // Deallocated on internal cleaunp + EXPECT_EQ(NULL, new_string); } { // Fail reading rmw_impl_identifier From efb7585b9e18f8219f0f97b34b9dcd78bc3b8442 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 11:03:03 -0300 Subject: [PATCH 18/24] Remove test Signed-off-by: Jorge Perez --- rcl/test/rcl/test_rmw_impl_id_check_func.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp index dfd295f5e..98114cd96 100644 --- a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp +++ b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp @@ -147,8 +147,6 @@ TEST(TestRmwCheck, test_mock_rmw_impl_check) { EXPECT_TRUE(rcl_error_is_set()); rcl_reset_error(); EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, expected_rmw_id_matches)); - // Deallocated on internal cleaunp - EXPECT_EQ(NULL, new_string); } { // Fail reading rmw_impl_identifier From bbe624137179c46db147fad0c35ea6a1a40a7b20 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 15:40:11 -0300 Subject: [PATCH 19/24] Add comment on dummy operators added Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index 5c07bf9e5..0d4271fda 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -449,6 +449,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_options_acce EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)); } +// Define dummy comparison operators for rcutils_allocator_t type for use with the Mimick Library MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, ==) MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, <) MOCKING_UTILS_BOOL_OPERATOR_RETURNS_FALSE(rcutils_allocator_t, >) From ecedb508f7faeefa1633b8921de5d1e8f500bc11 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 16:08:09 -0300 Subject: [PATCH 20/24] Change allocator call Signed-off-by: Jorge Perez --- rcl/test/rcl/test_rmw_impl_id_check_func.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp index 98114cd96..444554050 100644 --- a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp +++ b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp @@ -123,15 +123,15 @@ TEST(TestRmwCheck, test_mock_rmw_impl_check) { const char * get_env_id_matches_name = rcutils_get_env( RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, &expected_rmw_id_matches); - EXPECT_FALSE(get_env_id_matches_name); + EXPECT_EQ(NULL, get_env_id_matches_name); EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, "some_random_name")); // Return an allocated string as strdup would do for the first case // calling the function rcl_allocator_t allocator = rcl_get_default_allocator(); size_t dummy_str_size = 3u; - char * new_string = static_cast(allocator.allocate(dummy_str_size, allocator.state)); - memset(new_string, '\0', dummy_str_size); + char * new_string = static_cast(allocator.zero_allocate( + dummy_str_size, 1u, allocator.state)); auto mock = mocking_utils::patch( "lib:rcl", rcutils_strdup, [&new_string](auto...) { From 402b1065f643576dfa7cca0ce9e5eaea2754e5a4 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 16:19:04 -0300 Subject: [PATCH 21/24] Change mock to inject on return Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index 0d4271fda..d4bd512c3 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -468,7 +468,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_mocked_rcl_init_optio rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator()); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; - auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); + auto mock = mocking_utils::inject_on_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_fini(&init_options)); rcl_reset_error(); } @@ -488,7 +488,7 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_copy_mocked_ EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; }); - auto mock = mocking_utils::patch_and_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); + auto mock = mocking_utils::inject_on_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); rcl_reset_error(); } From 4a7573ad592dc160d0745f3f6cf5c5992fb64b45 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 16:57:59 -0300 Subject: [PATCH 22/24] Remove extra fini Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index d4bd512c3..a9607b85d 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -483,11 +483,6 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_copy_mocked_ EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str; }); rcl_init_options_t init_options_dst = rcl_get_zero_initialized_init_options(); - OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( - { - EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options_dst)) << rcl_get_error_string().str; - }); - auto mock = mocking_utils::inject_on_return("lib:rcl", rmw_init_options_fini, RMW_RET_ERROR); EXPECT_EQ(RCL_RET_ERROR, rcl_init_options_copy(&init_options, &init_options_dst)); rcl_reset_error(); From c4c9fb9c4cb16585de6ffa0528a6950970c4e718 Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Thu, 13 Aug 2020 17:56:09 -0300 Subject: [PATCH 23/24] Replace allocation with captured rcutils_strdup Signed-off-by: Jorge Perez --- rcl/test/rcl/test_rmw_impl_id_check_func.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp index 444554050..7d576f3d7 100644 --- a/rcl/test/rcl/test_rmw_impl_id_check_func.cpp +++ b/rcl/test/rcl/test_rmw_impl_id_check_func.cpp @@ -126,19 +126,14 @@ TEST(TestRmwCheck, test_mock_rmw_impl_check) { EXPECT_EQ(NULL, get_env_id_matches_name); EXPECT_TRUE(rcutils_set_env(RCL_ASSERT_RMW_ID_MATCHES_ENV_VAR_NAME, "some_random_name")); - // Return an allocated string as strdup would do for the first case - // calling the function - rcl_allocator_t allocator = rcl_get_default_allocator(); - size_t dummy_str_size = 3u; - char * new_string = static_cast(allocator.zero_allocate( - dummy_str_size, 1u, allocator.state)); - auto mock = mocking_utils::patch( - "lib:rcl", rcutils_strdup, [&new_string](auto...) { + "lib:rcl", rcutils_strdup, + [base = rcutils_strdup](const char * str, auto allocator) + { static int counter = 1; if (counter == 1) { counter++; - return new_string; + return base(str, allocator); } else { return static_cast(NULL); } From 0df49b982c72ca0dee8205a6a2d4d08b38e30cca Mon Sep 17 00:00:00 2001 From: Jorge Perez Date: Fri, 14 Aug 2020 18:33:13 -0300 Subject: [PATCH 24/24] Fix alpha order header Signed-off-by: Jorge Perez --- rcl/test/rcl/test_init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/test/rcl/test_init.cpp b/rcl/test/rcl/test_init.cpp index a9607b85d..1586e3285 100644 --- a/rcl/test/rcl/test_init.cpp +++ b/rcl/test/rcl/test_init.cpp @@ -25,8 +25,8 @@ #include "rcutils/snprintf.h" #include "./allocator_testing_utils.h" -#include "../src/rcl/init_options_impl.h" #include "../mocking_utils/patch.hpp" +#include "../src/rcl/init_options_impl.h" #ifdef RMW_IMPLEMENTATION # define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX