diff --git a/tracetools_test/CMakeLists.txt b/tracetools_test/CMakeLists.txt index 05cca81..0866792 100644 --- a/tracetools_test/CMakeLists.txt +++ b/tracetools_test/CMakeLists.txt @@ -13,6 +13,7 @@ endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) +find_package(std_srvs REQUIRED) # Tests if(BUILD_TESTING) @@ -51,6 +52,13 @@ if(BUILD_TESTING) rclcpp std_msgs ) + add_executable(test_service + src/test_service.cpp + ) + ament_target_dependencies(test_service + rclcpp + std_srvs + ) install(TARGETS test_publisher @@ -58,6 +66,7 @@ if(BUILD_TESTING) test_ping test_pong test_timer + test_service DESTINATION lib/${PROJECT_NAME} ) @@ -70,6 +79,7 @@ if(BUILD_TESTING) test/test_subscription.py test/test_subscription_callback.py test/test_timer.py + test/test_service.py ) foreach(_test_path ${_tracetools_test_pytest_tests}) diff --git a/tracetools_test/package.xml b/tracetools_test/package.xml index a4d661e..884375e 100644 --- a/tracetools_test/package.xml +++ b/tracetools_test/package.xml @@ -13,9 +13,11 @@ rclcpp std_msgs + std_srvs rclcpp std_msgs + std_srvs ament_cmake_pytest launch_ros diff --git a/tracetools_test/src/test_service.cpp b/tracetools_test/src/test_service.cpp new file mode 100644 index 0000000..c347b21 --- /dev/null +++ b/tracetools_test/src/test_service.cpp @@ -0,0 +1,48 @@ +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_srvs/srv/empty.hpp" + +class ServiceNode : public rclcpp::Node +{ +public: + ServiceNode(rclcpp::NodeOptions options) : Node("service_node", options) + { + srv_ = this->create_service( + "service", + std::bind(&ServiceNode::service_callback, + this, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3)); + } + +private: + void service_callback( + const std::shared_ptr request_header, + const std::shared_ptr request, + const std::shared_ptr response) + { + // Nothing + (void)request_header; + (void)request; + (void)response; + } + + rclcpp::Service::SharedPtr srv_; +}; + +int main(int argc, char* argv[]) +{ + rclcpp::init(argc, argv); + + rclcpp::executors::SingleThreadedExecutor exec; + auto service_node = std::make_shared(rclcpp::NodeOptions()); + exec.add_node(service_node); + + printf("spinning once\n"); + exec.spin_once(); + + rclcpp::shutdown(); + return 0; +} diff --git a/tracetools_test/test/test_service.py b/tracetools_test/test/test_service.py new file mode 100644 index 0000000..4230c4d --- /dev/null +++ b/tracetools_test/test/test_service.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_creation_events = [ + 'ros2:rcl_service_init', + 'ros2:rclcpp_service_callback_added', +] + +class TestService(unittest.TestCase): + + def test_creation(self): + session_name_prefix = 'session-test-service-creation' + test_nodes = ['test_service'] + + exit_code, full_path = run_and_trace(BASE_PATH, + session_name_prefix, + service_creation_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_creation_events), trace_events) + + cleanup_trace(full_path) + + +if __name__ == '__main__': + unittest.main()