Skip to content

Commit e8746fe

Browse files
authored
Added rmw_service_server_is_available tests (#140)
Signed-off-by: ahcorde <[email protected]>
1 parent 11b5845 commit e8746fe

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

test_rmw_implementation/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ if(BUILD_TESTING)
153153
ament_add_gtest(test_client${target_suffix}
154154
test/test_client.cpp
155155
ENV ${rmw_implementation_env_var}
156+
TIMEOUT 120
156157
)
157158
target_compile_definitions(test_client${target_suffix}
158159
PUBLIC "RMW_IMPLEMENTATION=${rmw_implementation}")

test_rmw_implementation/test/test_client.cpp

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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

178180
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
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

Comments
 (0)