Skip to content

Commit

Permalink
Add tests service/client request/response with bad arguments (#141)
Browse files Browse the repository at this point in the history
Signed-off-by: lobotuerk <jtlorente@ekumenlabs.com>
  • Loading branch information
Lobotuerk committed Sep 29, 2020
1 parent 39a2bc3 commit ef60ec6
Show file tree
Hide file tree
Showing 2 changed files with 257 additions and 0 deletions.
105 changes: 105 additions & 0 deletions test_rmw_implementation/test/test_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,3 +204,108 @@ TEST_F(CLASSNAME(TestClientUse, RMW_IMPLEMENTATION), destroy_client_of_another_i
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret);
rmw_reset_error();
}

TEST_F(CLASSNAME(TestClient, RMW_IMPLEMENTATION), send_request_with_bad_arguments) {
constexpr char service_name[] = "/test";
const rosidl_service_type_support_t * ts =
ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes);
test_msgs__srv__BasicTypes_Request client_request;
ASSERT_TRUE(test_msgs__srv__BasicTypes_Request__init(&client_request));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
test_msgs__srv__BasicTypes_Request__fini(&client_request);
});
client_request.bool_value = false;
client_request.uint8_value = 1;
client_request.uint32_value = 2;
int64_t sequence_number;
rmw_client_t * client =
rmw_create_client(node, ts, service_name, &rmw_qos_profile_default);
ASSERT_NE(nullptr, client) << rmw_get_error_string().str;

rmw_ret_t ret = rmw_send_request(nullptr, &client_request, &sequence_number);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

ret = rmw_send_request(client, nullptr, &sequence_number);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

ret = rmw_send_request(client, &client_request, nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

const char * implementation_identifier = client->implementation_identifier;
client->implementation_identifier = "not-an-rmw-implementation-identifier";
ret = rmw_send_request(client, &client_request, &sequence_number);
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret) << rmw_get_error_string().str;
rmw_reset_error();
client->implementation_identifier = implementation_identifier;

ret = rmw_destroy_client(node, client);
EXPECT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;
rmw_reset_error();
}

TEST_F(CLASSNAME(TestClient, RMW_IMPLEMENTATION), take_response_with_bad_arguments) {
constexpr char service_name[] = "/test";
const rosidl_service_type_support_t * ts =
ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes);
test_msgs__srv__BasicTypes_Request client_request;
ASSERT_TRUE(test_msgs__srv__BasicTypes_Request__init(&client_request));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
test_msgs__srv__BasicTypes_Request__fini(&client_request);
});
client_request.bool_value = false;
client_request.uint8_value = 1;
client_request.uint32_value = 2;
bool taken = false;
rmw_service_info_t header;
rmw_client_t * client =
rmw_create_client(node, ts, service_name, &rmw_qos_profile_default);
ASSERT_NE(nullptr, client) << rmw_get_error_string().str;

rmw_ret_t ret = rmw_take_response(nullptr, &header, &client_request, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, client_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, client_request.uint8_value);
EXPECT_EQ(2u, client_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_response(client, nullptr, &client_request, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, client_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, client_request.uint8_value);
EXPECT_EQ(2u, client_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_response(client, &header, nullptr, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_response(client, &header, &client_request, nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, client_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, client_request.uint8_value);
EXPECT_EQ(2u, client_request.uint32_value);
rmw_reset_error();

const char * implementation_identifier = client->implementation_identifier;
client->implementation_identifier = "not-an-rmw-implementation-identifier";
ret = rmw_take_response(client, &header, &client_request, &taken);
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret) << rmw_get_error_string().str;
EXPECT_EQ(false, client_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, client_request.uint8_value);
EXPECT_EQ(2u, client_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();
client->implementation_identifier = implementation_identifier;

ret = rmw_destroy_client(node, client);
EXPECT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;
rmw_reset_error();
}
152 changes: 152 additions & 0 deletions test_rmw_implementation/test/test_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,3 +204,155 @@ TEST_F(CLASSNAME(TestServiceUse, RMW_IMPLEMENTATION), destroy_service_of_another
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret);
rmw_reset_error();
}

TEST_F(CLASSNAME(TestService, RMW_IMPLEMENTATION), take_request_with_bad_arguments) {
constexpr char service_name[] = "/test";
const rosidl_service_type_support_t * ts =
ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes);
test_msgs__srv__BasicTypes_Request service_request;
ASSERT_TRUE(test_msgs__srv__BasicTypes_Request__init(&service_request));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
test_msgs__srv__BasicTypes_Request__fini(&service_request);
});
service_request.bool_value = false;
service_request.uint8_value = 1;
service_request.uint32_value = 2;
bool taken = false;
rmw_service_info_t header;
rmw_service_t * srv =
rmw_create_service(node, ts, service_name, &rmw_qos_profile_default);
ASSERT_NE(nullptr, srv) << rmw_get_error_string().str;

