From 0aad666b967aee8d59e6604cbedd0ccd05d3f0d1 Mon Sep 17 00:00:00 2001 From: Stephen Brawner Date: Tue, 28 Jul 2020 16:36:34 -0700 Subject: [PATCH 1/2] Add fault injection macros and test Signed-off-by: Stephen Brawner --- rosidl_runtime_c/CMakeLists.txt | 4 +++- rosidl_runtime_c/package.xml | 1 + rosidl_runtime_c/src/string_functions.c | 6 ++++++ rosidl_runtime_c/src/u16string_functions.c | 6 ++++++ rosidl_runtime_c/test/test_string_functions.cpp | 16 ++++++++++++++++ .../test/test_u16string_functions.cpp | 15 +++++++++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/rosidl_runtime_c/CMakeLists.txt b/rosidl_runtime_c/CMakeLists.txt index 89d4f9f11..8507a0654 100644 --- a/rosidl_runtime_c/CMakeLists.txt +++ b/rosidl_runtime_c/CMakeLists.txt @@ -12,6 +12,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif() find_package(ament_cmake_ros REQUIRED) +find_package(rcutils REQUIRED) find_package(rosidl_typesupport_interface REQUIRED) add_library(${PROJECT_NAME} @@ -26,6 +27,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC "$" "$") ament_target_dependencies(${PROJECT_NAME} + "rcutils" "rosidl_typesupport_interface") if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_target_properties(${PROJECT_NAME} PROPERTIES @@ -36,7 +38,7 @@ if(WIN32) PRIVATE "ROSIDL_GENERATOR_C_BUILDING_DLL") endif() -ament_export_dependencies(rosidl_typesupport_interface) +ament_export_dependencies(rcutils rosidl_typesupport_interface) ament_export_include_directories(include) ament_export_libraries(${PROJECT_NAME}) ament_export_targets(${PROJECT_NAME}) diff --git a/rosidl_runtime_c/package.xml b/rosidl_runtime_c/package.xml index d750126d6..2ebf9bb6b 100644 --- a/rosidl_runtime_c/package.xml +++ b/rosidl_runtime_c/package.xml @@ -13,6 +13,7 @@ ament_cmake + rcutils rosidl_typesupport_interface ament_lint_auto diff --git a/rosidl_runtime_c/src/string_functions.c b/rosidl_runtime_c/src/string_functions.c index dc63be2d0..2e4ef3464 100644 --- a/rosidl_runtime_c/src/string_functions.c +++ b/rosidl_runtime_c/src/string_functions.c @@ -19,9 +19,13 @@ #include #include +#include "rcutils/macros.h" + bool rosidl_runtime_c__String__init(rosidl_runtime_c__String * str) { + RCUTILS_CAN_RETURN_WITH_ERROR_OF(false); + if (!str) { return false; } @@ -113,6 +117,8 @@ bool rosidl_runtime_c__String__Sequence__init( rosidl_runtime_c__String__Sequence * sequence, size_t size) { + RCUTILS_CAN_RETURN_WITH_ERROR_OF(false); + if (!sequence) { return false; } diff --git a/rosidl_runtime_c/src/u16string_functions.c b/rosidl_runtime_c/src/u16string_functions.c index 7e316ecab..9ae5e4faf 100644 --- a/rosidl_runtime_c/src/u16string_functions.c +++ b/rosidl_runtime_c/src/u16string_functions.c @@ -19,9 +19,13 @@ #include #include +#include "rcutils/macros.h" + bool rosidl_runtime_c__U16String__init(rosidl_runtime_c__U16String * str) { + RCUTILS_CAN_RETURN_WITH_ERROR_OF(false); + if (!str) { return false; } @@ -156,6 +160,8 @@ bool rosidl_runtime_c__U16String__Sequence__init( rosidl_runtime_c__U16String__Sequence * sequence, size_t size) { + RCUTILS_CAN_RETURN_WITH_ERROR_OF(false); + if (!sequence) { return false; } diff --git a/rosidl_runtime_c/test/test_string_functions.cpp b/rosidl_runtime_c/test/test_string_functions.cpp index f57b7d6e1..0030dc4ce 100644 --- a/rosidl_runtime_c/test/test_string_functions.cpp +++ b/rosidl_runtime_c/test/test_string_functions.cpp @@ -16,6 +16,8 @@ #include "rosidl_runtime_c/string.h" #include "rosidl_runtime_c/string_functions.h" +#include "rcutils/testing/fault_injection.h" + TEST(string_functions, init_fini_empty_string) { rosidl_runtime_c__String empty_string; EXPECT_TRUE(rosidl_runtime_c__String__init(&empty_string)); @@ -152,3 +154,17 @@ TEST(string_functions, create_destroy_sequence) { EXPECT_EQ(sequence->capacity, seq_size); rosidl_runtime_c__String__Sequence__destroy(sequence); } + +TEST(string_functions, create_destroy_sequence_maybe_fail) { + rosidl_runtime_c__String__Sequence * sequence = nullptr; + constexpr size_t seq_size = 10u; + + RCUTILS_FAULT_INJECTION_TEST( + { + sequence = rosidl_runtime_c__String__Sequence__create(seq_size); + if (nullptr != sequence) { + rosidl_runtime_c__String__Sequence__destroy(sequence); + sequence = nullptr; + } + }); +} diff --git a/rosidl_runtime_c/test/test_u16string_functions.cpp b/rosidl_runtime_c/test/test_u16string_functions.cpp index c6f0aaf11..b42e718ca 100644 --- a/rosidl_runtime_c/test/test_u16string_functions.cpp +++ b/rosidl_runtime_c/test/test_u16string_functions.cpp @@ -16,6 +16,8 @@ #include "rosidl_runtime_c/u16string.h" #include "rosidl_runtime_c/u16string_functions.h" +#include "rcutils/testing/fault_injection.h" + TEST(u16string_functions, init_fini_empty_string) { rosidl_runtime_c__U16String empty_string; EXPECT_TRUE(rosidl_runtime_c__U16String__init(&empty_string)); @@ -182,3 +184,16 @@ TEST(u16string_functions, create_destroy_sequence) { EXPECT_EQ(sequence->capacity, seq_size); rosidl_runtime_c__U16String__Sequence__destroy(sequence); } + +TEST(string_functions, create_destroy_sequence_maybe_fail) { + rosidl_runtime_c__U16String__Sequence * sequence = nullptr; + constexpr size_t seq_size = 10u; + RCUTILS_FAULT_INJECTION_TEST( + { + sequence = rosidl_runtime_c__U16String__Sequence__create(seq_size); + if (nullptr != sequence) { + rosidl_runtime_c__U16String__Sequence__destroy(sequence); + sequence = nullptr; + } + }); +} From 43b6e0c32e032f2935b482a31957200d949a7872 Mon Sep 17 00:00:00 2001 From: Stephen Brawner Date: Fri, 7 Aug 2020 15:36:47 -0700 Subject: [PATCH 2/2] target definitions Signed-off-by: Stephen Brawner --- rosidl_runtime_c/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rosidl_runtime_c/CMakeLists.txt b/rosidl_runtime_c/CMakeLists.txt index 8507a0654..695120bac 100644 --- a/rosidl_runtime_c/CMakeLists.txt +++ b/rosidl_runtime_c/CMakeLists.txt @@ -38,6 +38,10 @@ if(WIN32) PRIVATE "ROSIDL_GENERATOR_C_BUILDING_DLL") endif() +if(BUILD_TESTING AND NOT RCUTILS_DISABLE_FAULT_INJECTION) + target_compile_definitions(${PROJECT_NAME} PUBLIC RCUTILS_ENABLE_FAULT_INJECTION) +endif() + ament_export_dependencies(rcutils rosidl_typesupport_interface) ament_export_include_directories(include) ament_export_libraries(${PROJECT_NAME}) @@ -88,12 +92,14 @@ if(BUILD_TESTING) if(TARGET test_string_functions) target_include_directories(test_string_functions PUBLIC include) target_link_libraries(test_string_functions ${PROJECT_NAME}) + target_compile_definitions(test_string_functions PUBLIC RCUTILS_ENABLE_FAULT_INJECTION) endif() ament_add_gtest(test_u16string_functions test/test_u16string_functions.cpp) if(TARGET test_u16string_functions) target_include_directories(test_u16string_functions PUBLIC include) target_link_libraries(test_u16string_functions ${PROJECT_NAME}) + target_compile_definitions(test_u16string_functions PUBLIC RCUTILS_ENABLE_FAULT_INJECTION) endif() endif()