diff --git a/rosidl_runtime_c/CMakeLists.txt b/rosidl_runtime_c/CMakeLists.txt index 89d4f9f11..695120bac 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,11 @@ if(WIN32) PRIVATE "ROSIDL_GENERATOR_C_BUILDING_DLL") endif() -ament_export_dependencies(rosidl_typesupport_interface) +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}) ament_export_targets(${PROJECT_NAME}) @@ -86,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() 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; + } + }); +}