rmw_ret_t ret = rmw_take_request(nullptr, &header, &service_request, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, service_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, service_request.uint8_value);
EXPECT_EQ(2u, service_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_request(srv, nullptr, &service_request, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, service_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, service_request.uint8_value);
EXPECT_EQ(2u, service_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_request(srv, &header, nullptr, &taken);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, taken);
rmw_reset_error();

ret = rmw_take_request(srv, &header, &service_request, nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
EXPECT_EQ(false, service_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, service_request.uint8_value);
EXPECT_EQ(2u, service_request.uint32_value);
rmw_reset_error();

const char * implementation_identifier = srv->implementation_identifier;
srv->implementation_identifier = "not-an-rmw-implementation-identifier";
ret = rmw_take_request(srv, &header, &service_request, &taken);
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret) << rmw_get_error_string().str;
EXPECT_EQ(false, service_request.bool_value); // Verify post conditions
EXPECT_EQ(1u, service_request.uint8_value);
EXPECT_EQ(2u, service_request.uint32_value);
EXPECT_EQ(false, taken);
rmw_reset_error();
srv->implementation_identifier = implementation_identifier;

ret = rmw_destroy_service(node, srv);
EXPECT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;
rmw_reset_error();
}

TEST_F(CLASSNAME(TestService, RMW_IMPLEMENTATION), send_reponse_with_bad_arguments) {
constexpr char service_name[] = "/test";
const rosidl_service_type_support_t * ts =
ROSIDL_GET_SRV_TYPE_SUPPORT(test_msgs, srv, BasicTypes);
test_msgs__srv__BasicTypes_Response service_response;
ASSERT_TRUE(test_msgs__srv__BasicTypes_Response__init(&service_response));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
test_msgs__srv__BasicTypes_Response__fini(&service_response);
});
service_response.bool_value = false;
service_response.uint8_value = 1;
service_response.uint32_value = 2;
test_msgs__srv__BasicTypes_Request request;
ASSERT_TRUE(test_msgs__srv__BasicTypes_Request__init(&request));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
test_msgs__srv__BasicTypes_Request__fini(&request);
});
request.bool_value = false;
request.uint8_value = 1;
request.uint32_value = 2;
int64_t sequence_number;
rmw_service_info_t header;
rmw_service_t * srv =
rmw_create_service(node, ts, service_name, &rmw_qos_profile_default);
ASSERT_NE(nullptr, srv) << rmw_get_error_string().str;
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
rmw_ret_t ret = rmw_destroy_service(node, srv);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
});
rmw_client_t * client =
rmw_create_client(node, ts, service_name, &rmw_qos_profile_default);
ASSERT_NE(nullptr, client) << rmw_get_error_string().str;
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
rmw_ret_t ret = rmw_destroy_client(node, client);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
});

rmw_ret_t ret = rmw_send_request(client, &request, &sequence_number);
ASSERT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;

size_t number_of_services = 1u;
rmw_wait_set_t * wait_set = rmw_create_wait_set(&context, number_of_services);
ASSERT_NE(nullptr, wait_set) << rmw_get_error_string().str;
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
rmw_ret_t ret = rmw_destroy_wait_set(wait_set);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
});
void * array[1];
array[0] = srv->data;
rmw_services_t srv_array;
srv_array.service_count = 1u;
srv_array.services = array;
rmw_time_t timeout;
timeout.sec = 0;
timeout.nsec = rmw_intraprocess_discovery_delay.count() * 1000;
ret = rmw_wait(nullptr, nullptr, &srv_array, nullptr, nullptr, wait_set, &timeout);
ASSERT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;
ASSERT_NE(nullptr, srv_array.services[0]);

bool taken = false;
ret = rmw_take_request(srv, &header, &request, &taken);
ASSERT_EQ(RMW_RET_OK, ret) << rmw_get_error_string().str;
ASSERT_EQ(true, taken);

ret = rmw_send_response(nullptr, &header.request_id, &service_response);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

ret = rmw_send_response(srv, nullptr, &service_response);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

ret = rmw_send_response(srv, &header.request_id, nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rmw_reset_error();

const char * implementation_identifier = srv->implementation_identifier;
srv->implementation_identifier = "not-an-rmw-implementation-identifier";
ret = rmw_send_response(srv, &header.request_id, &service_response);
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, ret) << rmw_get_error_string().str;
rmw_reset_error();
srv->implementation_identifier = implementation_identifier;
}

0 comments on commit ef60ec6

Please sign in to comment.