Namespace impl (#135)

* massive fprints everywhere

* add rcl test for namespacing

* client server test

* organize test folder

* address review comments
This commit is contained in:
Karsten Knese 2017-05-18 11:45:16 -07:00 committed by William Woodall
parent 853c2e30a5
commit d433ee193c
6 changed files with 149 additions and 4 deletions

View file

@ -6,9 +6,9 @@ find_package(std_msgs REQUIRED)
find_package(rmw_implementation_cmake REQUIRED) find_package(rmw_implementation_cmake REQUIRED)
include(rcl_add_custom_executable.cmake) include(cmake/rcl_add_custom_executable.cmake)
include(rcl_add_custom_gtest.cmake) include(cmake/rcl_add_custom_gtest.cmake)
include(rcl_add_custom_launch_test.cmake) include(cmake/rcl_add_custom_launch_test.cmake)
set(extra_test_libraries) set(extra_test_libraries)
set(extra_test_env) set(extra_test_env)
@ -137,6 +137,14 @@ function(test_target_function)
AMENT_DEPENDENCIES ${rmw_implementation} AMENT_DEPENDENCIES ${rmw_implementation}
) )
rcl_add_custom_gtest(test_namespace${target_suffix}
SRCS test_namespace.cpp
ENV ${extra_test_env}
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
LIBRARIES ${PROJECT_NAME} ${extra_test_libraries}
AMENT_DEPENDENCIES ${rmw_implementation} "example_interfaces"
)
# Launch tests # Launch tests
rcl_add_custom_executable(service_fixture${target_suffix} rcl_add_custom_executable(service_fixture${target_suffix}

View file

@ -28,7 +28,7 @@ if(WIN32) # (memory tools doesn't do anything on Windows)
set(SKIP_TEST "SKIP_TEST") set(SKIP_TEST "SKIP_TEST")
endif() endif()
include(../rcl_add_custom_gtest.cmake) include(../cmake/rcl_add_custom_gtest.cmake)
rcl_add_custom_gtest(test_memory_tools rcl_add_custom_gtest(test_memory_tools
SRCS test_memory_tools.cpp SRCS test_memory_tools.cpp
ENV ${extra_test_env} ENV ${extra_test_env}

137
rcl/test/test_namespace.cpp Normal file
View file

@ -0,0 +1,137 @@
// Copyright 2017 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <gtest/gtest.h>
#include <chrono>
#include <thread>
#include "rcl/client.h"
#include "rcl/rcl.h"
#include "rcl/graph.h"
#include "example_interfaces/srv/add_two_ints.h"
#include "rosidl_generator_c/string_functions.h"
#include "./memory_tools/memory_tools.hpp"
#include "./scope_exit.hpp"
#include "rcl/error_handling.h"
using namespace std::chrono_literals;
class TestNamespaceFixture : public ::testing::Test
{
public:
rcl_node_t * node_ptr;
void SetUp()
{
stop_memory_checking();
rcl_ret_t ret;
ret = rcl_init(0, nullptr, rcl_get_default_allocator());
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
this->node_ptr = new rcl_node_t;
*this->node_ptr = rcl_get_zero_initialized_node();
const char * name = "rcl_test_namespace_node";
rcl_node_options_t node_options = rcl_node_get_default_options();
ret = rcl_node_init(this->node_ptr, name, "", &node_options);
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
set_on_unexpected_malloc_callback([]() {ASSERT_FALSE(true) << "UNEXPECTED MALLOC";});
set_on_unexpected_realloc_callback([]() {ASSERT_FALSE(true) << "UNEXPECTED REALLOC";});
set_on_unexpected_free_callback([]() {ASSERT_FALSE(true) << "UNEXPECTED FREE";});
start_memory_checking();
}
void TearDown()
{
assert_no_malloc_end();
assert_no_realloc_end();
assert_no_free_end();
stop_memory_checking();
set_on_unexpected_malloc_callback(nullptr);
set_on_unexpected_realloc_callback(nullptr);
set_on_unexpected_free_callback(nullptr);
rcl_ret_t ret = rcl_node_fini(this->node_ptr);
delete this->node_ptr;
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
ret = rcl_shutdown();
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
}
};
/* Basic nominal test of a client.
*/
TEST_F(TestNamespaceFixture, test_client_server) {
stop_memory_checking();
rcl_ret_t ret;
auto ts = ROSIDL_GET_SRV_TYPE_SUPPORT(example_interfaces, AddTwoInts);
const char * service_name = "/my/namespace/test_namespace_client_server";
const char * unmatched_client_name = "/your/namespace/test_namespace_client_server";
const char * matched_client_name = "/my/namespace/test_namespace_client_server";
auto timeout = 10;
rcl_service_t service = rcl_get_zero_initialized_service();
rcl_service_options_t service_options = rcl_service_get_default_options();
ret = rcl_service_init(&service, this->node_ptr, ts, service_name, &service_options);
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
auto service_exit = make_scope_exit([&service, this]() {
stop_memory_checking();
rcl_ret_t ret = rcl_service_fini(&service, this->node_ptr);
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
});
rcl_client_t unmatched_client = rcl_get_zero_initialized_client();
rcl_client_options_t unmatched_client_options = rcl_client_get_default_options();
ret = rcl_client_init(
&unmatched_client, this->node_ptr, ts, unmatched_client_name, &unmatched_client_options);
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
auto unmatched_client_exit = make_scope_exit([&unmatched_client, this]() {
stop_memory_checking();
rcl_ret_t ret = rcl_client_fini(&unmatched_client, this->node_ptr);
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
});
bool is_available = false;
for (auto i = 0; i < timeout; ++i) {
ret = rcl_service_server_is_available(this->node_ptr, &unmatched_client, &is_available);
if (is_available) {
// this should not happen
break;
}
std::this_thread::sleep_for(1s);
}
ASSERT_FALSE(is_available);
rcl_client_t matched_client = rcl_get_zero_initialized_client();
rcl_client_options_t matched_client_options = rcl_client_get_default_options();
ret = rcl_client_init(
&matched_client, this->node_ptr, ts, matched_client_name, &matched_client_options);
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
auto matched_client_exit = make_scope_exit([&matched_client, this]() {
stop_memory_checking();
rcl_ret_t ret = rcl_client_fini(&matched_client, this->node_ptr);
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe();
});
is_available = false;
for (auto i = 0; i < timeout; ++i) {
ret = rcl_service_server_is_available(this->node_ptr, &matched_client, &is_available);
if (is_available) {
break;
}
std::this_thread::sleep_for(1s);
}
ASSERT_TRUE(is_available);
}