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

Replace IMU messages with new dummy messages #121

Merged
merged 3 commits into from Apr 2, 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
14 changes: 12 additions & 2 deletions libstatistics_collector/CMakeLists.txt
Expand Up @@ -30,6 +30,13 @@ endif()
find_package(ament_cmake REQUIRED)
find_package(rcl REQUIRED)
find_package(rcpputils REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)

rosidl_generate_interfaces(libstatistics_collector_test_msgs
"test/msg/DummyMessage.msg"
DEPENDENCIES std_msgs
)

include_directories(include)

Expand Down Expand Up @@ -67,9 +74,12 @@ if(BUILD_TESTING)
ament_add_gtest(test_received_message_age
test/topic_statistics_collector/test_received_message_age.cpp)
target_link_libraries(test_received_message_age ${PROJECT_NAME})
ament_target_dependencies(test_received_message_age rcl rcpputils std_msgs sensor_msgs)
ament_target_dependencies(test_received_message_age rcl rcpputils)
endif()

# To enable use of dummy_message.hpp in test_received_message_age
rosidl_target_interfaces(test_received_message_age libstatistics_collector_test_msgs "rosidl_typesupport_cpp")

install(
TARGETS "${PROJECT_NAME}"
EXPORT "${PROJECT_NAME}-targets"
Expand All @@ -82,7 +92,7 @@ install(
DESTINATION include
)

ament_export_dependencies(rcl rcpputils)
ament_export_dependencies(rcl rcpputils rosidl_default_runtime)
prajakta-gokhale marked this conversation as resolved.
Show resolved Hide resolved
ament_export_include_directories(include)
ament_export_libraries(${PROJECT_NAME})

Expand Down
10 changes: 8 additions & 2 deletions libstatistics_collector/package.xml
Expand Up @@ -12,11 +12,17 @@
<depend>rcl</depend>
<depend>rcpputils</depend>

<build_depend>rosidl_default_generators</build_depend>
<build_depend>std_msgs</build_depend>

<exec_depend>rosidl_default_runtime</exec_depend>
<exec_depend>std_msgs</exec_depend>

<test_depend>ament_cmake_gtest</test_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<test_depend>sensor_msgs</test_depend>
<test_depend>std_msgs</test_depend>

<member_of_group>rosidl_interface_packages</member_of_group>
prajakta-gokhale marked this conversation as resolved.
Show resolved Hide resolved

<export>
<build_type>ament_cmake</build_type>
Expand Down
4 changes: 4 additions & 0 deletions libstatistics_collector/test/msg/DummyMessage.msg
@@ -0,0 +1,4 @@
# This is a dummy message type with a `Header` field.
# It is intended for use in topic statistics tests.

std_msgs/Header header
Expand Up @@ -18,19 +18,19 @@
#include <chrono>
#include <string>

#include "libstatistics_collector/msg/dummy_message.hpp"
#include "libstatistics_collector/topic_statistics_collector/constants.hpp"
#include "libstatistics_collector/topic_statistics_collector/received_message_age.hpp"

#include "rcl/time.h"
#include "sensor_msgs/msg/imu.hpp"
#include "std_msgs/msg/string.hpp"

namespace
{
using ReceivedImuMessageAgeCollector = libstatistics_collector::
topic_statistics_collector::ReceivedMessageAgeCollector<sensor_msgs::msg::Imu>;
using ReceivedStringMessageAgeCollector = libstatistics_collector::
topic_statistics_collector::ReceivedMessageAgeCollector<std_msgs::msg::String>;
using DummyMessage = libstatistics_collector::msg::DummyMessage;
using ReceivedDummyMessageAgeCollector = libstatistics_collector::
topic_statistics_collector::ReceivedMessageAgeCollector<DummyMessage>;
using ReceivedIntMessageAgeCollector = libstatistics_collector::
topic_statistics_collector::ReceivedMessageAgeCollector<int>;

constexpr const std::chrono::seconds kDefaultDurationSeconds{1};
constexpr const double kExpectedAverageMilliseconds{2000.0};
Expand All @@ -40,97 +40,83 @@ constexpr const double kExpectedStandardDeviation{816.49658092772597};
constexpr const int kDefaultTimesToTest{10};
constexpr const int64_t kDefaultTimeMessageReceived{1000};
constexpr const rcl_time_point_value_t kStartTime{123456789};

sensor_msgs::msg::Imu GetImuMessageWithHeader(const int64_t seconds, const int64_t nanoseconds)
{
auto message = sensor_msgs::msg::Imu{};
message.header = std_msgs::msg::Header{};
message.header.stamp.sec = seconds;
message.header.stamp.nanosec = nanoseconds;
return message;
}

std_msgs::msg::String GetStringMessageWithoutHeader()
{
auto message = std_msgs::msg::String{};
message.data = "Any message with no header";
return message;
}
constexpr const int kRandomIntMessage{7};
} // namespace


TEST(ReceivedMessageAgeTest, TestOnlyMessagesWithHeaderGetSampled) {
ReceivedStringMessageAgeCollector string_msg_collector{};
ReceivedIntMessageAgeCollector int_msg_collector{};

const auto string_msg = GetStringMessageWithoutHeader();
libstatistics_collector::moving_average_statistics::StatisticData stats;

for (int i = 0; i < kDefaultTimesToTest; ++i) {
string_msg_collector.OnMessageReceived(string_msg, kDefaultTimeMessageReceived);
stats = string_msg_collector.GetStatisticsResults();
int_msg_collector.OnMessageReceived(kRandomIntMessage, kDefaultTimeMessageReceived);
stats = int_msg_collector.GetStatisticsResults();
EXPECT_EQ(0, stats.sample_count) << "Expect 0 samples to be collected";
}

ReceivedImuMessageAgeCollector imu_msg_collector{};
const auto imu_msg = GetImuMessageWithHeader(1, 0);

ReceivedDummyMessageAgeCollector dummy_msg_collector{};
auto msg = DummyMessage{};
msg.header.stamp.sec = kDefaultTimeMessageReceived;
for (int i = 0; i < kDefaultTimesToTest; ++i) {
imu_msg_collector.OnMessageReceived(imu_msg, kDefaultTimeMessageReceived);
stats = imu_msg_collector.GetStatisticsResults();
dummy_msg_collector.OnMessageReceived(msg, kDefaultTimeMessageReceived);
stats = dummy_msg_collector.GetStatisticsResults();
EXPECT_EQ(i + 1, stats.sample_count) << "Expect " << i + 1 << " samples to be collected";
}
}

TEST(ReceivedMessageAgeTest, TestMeasurementOnlyMadeForInitializedHeaderValue) {
ReceivedImuMessageAgeCollector imu_msg_collector{};
ReceivedDummyMessageAgeCollector dummy_msg_collector{};

// Don't initialize `header.stamp`
const auto imu_msg_uninitialized_header = sensor_msgs::msg::Imu{};
imu_msg_collector.OnMessageReceived(imu_msg_uninitialized_header, kDefaultTimeMessageReceived);
auto stats = imu_msg_collector.GetStatisticsResults();
auto msg = DummyMessage{};

dummy_msg_collector.OnMessageReceived(msg, kDefaultTimeMessageReceived);
auto stats = dummy_msg_collector.GetStatisticsResults();
EXPECT_EQ(0, stats.sample_count) << "Expect 0 samples to be collected";

// Set `header.stamp` to 0
const auto imu_msg_zero_header = GetImuMessageWithHeader(0, 0);
imu_msg_collector.OnMessageReceived(imu_msg_zero_header, kDefaultTimeMessageReceived);
stats = imu_msg_collector.GetStatisticsResults();
msg.header.stamp.sec = 0;
dummy_msg_collector.OnMessageReceived(msg, kDefaultTimeMessageReceived);
stats = dummy_msg_collector.GetStatisticsResults();
EXPECT_EQ(0, stats.sample_count) << "Expect 0 samples to be collected";

// Set `header.stamp` to non-zero value
const auto imu_msg_positive_header = GetImuMessageWithHeader(1, 0);
imu_msg_collector.OnMessageReceived(imu_msg_positive_header, kDefaultTimeMessageReceived);
stats = imu_msg_collector.GetStatisticsResults();
msg.header.stamp.sec = kDefaultTimeMessageReceived;
dummy_msg_collector.OnMessageReceived(msg, kDefaultTimeMessageReceived);
stats = dummy_msg_collector.GetStatisticsResults();
EXPECT_EQ(1, stats.sample_count) << "Expect 1 sample to be collected";
}

TEST(ReceivedMessageAgeTest, TestAgeMeasurement) {
ReceivedImuMessageAgeCollector test_collector{};
ReceivedDummyMessageAgeCollector test_collector{};

EXPECT_FALSE(test_collector.IsStarted()) << "Expect to be not started after constructed";

EXPECT_TRUE(test_collector.Start()) << "Expect Start() to be successful";
EXPECT_TRUE(test_collector.IsStarted()) << "Expect to be started";

rcl_time_point_value_t fake_now_nanos_{kStartTime};
const auto test_message = GetImuMessageWithHeader(0, fake_now_nanos_);
auto msg = DummyMessage{};
msg.header.stamp.nanosec = fake_now_nanos_;
fake_now_nanos_ +=
std::chrono::duration_cast<std::chrono::nanoseconds>(kDefaultDurationSeconds).count();

test_collector.OnMessageReceived(test_message, fake_now_nanos_);
test_collector.OnMessageReceived(msg, fake_now_nanos_);
auto stats = test_collector.GetStatisticsResults();
EXPECT_EQ(1, stats.sample_count);

fake_now_nanos_ +=
std::chrono::duration_cast<std::chrono::nanoseconds>(kDefaultDurationSeconds).count();

test_collector.OnMessageReceived(test_message, fake_now_nanos_);
test_collector.OnMessageReceived(msg, fake_now_nanos_);
stats = test_collector.GetStatisticsResults();
EXPECT_EQ(2, stats.sample_count);

fake_now_nanos_ +=
std::chrono::duration_cast<std::chrono::nanoseconds>(kDefaultDurationSeconds).count();

test_collector.OnMessageReceived(test_message, fake_now_nanos_);
test_collector.OnMessageReceived(msg, fake_now_nanos_);
stats = test_collector.GetStatisticsResults();
EXPECT_EQ(3, stats.sample_count);

Expand All @@ -141,7 +127,7 @@ TEST(ReceivedMessageAgeTest, TestAgeMeasurement) {
}

TEST(ReceivedMessageAgeTest, TestGetStatNameAndUnit) {
ReceivedImuMessageAgeCollector test_collector{};
ReceivedDummyMessageAgeCollector test_collector{};

EXPECT_FALSE(test_collector.GetMetricName().empty());
EXPECT_FALSE(test_collector.GetMetricUnit().empty());
Expand Down
44 changes: 27 additions & 17 deletions system_metrics_collector/CMakeLists.txt
Expand Up @@ -37,12 +37,18 @@ find_package(rclcpp_components REQUIRED)
find_package(rclcpp_lifecycle REQUIRED)
find_package(rcpputils REQUIRED)
find_package(rcutils REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)

rosidl_generate_interfaces(system_metrics_collector_test_msgs
"test/msg/DummyMessage.msg"
DEPENDENCIES std_msgs
LIBRARY_NAME ${PROJECT_NAME}
)

include_directories(src)

add_library(system_metrics_collector SHARED
add_library(${PROJECT_NAME} SHARED
src/system_metrics_collector/metrics_message_publisher.cpp
src/system_metrics_collector/linux_cpu_measurement_node.cpp
src/system_metrics_collector/linux_memory_measurement_node.cpp
Expand All @@ -53,7 +59,7 @@ add_library(system_metrics_collector SHARED
src/system_metrics_collector/proc_pid_cpu_data.cpp
src/system_metrics_collector/utilities.cpp
)
ament_target_dependencies(system_metrics_collector
ament_target_dependencies(${PROJECT_NAME}
message_filters
metrics_statistics_msgs
rcl
Expand All @@ -63,22 +69,22 @@ ament_target_dependencies(system_metrics_collector
rcpputils
rcutils
libstatistics_collector)
rclcpp_components_register_nodes(system_metrics_collector
rclcpp_components_register_nodes(${PROJECT_NAME}
system_metrics_collector::LinuxProcessCpuMeasurementNode)
rclcpp_components_register_nodes(system_metrics_collector
rclcpp_components_register_nodes(${PROJECT_NAME}
system_metrics_collector::LinuxProcessMemoryMeasurementNode)
ament_export_libraries(system_metrics_collector)

add_executable(example_main src/system_metrics_collector/example_main.cpp)
target_link_libraries(example_main system_metrics_collector)
target_link_libraries(example_main ${PROJECT_NAME})
ament_target_dependencies(example_main)

add_executable(linux_cpu_collector src/system_metrics_collector/linux_cpu_collector.cpp)
target_link_libraries(linux_cpu_collector system_metrics_collector)
target_link_libraries(linux_cpu_collector ${PROJECT_NAME})
ament_target_dependencies(linux_cpu_collector)

add_executable(linux_memory_collector src/system_metrics_collector/linux_memory_collector.cpp)
target_link_libraries(linux_memory_collector system_metrics_collector)
target_link_libraries(linux_memory_collector ${PROJECT_NAME})
ament_target_dependencies(linux_memory_collector)

if(BUILD_TESTING)
Expand All @@ -91,32 +97,32 @@ if(BUILD_TESTING)

ament_add_gtest(test_metrics_message_publisher
test/system_metrics_collector/test_metrics_message_publisher.cpp)
target_link_libraries(test_metrics_message_publisher system_metrics_collector)
target_link_libraries(test_metrics_message_publisher ${PROJECT_NAME})
ament_target_dependencies(test_metrics_message_publisher metrics_statistics_msgs rclcpp)

ament_add_gtest(test_linux_cpu_measurement_node
test/system_metrics_collector/test_linux_cpu_measurement.cpp)
target_link_libraries(test_linux_cpu_measurement_node system_metrics_collector)
target_link_libraries(test_linux_cpu_measurement_node ${PROJECT_NAME})
ament_target_dependencies(test_linux_cpu_measurement_node metrics_statistics_msgs rclcpp)

ament_add_gtest(test_linux_memory_measurement_node
test/system_metrics_collector/test_linux_memory_measurement.cpp)
target_link_libraries(test_linux_memory_measurement_node system_metrics_collector)
target_link_libraries(test_linux_memory_measurement_node ${PROJECT_NAME})
ament_target_dependencies(test_linux_memory_measurement_node lifecycle_msgs metrics_statistics_msgs rclcpp)

ament_add_gtest(test_linux_process_cpu_measurement_node
test/system_metrics_collector/test_linux_process_cpu_measurement_node.cpp)
target_link_libraries(test_linux_process_cpu_measurement_node system_metrics_collector)
target_link_libraries(test_linux_process_cpu_measurement_node ${PROJECT_NAME})
ament_target_dependencies(test_linux_process_cpu_measurement_node lifecycle_msgs metrics_statistics_msgs rclcpp)

ament_add_gtest(test_linux_process_memory_measurement_node
test/system_metrics_collector/test_linux_process_memory_measurement_node.cpp)
target_link_libraries(test_linux_process_memory_measurement_node system_metrics_collector)
target_link_libraries(test_linux_process_memory_measurement_node ${PROJECT_NAME})
ament_target_dependencies(test_linux_process_memory_measurement_node lifecycle_msgs metrics_statistics_msgs rclcpp)

ament_add_gtest(test_periodic_measurement_node
test/system_metrics_collector/test_periodic_measurement_node.cpp)
target_link_libraries(test_periodic_measurement_node system_metrics_collector)
target_link_libraries(test_periodic_measurement_node ${PROJECT_NAME})
ament_target_dependencies(test_periodic_measurement_node lifecycle_msgs metrics_statistics_msgs rclcpp)

ament_add_gtest(test_composition
Expand All @@ -125,15 +131,18 @@ if(BUILD_TESTING)

ament_add_gtest(test_utilities
test/system_metrics_collector/test_utilities.cpp)
target_link_libraries(test_utilities system_metrics_collector)
target_link_libraries(test_utilities ${PROJECT_NAME})
ament_target_dependencies(test_utilities rclcpp)

ament_add_gtest(test_subscriber_topic_statistics
test/topic_statistics_collector/test_subscriber_topic_statistics.cpp)
target_link_libraries(test_subscriber_topic_statistics system_metrics_collector)
ament_target_dependencies(test_subscriber_topic_statistics rcl rclcpp sensor_msgs)
target_link_libraries(test_subscriber_topic_statistics ${PROJECT_NAME})
ament_target_dependencies(test_subscriber_topic_statistics rcl rclcpp)
endif()

# To enable use of dummy_message.hpp in test_subscriber_topic_statistics
rosidl_target_interfaces(test_subscriber_topic_statistics system_metrics_collector_test_msgs "rosidl_typesupport_cpp")

# Install launch files
install(DIRECTORY
share/${PROJECT_NAME}/
Expand Down Expand Up @@ -165,6 +174,7 @@ install(TARGETS
lib
)

ament_export_dependencies(rosidl_default_runtime)
ament_export_libraries(${PROJECT_NAME})

ament_package()
8 changes: 7 additions & 1 deletion system_metrics_collector/package.xml
Expand Up @@ -19,6 +19,9 @@
<depend>rcpputils</depend>
<depend>rcutils</depend>

<build_depend>rosidl_default_generators</build_depend>
<build_depend>std_msgs</build_depend>

<!--Required for example launch file-->
<exec_depend>demo_nodes_cpp</exec_depend>

Expand All @@ -27,7 +30,8 @@
<test_depend>ament_lint_common</test_depend>
<test_depend>class_loader</test_depend>
<test_depend>lifecycle_msgs</test_depend>
<test_depend>sensor_msgs</test_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<exec_depend>std_msgs</exec_depend>

<!--Required for e2e test file-->
<test_depend>python3-retrying</test_depend>
Expand All @@ -36,6 +40,8 @@
<test_depend>ros2lifecycle</test_depend>
<test_depend>ros2topic</test_depend>

<member_of_group>rosidl_interface_packages</member_of_group>

<export>
<build_type>ament_cmake</build_type>
</export>
Expand Down
4 changes: 4 additions & 0 deletions system_metrics_collector/test/msg/DummyMessage.msg
@@ -0,0 +1,4 @@
# This is a dummy message type with a `Header` field.
# It is intended for use in topic statistics tests.

std_msgs/Header header