diff --git a/test_rmw_implementation/test/test_init_shutdown.cpp b/test_rmw_implementation/test/test_init_shutdown.cpp index 6f47c096..9595be35 100644 --- a/test_rmw_implementation/test/test_init_shutdown.cpp +++ b/test_rmw_implementation/test/test_init_shutdown.cpp @@ -14,8 +14,6 @@ #include -#include "osrf_testing_tools_cpp/scope_exit.hpp" - #include "rcutils/allocator.h" #include "rcutils/error_handling.h" @@ -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; }