From eff44150d598437c8fa3bc4a605b4cd78ab8820b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ferreira=20Gonz=C3=A1lez?= Date: Mon, 27 Apr 2026 10:55:00 +0200 Subject: [PATCH 1/2] Improve windows tests (#6373) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refs #24338: Fix System tests * Refs #24338: Fix IDL tests * Refs #24338: Improve deletion of WriterHistoryTests --------- Signed-off-by: Carlos Ferreira González (cherry picked from commit e8294c00d01d9f393b763241ed772d66b8d4c6c0) # Conflicts: # test/feature/idl_parser/CMakeLists.txt # test/unittest/rtps/history/WriterHistoryTests.cpp --- test/feature/idl_parser/CMakeLists.txt | 27 ++++ test/system/tools/fds/CMakeLists.txt | 2 +- test/system/tools/fds/launcher.ps1 | 17 ++- test/system/tools/fds/tests.py | 60 ++++++++- .../rtps/history/WriterHistoryTests.cpp | 123 ++++++++++++++++++ 5 files changed, 215 insertions(+), 14 deletions(-) diff --git a/test/feature/idl_parser/CMakeLists.txt b/test/feature/idl_parser/CMakeLists.txt index 6beeb16f210..c17e9f46e98 100644 --- a/test/feature/idl_parser/CMakeLists.txt +++ b/test/feature/idl_parser/CMakeLists.txt @@ -63,8 +63,35 @@ target_link_libraries(IdlParserTests gtest_discover_tests(IdlParserTests PROPERTIES ${IDLPARSERTESTS_ENV_PROPERTIES}) message(STATUS "Copying IDL directory from ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL for idl_parser testing") +<<<<<<< HEAD add_custom_command( TARGET IdlParserTests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL ${CMAKE_CURRENT_BINARY_DIR}/IDL COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/no_path_included.idl ${CMAKE_CURRENT_BINARY_DIR}/IDL/ +======= +file(COPY + ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL/ + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/IDL +) +file(COPY + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/no_path_included.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extra_structures.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extra_unions.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/appendable_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/default_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extensibility_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/final_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/id_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/key_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/mutable_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/optional_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/position_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/bit_bound_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/external_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/nested_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/try_construct_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/value_annotation.idl + ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/default_literal_annotation.idl + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/IDL +>>>>>>> e8294c00d (Improve windows tests (#6373)) ) diff --git a/test/system/tools/fds/CMakeLists.txt b/test/system/tools/fds/CMakeLists.txt index ed6e058f8c4..8b63a4a9f4c 100644 --- a/test/system/tools/fds/CMakeLists.txt +++ b/test/system/tools/fds/CMakeLists.txt @@ -97,7 +97,7 @@ if(Python3_Interpreter_FOUND) if(WIN32) add_test( NAME system.tools.fastdds.${TEST} - COMMAND powershell "-File" ${PWS_LAUNCHER} + COMMAND powershell.exe -NoProfile -ExecutionPolicy Bypass -File ${PWS_LAUNCHER} ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests.py $ diff --git a/test/system/tools/fds/launcher.ps1 b/test/system/tools/fds/launcher.ps1 index 4d033486c0d..c2279877a33 100644 --- a/test/system/tools/fds/launcher.ps1 +++ b/test/system/tools/fds/launcher.ps1 @@ -24,13 +24,18 @@ Param( $test_name ) -$test = Start-Process -Passthru -Wait ` - -FilePath $python_path ` - -ArgumentList ($test_script, $tool_path, $test_name) ` - -WindowStyle Hidden +try +{ + & $python_path $test_script $tool_path $test_name + $exit_code = $LASTEXITCODE +} +catch +{ + throw "Failed to launch test '$test_name': $($_.Exception.Message)" +} -if( $test.ExitCode -ne 0 ) +if ($exit_code -ne 0) { - $error_message = "Test: $test_name failed with exit code $($test.ExitCode)." + $error_message = "Test: $test_name failed with exit code $exit_code." throw $error_message } diff --git a/test/system/tools/fds/tests.py b/test/system/tools/fds/tests.py index d9dae1f0d32..dcfc0344fe2 100644 --- a/test/system/tools/fds/tests.py +++ b/test/system/tools/fds/tests.py @@ -53,6 +53,9 @@ import os from enum import Enum +if os.name == 'nt': + import ctypes + from xml.dom import minidom class Command_test(Enum): @@ -86,17 +89,27 @@ def signal_handler(signum, frame): def send_command(command): print("Executing command: " + str(command)) - # this subprocess cannot be executed in shell=True or using bash + creationflags = 0 + if os.name == 'nt': + # Give the child its own console so we can deliver CTRL_C_EVENT to + # it without also affecting the launcher (PowerShell). We cannot use + # Start-Process -WindowStyle Hidden on Windows containers, and + # CREATE_NEW_PROCESS_GROUP + CTRL_BREAK_EVENT does not work either + # because the server only installs a SIGINT handler, not SIGBREAK. + creationflags = subprocess.CREATE_NEW_CONSOLE + + # This subprocess cannot be executed in shell=True or using bash # because a background script will not broadcast the signals # it receives proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True + universal_newlines=True, + creationflags=creationflags, ) - # sleep to let the server run - time.sleep(1) + # Sleep to let the server run + time.sleep(3) # 1. An exit code of 0 means everything was alright # 2. An exit code of 1 means the tool's process terminated before even @@ -106,17 +119,44 @@ def send_command(command): # output was different than expected exit_code = 0 - # direct this script to ignore SIGINT + # If the process already exited due to failure (e.g. bad arguments, missing XML), + # skip signalling entirely and collect the output. + if proc.poll() is not None: + output, err = proc.communicate() + return output, err, exit_code + + # Direct this script to ignore SIGINT signal.signal(signal.SIGINT, signal_handler) - # send SIGINT to process and wait for processing + # On Windows, detach from the launcher's console and attach to the child's brand-new + # console. From that attached state, GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0) + # broadcasts CTRL+C to every process in the attached console. This reaches the server's + # SIGINT handler and triggers the clean-shutdown path (which prints "### Server shut down ###") + # without leaking the signal to PowerShell. + kernel32 = None + if os.name == 'nt': + kernel32 = ctypes.windll.kernel32 + ATTACH_PARENT_PROCESS = -1 + CTRL_C_EVENT = 0 + kernel32.FreeConsole() + if not kernel32.AttachConsole(proc.pid): + # Restore our console and bail out hard if the attached failed + kernel32.AttachConsole(ATTACH_PARENT_PROCESS) + proc.kill() + print('Could not attach to child console to send CTRL_C') + sys.exit(2) + # Ignore CTRL+C in our own process so the broadcast does not terminate the Python launcher. + kernel32.SetConsoleCtrlHandler(None, True) + + # Send signal to process and wait for processing lease = 0 while True: if os.name == 'posix': proc.send_signal(signal.SIGINT) elif os.name == 'nt': - proc.send_signal(signal.CTRL_C_EVENT) + # pid == 0 targets all processes attached to our (the child's) console. + kernel32.GenerateConsoleCtrlEvent(0, 0) time.sleep(1) lease += 1 @@ -127,6 +167,12 @@ def send_command(command): else: break + # Restore the launcher's console attachment on Windows before returning. + if os.name == 'nt': + kernel32.FreeConsole() + kernel32.AttachConsole(-1) # ATTACH_PARENT_PROCESS + kernel32.SetConsoleCtrlHandler(None, False) + # Check whether SIGINT was able to terminate the process if proc.poll() is None: # SIGINT couldn't terminate the process. Kill it and exit with code 2 diff --git a/test/unittest/rtps/history/WriterHistoryTests.cpp b/test/unittest/rtps/history/WriterHistoryTests.cpp index 3082120e7d4..ee743f585bd 100644 --- a/test/unittest/rtps/history/WriterHistoryTests.cpp +++ b/test/unittest/rtps/history/WriterHistoryTests.cpp @@ -78,6 +78,10 @@ void cache_change_fragment( { ASSERT_EQ(result, 0); } + + RTPSDomain::removeRTPSWriter(writer); + RTPSDomain::removeRTPSParticipant(participant); + delete history; } /** @@ -106,6 +110,125 @@ TEST(WriterHistoryTests, final_high_mark_for_frag_overflow) } } +<<<<<<< HEAD +======= +TEST(WriterHistoryTests, add_change_with_undefined_instance_handle_and_no_payload) +{ + uint32_t domain_id = 0; + + RTPSParticipantAttributes p_attr; + RTPSParticipant* participant = RTPSDomain::createParticipant( + domain_id, true, p_attr); + + ASSERT_NE(participant, nullptr); + + HistoryAttributes h_attr; + WriterHistory* history = new WriterHistory(h_attr); + + WriterAttributes w_attr; + // The topic must be keyed to use instance handles + w_attr.endpoint.topicKind = WITH_KEY; + RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); + + ASSERT_NE(writer, nullptr); + + // Any of these changes have a well defined instance handle + CacheChange_t* change = history->create_change(ALIVE); + // Valid because ALIVE changes don't enforce defined instance handles + ASSERT_TRUE(history->add_change(change)); + // Rest are invalid because instance handle is enforced to be defined + change = history->create_change(NOT_ALIVE_DISPOSED); + ASSERT_FALSE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_UNREGISTERED); + ASSERT_FALSE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); + ASSERT_FALSE(history->add_change(change)); + + RTPSDomain::removeRTPSWriter(writer); + RTPSDomain::removeRTPSParticipant(participant); + delete history; +} + +TEST(WriterHistoryTests, add_change_with_defined_instance_handle_and_no_payload) +{ + uint32_t domain_id = 0; + + RTPSParticipantAttributes p_attr; + RTPSParticipant* participant = RTPSDomain::createParticipant( + domain_id, true, p_attr); + + ASSERT_NE(participant, nullptr); + + HistoryAttributes h_attr; + WriterHistory* history = new WriterHistory(h_attr); + + WriterAttributes w_attr; + // The topic must be keyed to use instance handles + w_attr.endpoint.topicKind = WITH_KEY; + RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); + + ASSERT_NE(writer, nullptr); + + // All these changes have a well defined instance handle and they must be added successfully + CacheChange_t* change = history->create_change(ALIVE); + // Setting any value makes the handle defined because of its = operator + change->instanceHandle.value[0] = 1; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_DISPOSED); + change->instanceHandle.value[0] = 1; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_UNREGISTERED); + change->instanceHandle.value[0] = 1; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); + change->instanceHandle.value[0] = 1; + ASSERT_TRUE(history->add_change(change)); + + RTPSDomain::removeRTPSWriter(writer); + RTPSDomain::removeRTPSParticipant(participant); + delete history; +} + +TEST(WriterHistoryTests, add_change_with_payload_but_undefined_handle) +{ + uint32_t domain_id = 0; + + RTPSParticipantAttributes p_attr; + RTPSParticipant* participant = RTPSDomain::createParticipant( + domain_id, true, p_attr); + + ASSERT_NE(participant, nullptr); + + HistoryAttributes h_attr; + WriterHistory* history = new WriterHistory(h_attr); + + WriterAttributes w_attr; + // The topic must be keyed to use instance handles + w_attr.endpoint.topicKind = WITH_KEY; + RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); + + ASSERT_NE(writer, nullptr); + + CacheChange_t* change = history->create_change(ALIVE); + // This len simulates a payload + change->serializedPayload.length = 10; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_DISPOSED); + change->serializedPayload.length = 10; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_UNREGISTERED); + change->serializedPayload.length = 10; + ASSERT_TRUE(history->add_change(change)); + change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); + change->serializedPayload.length = 10; + ASSERT_TRUE(history->add_change(change)); + + RTPSDomain::removeRTPSWriter(writer); + RTPSDomain::removeRTPSParticipant(participant); + delete history; +} + +>>>>>>> e8294c00d (Improve windows tests (#6373)) } // namespace rtps } // namespace fastdds } // namespace eprosima From 3a9c72549908ceaf77af8e2fa5d4c025cc468d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ferreira=20Gonz=C3=A1lez?= Date: Mon, 27 Apr 2026 16:40:22 +0200 Subject: [PATCH 2/2] Fix Conflicts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carlos Ferreira González --- test/feature/idl_parser/CMakeLists.txt | 24 ---- .../rtps/history/WriterHistoryTests.cpp | 119 ------------------ 2 files changed, 143 deletions(-) diff --git a/test/feature/idl_parser/CMakeLists.txt b/test/feature/idl_parser/CMakeLists.txt index c17e9f46e98..fce7d68813f 100644 --- a/test/feature/idl_parser/CMakeLists.txt +++ b/test/feature/idl_parser/CMakeLists.txt @@ -63,35 +63,11 @@ target_link_libraries(IdlParserTests gtest_discover_tests(IdlParserTests PROPERTIES ${IDLPARSERTESTS_ENV_PROPERTIES}) message(STATUS "Copying IDL directory from ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL for idl_parser testing") -<<<<<<< HEAD -add_custom_command( - TARGET IdlParserTests POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL ${CMAKE_CURRENT_BINARY_DIR}/IDL - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/no_path_included.idl ${CMAKE_CURRENT_BINARY_DIR}/IDL/ -======= file(COPY ${PROJECT_SOURCE_DIR}/thirdparty/dds-types-test/IDL/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/IDL ) file(COPY ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/no_path_included.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extra_structures.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extra_unions.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/appendable_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/default_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/extensibility_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/final_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/id_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/key_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/mutable_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/optional_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/position_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/bit_bound_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/external_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/nested_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/try_construct_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/value_annotation.idl - ${PROJECT_SOURCE_DIR}/test/feature/idl_parser/idl_extra_cases/default_literal_annotation.idl DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/IDL ->>>>>>> e8294c00d (Improve windows tests (#6373)) ) diff --git a/test/unittest/rtps/history/WriterHistoryTests.cpp b/test/unittest/rtps/history/WriterHistoryTests.cpp index ee743f585bd..83d67eb0192 100644 --- a/test/unittest/rtps/history/WriterHistoryTests.cpp +++ b/test/unittest/rtps/history/WriterHistoryTests.cpp @@ -110,125 +110,6 @@ TEST(WriterHistoryTests, final_high_mark_for_frag_overflow) } } -<<<<<<< HEAD -======= -TEST(WriterHistoryTests, add_change_with_undefined_instance_handle_and_no_payload) -{ - uint32_t domain_id = 0; - - RTPSParticipantAttributes p_attr; - RTPSParticipant* participant = RTPSDomain::createParticipant( - domain_id, true, p_attr); - - ASSERT_NE(participant, nullptr); - - HistoryAttributes h_attr; - WriterHistory* history = new WriterHistory(h_attr); - - WriterAttributes w_attr; - // The topic must be keyed to use instance handles - w_attr.endpoint.topicKind = WITH_KEY; - RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); - - ASSERT_NE(writer, nullptr); - - // Any of these changes have a well defined instance handle - CacheChange_t* change = history->create_change(ALIVE); - // Valid because ALIVE changes don't enforce defined instance handles - ASSERT_TRUE(history->add_change(change)); - // Rest are invalid because instance handle is enforced to be defined - change = history->create_change(NOT_ALIVE_DISPOSED); - ASSERT_FALSE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_UNREGISTERED); - ASSERT_FALSE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); - ASSERT_FALSE(history->add_change(change)); - - RTPSDomain::removeRTPSWriter(writer); - RTPSDomain::removeRTPSParticipant(participant); - delete history; -} - -TEST(WriterHistoryTests, add_change_with_defined_instance_handle_and_no_payload) -{ - uint32_t domain_id = 0; - - RTPSParticipantAttributes p_attr; - RTPSParticipant* participant = RTPSDomain::createParticipant( - domain_id, true, p_attr); - - ASSERT_NE(participant, nullptr); - - HistoryAttributes h_attr; - WriterHistory* history = new WriterHistory(h_attr); - - WriterAttributes w_attr; - // The topic must be keyed to use instance handles - w_attr.endpoint.topicKind = WITH_KEY; - RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); - - ASSERT_NE(writer, nullptr); - - // All these changes have a well defined instance handle and they must be added successfully - CacheChange_t* change = history->create_change(ALIVE); - // Setting any value makes the handle defined because of its = operator - change->instanceHandle.value[0] = 1; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_DISPOSED); - change->instanceHandle.value[0] = 1; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_UNREGISTERED); - change->instanceHandle.value[0] = 1; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); - change->instanceHandle.value[0] = 1; - ASSERT_TRUE(history->add_change(change)); - - RTPSDomain::removeRTPSWriter(writer); - RTPSDomain::removeRTPSParticipant(participant); - delete history; -} - -TEST(WriterHistoryTests, add_change_with_payload_but_undefined_handle) -{ - uint32_t domain_id = 0; - - RTPSParticipantAttributes p_attr; - RTPSParticipant* participant = RTPSDomain::createParticipant( - domain_id, true, p_attr); - - ASSERT_NE(participant, nullptr); - - HistoryAttributes h_attr; - WriterHistory* history = new WriterHistory(h_attr); - - WriterAttributes w_attr; - // The topic must be keyed to use instance handles - w_attr.endpoint.topicKind = WITH_KEY; - RTPSWriter* writer = RTPSDomain::createRTPSWriter(participant, w_attr, history); - - ASSERT_NE(writer, nullptr); - - CacheChange_t* change = history->create_change(ALIVE); - // This len simulates a payload - change->serializedPayload.length = 10; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_DISPOSED); - change->serializedPayload.length = 10; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_UNREGISTERED); - change->serializedPayload.length = 10; - ASSERT_TRUE(history->add_change(change)); - change = history->create_change(NOT_ALIVE_DISPOSED_UNREGISTERED); - change->serializedPayload.length = 10; - ASSERT_TRUE(history->add_change(change)); - - RTPSDomain::removeRTPSWriter(writer); - RTPSDomain::removeRTPSParticipant(participant); - delete history; -} - ->>>>>>> e8294c00d (Improve windows tests (#6373)) } // namespace rtps } // namespace fastdds } // namespace eprosima