Skip to content

Commit

Permalink
Added rmw_service_server_is_available tests (#140)
Browse files Browse the repository at this point in the history
Signed-off-by: ahcorde <ahcorde@gmail.com>
  • Loading branch information
ahcorde committed Oct 21, 2020
1 parent 1cf03a4 commit c9b156a
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 4 deletions.
1 change: 1 addition & 0 deletions test_rmw_implementation/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down
86 changes: 82 additions & 4 deletions test_rmw_implementation/test/test_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}

Expand All @@ -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) {
Expand Down Expand Up @@ -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);
});
}

0 comments on commit c9b156a

Please sign in to comment.