From c9b156ac639d54bcc0c159534170435359b1bdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Wed, 30 Sep 2020 21:26:49 +0200 Subject: [PATCH] Added rmw_service_server_is_available tests (#140) Signed-off-by: ahcorde --- test_rmw_implementation/CMakeLists.txt | 1 + test_rmw_implementation/test/test_client.cpp | 86 +++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/test_rmw_implementation/CMakeLists.txt b/test_rmw_implementation/CMakeLists.txt index f522863c..c24e6405 100644 --- a/test_rmw_implementation/CMakeLists.txt +++ b/test_rmw_implementation/CMakeLists.txt @@ -153,6 +153,7 @@ if(BUILD_TESTING) ament_add_gtest(test_client${target_suffix} test/test_client.cpp ENV ${rmw_implementation_env_var} + TIMEOUT 120 ) target_compile_definitions(test_client${target_suffix} PUBLIC "RMW_IMPLEMENTATION=${rmw_implementation}") diff --git a/test_rmw_implementation/test/test_client.cpp b/test_rmw_implementation/test/test_client.cpp index 9832b277..9a6031d7 100644 --- a/test_rmw_implementation/test/test_client.cpp +++ b/test_rmw_implementation/test/test_client.cpp @@ -18,6 +18,7 @@ #include "rcutils/allocator.h" #include "rcutils/strdup.h" +#include "rcutils/testing/fault_injection.h" #include "rmw/rmw.h" #include "rmw/error_handling.h" @@ -158,10 +159,7 @@ class CLASSNAME (TestClientUse, RMW_IMPLEMENTATION) void SetUp() override { Base::SetUp(); - constexpr char service_name[] = "/test"; - const rosidl_service_type_support_t * ts = - ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes); - client = rmw_create_client(node, ts, service_name, &rmw_qos_profile_default); + client = rmw_create_client(node, ts, service_name, &qos_profile); ASSERT_NE(nullptr, client) << rmw_get_error_string().str; } @@ -173,6 +171,10 @@ class CLASSNAME (TestClientUse, RMW_IMPLEMENTATION) } rmw_client_t * client{nullptr}; + const char * const service_name = "/test"; + const rosidl_service_type_support_t * ts{ + ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes)}; + rmw_qos_profile_t qos_profile{rmw_qos_profile_default}; }; TEST_F(CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), destroy_with_null_node) { @@ -309,3 +311,79 @@ TEST_F(CLASSNAME(TestClient, RMW_IMPLEMENTATION), take_response_with_bad_argumen EXPECT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str; rmw_reset_error(); } + +TEST_F(CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), service_server_is_available_bad_args) +{ + bool is_available; + rmw_ret_t ret = rmw_service_server_is_available(nullptr, client, &is_available); + EXPECT_EQ(ret, RMW_RET_ERROR) << rmw_get_error_string().str; + rmw_reset_error(); + + ret = rmw_service_server_is_available(node, nullptr, &is_available); + EXPECT_EQ(ret, RMW_RET_ERROR) << rmw_get_error_string().str; + rmw_reset_error(); + + ret = rmw_service_server_is_available(node, client, nullptr); + EXPECT_EQ(ret, RMW_RET_ERROR) << rmw_get_error_string().str; + rmw_reset_error(); + + const char * implementation_identifier = client->implementation_identifier; + client->implementation_identifier = "not-an-rmw-implementation-identifier"; + ret = rmw_service_server_is_available(node, client, &is_available); + client->implementation_identifier = implementation_identifier; + EXPECT_EQ(ret, RMW_RET_INCORRECT_RMW_IMPLEMENTATION) << rmw_get_error_string().str; + rmw_reset_error(); +} + +TEST_F(CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), service_server_is_available_good_args) +{ + bool is_available; + rmw_ret_t ret; + SLEEP_AND_RETRY_UNTIL(rmw_intraprocess_discovery_delay, rmw_intraprocess_discovery_delay * 10) { + ret = rmw_service_server_is_available(node, client, &is_available); + if (RMW_RET_OK == ret && is_available) { + break; + } + } + EXPECT_EQ(ret, RMW_RET_OK) << rmw_get_error_string().str; + EXPECT_FALSE(is_available) << rmw_get_error_string().str; + rmw_reset_error(); + + rmw_service_t * service = rmw_create_service(node, ts, service_name, &qos_profile); + ASSERT_NE(nullptr, client) << rcutils_get_error_string().str; + SLEEP_AND_RETRY_UNTIL(rmw_intraprocess_discovery_delay, rmw_intraprocess_discovery_delay * 10) { + ret = rmw_service_server_is_available(node, client, &is_available); + if (RMW_RET_OK == ret && is_available) { + break; + } + } + EXPECT_EQ(ret, RMW_RET_OK) << rmw_get_error_string().str; + EXPECT_TRUE(is_available) << rmw_get_error_string().str; + rmw_reset_error(); + + ret = rmw_destroy_service(node, service); + EXPECT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str; +} + +TEST_F(CLASSNAME(TestClient, RMW_IMPLEMENTATION), create_client_with_internal_errors) +{ + RCUTILS_FAULT_INJECTION_TEST( + { + const rosidl_service_type_support_t * ts = ROSIDL_GET_SRV_TYPE_SUPPORT( + test_msgs, srv, BasicTypes); + rmw_client_t * client_fault = rmw_create_client( + node, ts, "/service_name_test", + &rmw_qos_profile_default); + + int64_t count = rcutils_fault_injection_get_count(); + rcutils_fault_injection_set_count(RCUTILS_FAULT_INJECTION_NEVER_FAIL); + + if (client_fault != nullptr) { + rmw_ret_t ret = rmw_destroy_client(node, client_fault); + EXPECT_EQ(ret, RMW_RET_OK) << rcutils_get_error_string().str; + } else { + rmw_reset_error(); + } + rcutils_fault_injection_set_count(count); + }); +}