diff --git a/test_tracetools/CMakeLists.txt b/test_tracetools/CMakeLists.txt
index a71d7c0f..9d8ebb42 100644
--- a/test_tracetools/CMakeLists.txt
+++ b/test_tracetools/CMakeLists.txt
@@ -198,6 +198,9 @@ if(BUILD_TESTING)
# Only run tracing tests if instrumentation and tracepoints are included
if(NOT TRACETOOLS_TRACEPOINTS_EXCLUDED)
find_package(ament_cmake_pytest REQUIRED)
+ find_package(rmw_implementation_cmake REQUIRED)
+
+ # Tests to run with the default rmw implementation, which should not matter
set(_test_tracetools_pytest_tests
test/test_buffer.py
test/test_executor.py
@@ -205,12 +208,7 @@ if(BUILD_TESTING)
test/test_intra_pub_sub.py
test/test_lifecycle_node.py
test/test_node.py
- test/test_pub_sub.py
- test/test_generic_pub_sub.py
- test/test_publisher.py
test/test_service.py
- test/test_subscription.py
- test/test_generic_subscription.py
test/test_timer.py
)
foreach(_test_path ${_test_tracetools_pytest_tests})
@@ -221,6 +219,37 @@ if(BUILD_TESTING)
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
endforeach()
+
+ # Tests to run with all instrumented/supported rmw implementations
+ set(_test_tracetools_pytest_tests_multi_rmw
+ test/test_generic_pub_sub.py
+ test/test_generic_subscription.py
+ test/test_pub_sub.py
+ test/test_publisher.py
+ test/test_subscription.py
+ )
+ set(_test_tracetools_rmw_implementations
+ rmw_connextdds
+ rmw_cyclonedds_cpp
+ rmw_fastrtps_cpp
+ )
+ get_available_rmw_implementations(rmw_implementations)
+ foreach(_test_path ${_test_tracetools_pytest_tests_multi_rmw})
+ get_filename_component(_test_name ${_test_path} NAME_WE)
+ foreach(rmw_implementation ${_test_tracetools_rmw_implementations})
+ if(rmw_implementation IN_LIST rmw_implementations)
+ ament_add_pytest_test(${_test_name}__${rmw_implementation} ${_test_path}
+ ENV RMW_IMPLEMENTATION=${rmw_implementation}
+ APPEND_ENV PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}
+ TIMEOUT 60
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ )
+ else()
+ message(
+ "rmw implementation '${rmw_implementation}' not available for test '${_test_name}'")
+ endif()
+ endforeach()
+ endforeach()
endif()
endif()
diff --git a/test_tracetools/package.xml b/test_tracetools/package.xml
index b9f38c0f..047cef61 100644
--- a/test_tracetools/package.xml
+++ b/test_tracetools/package.xml
@@ -40,6 +40,7 @@
rclcpp
rclcpp_lifecycle
rcpputils
+ rmw_implementation_cmake
std_msgs
std_srvs
tracetools
diff --git a/tracetools_test/tracetools_test/case.py b/tracetools_test/tracetools_test/case.py
index 9c25e1a6..c6681fc4 100644
--- a/tracetools_test/tracetools_test/case.py
+++ b/tracetools_test/tracetools_test/case.py
@@ -75,7 +75,10 @@ def __init__(
"""Create a TraceTestCase."""
super().__init__(methodName=args[0])
self._base_path = base_path or tempfile.gettempdir()
- self._session_name_prefix = session_name_prefix
+ # Append rmw implementation name to session name if one is explicitly set
+ rmw_implementation = os.environ.get('RMW_IMPLEMENTATION', None)
+ self._session_name_prefix = \
+ session_name_prefix + ('__' + rmw_implementation if rmw_implementation else '')
self._events_ros = events_ros + [TRACE_TEST_ID_TP_NAME]
self._events_kernel = events_kernel
self._package = package