From ce9d6eff958620b3a01b4290e87ac964292a5636 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 3 Jun 2019 13:05:05 +0200 Subject: [PATCH] Add service callback test --- tracetools_test/CMakeLists.txt | 17 +++++ tracetools_test/src/test_service_ping.cpp | 68 +++++++++++++++++++ tracetools_test/src/test_service_pong.cpp | 57 ++++++++++++++++ tracetools_test/test/test_service_callback.py | 37 ++++++++++ 4 files changed, 179 insertions(+) create mode 100644 tracetools_test/src/test_service_ping.cpp create mode 100644 tracetools_test/src/test_service_pong.cpp create mode 100644 tracetools_test/test/test_service_callback.py diff --git a/tracetools_test/CMakeLists.txt b/tracetools_test/CMakeLists.txt index cc516c3..3ef2871 100644 --- a/tracetools_test/CMakeLists.txt +++ b/tracetools_test/CMakeLists.txt @@ -58,6 +58,20 @@ if(BUILD_TESTING) rclcpp std_srvs ) + add_executable(test_service_ping + src/test_service_ping.cpp + ) + ament_target_dependencies(test_service_ping + rclcpp + std_srvs + ) + add_executable(test_service_pong + src/test_service_pong.cpp + ) + ament_target_dependencies(test_service_pong + rclcpp + std_srvs + ) install(TARGETS test_publisher @@ -66,6 +80,8 @@ if(BUILD_TESTING) test_pong test_timer test_service + test_service_ping + test_service_pong DESTINATION lib/${PROJECT_NAME} ) @@ -79,6 +95,7 @@ if(BUILD_TESTING) test/test_subscription_callback.py test/test_timer.py test/test_service.py + test/test_service_callback.py ) foreach(_test_path ${_tracetools_test_pytest_tests}) diff --git a/tracetools_test/src/test_service_ping.cpp b/tracetools_test/src/test_service_ping.cpp new file mode 100644 index 0000000..cbc5fec --- /dev/null +++ b/tracetools_test/src/test_service_ping.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_srvs/srv/empty.hpp" + +using namespace std::chrono_literals; + + +class PingNode : public rclcpp::Node +{ +public: + PingNode(rclcpp::NodeOptions options) : Node("ping_node", options) + { + srv_ = this->create_service( + "pong", + std::bind(&PingNode::service_callback, + this, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3)); + client_ = this->create_client( + "ping"); + timer_ = this->create_wall_timer( + 500ms, + std::bind(&PingNode::timer_callback, this)); + } + + +private: + void service_callback( + const std::shared_ptr request_header, + const std::shared_ptr request, + const std::shared_ptr response) + { + (void)request_header; + (void)request; + (void)response; + RCLCPP_INFO(this->get_logger(), "got request"); + rclcpp::shutdown(); + } + + void timer_callback() + { + auto req = std::make_shared(); + client_->async_send_request(req); + } + + rclcpp::Service::SharedPtr srv_; + rclcpp::Client::SharedPtr client_; + rclcpp::TimerBase::SharedPtr timer_; +}; + +int main(int argc, char* argv[]) +{ + rclcpp::init(argc, argv); + + rclcpp::executors::SingleThreadedExecutor exec; + auto ping_node = std::make_shared(rclcpp::NodeOptions()); + exec.add_node(ping_node); + + printf("spinning\n"); + exec.spin(); + + // Will actually be called inside the node's service callback + rclcpp::shutdown(); + return 0; +} diff --git a/tracetools_test/src/test_service_pong.cpp b/tracetools_test/src/test_service_pong.cpp new file mode 100644 index 0000000..f09f761 --- /dev/null +++ b/tracetools_test/src/test_service_pong.cpp @@ -0,0 +1,57 @@ +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_srvs/srv/empty.hpp" + + +class PongNode : public rclcpp::Node +{ +public: + PongNode(rclcpp::NodeOptions options) : Node("pong_node", options) + { + srv_ = this->create_service( + "ping", + std::bind(&PongNode::service_callback, + this, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3)); + client_ = this->create_client( + "pong"); + } + + +private: + void service_callback( + const std::shared_ptr request_header, + const std::shared_ptr request, + const std::shared_ptr response) + { + (void)request_header; + (void)request; + (void)response; + RCLCPP_INFO(this->get_logger(), "got request"); + auto req = std::make_shared(); + client_->async_send_request(req); + rclcpp::shutdown(); + } + + rclcpp::Service::SharedPtr srv_; + rclcpp::Client::SharedPtr client_; +}; + +int main(int argc, char* argv[]) +{ + rclcpp::init(argc, argv); + + rclcpp::executors::SingleThreadedExecutor exec; + auto pong_node = std::make_shared(rclcpp::NodeOptions()); + exec.add_node(pong_node); + + printf("spinning\n"); + exec.spin(); + + // Will actually be called inside the node's service callback + rclcpp::shutdown(); + return 0; +} diff --git a/tracetools_test/test/test_service_callback.py b/tracetools_test/test/test_service_callback.py new file mode 100644 index 0000000..8992f9a --- /dev/null +++ b/tracetools_test/test/test_service_callback.py @@ -0,0 +1,37 @@ +import unittest +from tracetools_test.utils import ( + get_trace_event_names, + run_and_trace, + cleanup_trace, +) + +BASE_PATH = '/tmp' +PKG = 'tracetools_test' +service_callback_events = [ + 'ros2:rclcpp_service_callback_start', + 'ros2:rclcpp_service_callback_end', +] + +class TestServiceCallback(unittest.TestCase): + + def test_callback(self): + session_name_prefix = 'session-test-service-callback' + test_nodes = ['test_service_ping', 'test_service_pong'] + + exit_code, full_path = run_and_trace(BASE_PATH, + session_name_prefix, + service_callback_events, + None, + PKG, + test_nodes) + self.assertEqual(exit_code, 0) + + trace_events = get_trace_event_names(full_path) + print(f'trace_events: {trace_events}') + self.assertSetEqual(set(service_callback_events), trace_events) + + cleanup_trace(full_path) + + +if __name__ == '__main__': + unittest.main()