Skip to content
This repository has been archived by the owner on Jun 10, 2021. It is now read-only.

Add unit test for composeability of nodes #76

Merged
merged 3 commits into from Jan 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions system_metrics_collector/CMakeLists.txt
Expand Up @@ -78,6 +78,7 @@ ament_target_dependencies(linux_memory_collector)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
find_package(ament_cmake_gtest REQUIRED)
find_package(class_loader REQUIRED)
find_package(lifecycle_msgs REQUIRED)

ament_lint_auto_find_test_dependencies()
Expand Down Expand Up @@ -122,6 +123,10 @@ if(BUILD_TESTING)
target_link_libraries(test_periodic_measurement_node system_metrics_collector)
ament_target_dependencies(test_periodic_measurement_node lifecycle_msgs metrics_statistics_msgs rclcpp)

ament_add_gtest(test_composition
test/system_metrics_collector/test_composition.cpp)
ament_target_dependencies(test_composition class_loader rclcpp rclcpp_components)

ament_add_gtest(test_utilities
test/system_metrics_collector/test_utilities.cpp)
target_link_libraries(test_utilities system_metrics_collector)
Expand Down
1 change: 1 addition & 0 deletions system_metrics_collector/package.xml
Expand Up @@ -26,6 +26,7 @@
<test_depend>ament_cmake_gtest</test_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<test_depend>class_loader</test_depend>
<test_depend>lifecycle_msgs</test_depend>
<test_depend>rclcpp</test_depend>
<test_depend>rclcpp_components</test_depend>
Expand Down
@@ -0,0 +1,72 @@
// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// 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 <memory>
#include <string>
#include <vector>

#include "class_loader/class_loader.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_components/node_factory.hpp"

#include "test_constants.hpp"

namespace
{
constexpr const char kSystemMetricsCollectorLibName[] = "libsystem_metrics_collector.so";
constexpr const std::array<const char *, 2> kExpectedClassNames = {
"system_metrics_collector::LinuxProcessCpuMeasurementNode",
"system_metrics_collector::LinuxProcessMemoryMeasurementNode"
};
}

bool IsExpectedClassName(const std::string & class_name)
{
auto result = std::find_if(kExpectedClassNames.cbegin(), kExpectedClassNames.cend(),
[&class_name](const char * expected_class_name) {
return class_name.find(expected_class_name) != std::string::npos;
});
return result != kExpectedClassNames.cend();
}

TEST(TestComposeableNodes, DlopenTest)
{
rclcpp::init(0, nullptr);
rclcpp::executors::SingleThreadedExecutor exec;
rclcpp::NodeOptions options;

const auto loader = std::make_unique<class_loader::ClassLoader>(kSystemMetricsCollectorLibName);
const auto class_names = loader->getAvailableClasses<rclcpp_components::NodeFactory>();
ASSERT_EQ(kExpectedClassNames.size(), class_names.size());

std::vector<rclcpp_components::NodeInstanceWrapper> node_wrappers;
for (const auto & class_name : class_names) {
ASSERT_TRUE(IsExpectedClassName(class_name));
const auto node_factory = loader->createInstance<rclcpp_components::NodeFactory>(class_name);
auto wrapper = node_factory->create_node_instance(options);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const?

Copy link
Member Author

@mm318 mm318 Jan 21, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can't be const because get_node_base_interface() is not a const member function.

exec.add_node(wrapper.get_node_base_interface());
node_wrappers.push_back(wrapper);
}

std::promise<bool> empty_promise;
std::shared_future<bool> dummy_future = empty_promise.get_future();
exec.spin_until_future_complete(dummy_future, test_constants::kTestDuration);

for (auto & wrapper : node_wrappers) {
exec.remove_node(wrapper.get_node_base_interface());
}
rclcpp::shutdown();
}