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 2 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 @@ -28,6 +28,7 @@ endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(class_loader REQUIRED)
mm318 marked this conversation as resolved.
Show resolved Hide resolved
find_package(metrics_statistics_msgs REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
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
@@ -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);
auto class_names = loader->getAvailableClasses<rclcpp_components::NodeFactory>();
mm318 marked this conversation as resolved.
Show resolved Hide resolved
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));
auto node_factory = loader->createInstance<rclcpp_components::NodeFactory>(class_name);
mm318 marked this conversation as resolved.
Show resolved Hide resolved
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();
}