Skip to content

Commit

Permalink
Complete init/shutdown API test coverage. (#107)
Browse files Browse the repository at this point in the history
Signed-off-by: Michel Hidalgo <michel@ekumenlabs.com>
  • Loading branch information
hidmic authored and ahcorde committed Oct 21, 2020
1 parent 9434124 commit 377ec2c
Showing 1 changed file with 124 additions and 15 deletions.
139 changes: 124 additions & 15 deletions test_rmw_implementation/test/test_init_shutdown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@

#include <gtest/gtest.h>

#include "osrf_testing_tools_cpp/scope_exit.hpp"

#include "rcutils/allocator.h"
#include "rcutils/error_handling.h"

Expand All @@ -28,27 +26,138 @@
# define CLASSNAME(NAME, SUFFIX) NAME
#endif

class CLASSNAME (TestInitShutdown, RMW_IMPLEMENTATION) : public ::testing::Test {};
class CLASSNAME (TestInitShutdown, RMW_IMPLEMENTATION) : public ::testing::Test
{
protected:
void SetUp() override
{
options = rmw_get_zero_initialized_init_options();
rmw_ret_t ret = rmw_init_options_init(&options, rcutils_get_default_allocator());
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
}

TEST_F(CLASSNAME(TestInitShutdown, RMW_IMPLEMENTATION), init_shutdown) {
rmw_context_t context = rmw_get_zero_initialized_context();
rmw_init_options_t options = rmw_get_zero_initialized_init_options();
rmw_ret_t ret = rmw_init_options_init(&options, rcutils_get_default_allocator());
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
void TearDown() override
{
rmw_ret_t ret = rmw_init_options_fini(&options);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
});
}

rmw_init_options_t options;
};

TEST_F(CLASSNAME(TestInitShutdown, RMW_IMPLEMENTATION), init_with_bad_arguments) {
rmw_context_t context = rmw_get_zero_initialized_context();
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, rmw_init(nullptr, &context));
rcutils_reset_error();

EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, rmw_init(&options, nullptr));
rcutils_reset_error();

rmw_init_options_t invalid_options = rmw_get_zero_initialized_init_options();
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, rmw_init(&invalid_options, &context));
rcutils_reset_error();

const char * implementation_identifier = options.implementation_identifier;
options.implementation_identifier = "not-a-real-rmw-implementation-identifier";
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, rmw_init(&options, &context));
options.implementation_identifier = implementation_identifier;
rcutils_reset_error();

// Initialization, shutdown, and finalization should still succeed
rmw_ret_t ret = rmw_init(&options, &context);
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
}

TEST_F(CLASSNAME(TestInitShutdown, RMW_IMPLEMENTATION), shutdown_with_bad_arguments) {
rmw_ret_t ret = rmw_shutdown(nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

rmw_context_t context = rmw_get_zero_initialized_context();
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

ret = rmw_init(&options, &context);
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
{
rmw_ret_t ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
});

const char * implementation_identifier = context.implementation_identifier;
context.implementation_identifier = "not-a-real-rmw-implementation-identifier";
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, rmw_shutdown(&context));
context.implementation_identifier = implementation_identifier;
rcutils_reset_error();

// Shutdown, and finalization should still succeed
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
}

TEST_F(CLASSNAME(TestInitShutdown, RMW_IMPLEMENTATION), context_fini_with_bad_arguments) {
rmw_ret_t ret = rmw_context_fini(nullptr);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

rmw_context_t context = rmw_get_zero_initialized_context();
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

ret = rmw_init(&options, &context);
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;

const char * implementation_identifier = context.implementation_identifier;
context.implementation_identifier = "not-a-real-rmw-implementation-identifier";
EXPECT_EQ(RMW_RET_INCORRECT_RMW_IMPLEMENTATION, rmw_context_fini(&context));
context.implementation_identifier = implementation_identifier;
rcutils_reset_error();

// Shutdown and finalization should still succeed
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
}

TEST_F(CLASSNAME(TestInitShutdown, RMW_IMPLEMENTATION), init_shutdown) {
rmw_context_t context = rmw_get_zero_initialized_context();
rmw_ret_t ret = rmw_init(&options, &context);
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;

// Initialization twice should fail
ret = rmw_init(&options, &context);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

// Finalization w/o shutdown should fail
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);
rcutils_reset_error();

ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;

// Shutdown twice should succeed
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;

ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;

// Finalization twice should fail
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_INVALID_ARGUMENT, ret);

// Initialization, shutdown, and finalization should still succeed
ret = rmw_init(&options, &context);
ASSERT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_shutdown(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
ret = rmw_context_fini(&context);
EXPECT_EQ(RMW_RET_OK, ret) << rcutils_get_error_string().str;
}

0 comments on commit 377ec2c

Please sign in to comment.