1818
1919#include " rcutils/allocator.h"
2020#include " rcutils/strdup.h"
21+ #include " rcutils/testing/fault_injection.h"
2122
2223#include " rmw/rmw.h"
2324#include " rmw/error_handling.h"
@@ -158,10 +159,7 @@ class CLASSNAME (TestClientUse, RMW_IMPLEMENTATION)
158159 void SetUp () override
159160 {
160161 Base::SetUp ();
161- constexpr char service_name[] = " /test" ;
162- const rosidl_service_type_support_t * ts =
163- ROSIDL_GET_SRV_TYPE_SUPPORT (test_msgs, srv, BasicTypes);
164- client = rmw_create_client (node, ts, service_name, &rmw_qos_profile_default);
162+ client = rmw_create_client (node, ts, service_name, &qos_profile);
165163 ASSERT_NE (nullptr , client) << rmw_get_error_string ().str ;
166164 }
167165
@@ -173,6 +171,10 @@ class CLASSNAME (TestClientUse, RMW_IMPLEMENTATION)
173171 }
174172
175173 rmw_client_t * client{nullptr };
174+ const char * const service_name = " /test" ;
175+ const rosidl_service_type_support_t * ts{
176+ ROSIDL_GET_SRV_TYPE_SUPPORT (test_msgs, srv, BasicTypes)};
177+ rmw_qos_profile_t qos_profile{rmw_qos_profile_default};
176178};
177179
178180TEST_F (CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), destroy_with_null_node) {
@@ -309,3 +311,79 @@ TEST_F(CLASSNAME(TestClient, RMW_IMPLEMENTATION), take_response_with_bad_argumen
309311 EXPECT_EQ (RMW_RET_OK, ret) << rmw_get_error_string ().str ;
310312 rmw_reset_error ();
311313}
314+
315+ TEST_F (CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), service_server_is_available_bad_args)
316+ {
317+ bool is_available;
318+ rmw_ret_t ret = rmw_service_server_is_available (nullptr , client, &is_available);
319+ EXPECT_EQ (ret, RMW_RET_ERROR) << rmw_get_error_string ().str ;
320+ rmw_reset_error ();
321+
322+ ret = rmw_service_server_is_available (node, nullptr , &is_available);
323+ EXPECT_EQ (ret, RMW_RET_ERROR) << rmw_get_error_string ().str ;
324+ rmw_reset_error ();
325+
326+ ret = rmw_service_server_is_available (node, client, nullptr );
327+ EXPECT_EQ (ret, RMW_RET_ERROR) << rmw_get_error_string ().str ;
328+ rmw_reset_error ();
329+
330+ const char * implementation_identifier = client->implementation_identifier ;
331+ client->implementation_identifier = " not-an-rmw-implementation-identifier" ;
332+ ret = rmw_service_server_is_available (node, client, &is_available);
333+ client->implementation_identifier = implementation_identifier;
334+ EXPECT_EQ (ret, RMW_RET_INCORRECT_RMW_IMPLEMENTATION) << rmw_get_error_string ().str ;
335+ rmw_reset_error ();
336+ }
337+
338+ TEST_F (CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), service_server_is_available_good_args)
339+ {
340+ bool is_available;
341+ rmw_ret_t ret;
342+ SLEEP_AND_RETRY_UNTIL (rmw_intraprocess_discovery_delay, rmw_intraprocess_discovery_delay * 10 ) {
343+ ret = rmw_service_server_is_available (node, client, &is_available);
344+ if (RMW_RET_OK == ret && is_available) {
345+ break ;
346+ }
347+ }
348+ EXPECT_EQ (ret, RMW_RET_OK) << rmw_get_error_string ().str ;
349+ EXPECT_FALSE (is_available) << rmw_get_error_string ().str ;
350+ rmw_reset_error ();
351+
352+ rmw_service_t * service = rmw_create_service (node, ts, service_name, &qos_profile);
353+ ASSERT_NE (nullptr , client) << rcutils_get_error_string ().str ;
354+ SLEEP_AND_RETRY_UNTIL (rmw_intraprocess_discovery_delay, rmw_intraprocess_discovery_delay * 10 ) {
355+ ret = rmw_service_server_is_available (node, client, &is_available);
356+ if (RMW_RET_OK == ret && is_available) {
357+ break ;
358+ }
359+ }
360+ EXPECT_EQ (ret, RMW_RET_OK) << rmw_get_error_string ().str ;
361+ EXPECT_TRUE (is_available) << rmw_get_error_string ().str ;
362+ rmw_reset_error ();
363+
364+ ret = rmw_destroy_service (node, service);
365+ EXPECT_EQ (RMW_RET_OK, ret) << rmw_get_error_string ().str ;
366+ }
367+
368+ TEST_F (CLASSNAME(TestClient, RMW_IMPLEMENTATION), create_client_with_internal_errors)
369+ {
370+ RCUTILS_FAULT_INJECTION_TEST (
371+ {
372+ const rosidl_service_type_support_t * ts = ROSIDL_GET_SRV_TYPE_SUPPORT (
373+ test_msgs, srv, BasicTypes);
374+ rmw_client_t * client_fault = rmw_create_client (
375+ node, ts, " /service_name_test" ,
376+ &rmw_qos_profile_default);
377+
378+ int64_t count = rcutils_fault_injection_get_count ();
379+ rcutils_fault_injection_set_count (RCUTILS_FAULT_INJECTION_NEVER_FAIL);
380+
381+ if (client_fault != nullptr ) {
382+ rmw_ret_t ret = rmw_destroy_client (node, client_fault);
383+ EXPECT_EQ (ret, RMW_RET_OK) << rcutils_get_error_string ().str ;
384+ } else {
385+ rmw_reset_error ();
386+ }
387+ rcutils_fault_injection_set_count (count);
388+ });
389+ }
0 commit comments