From 38e9ae34239cccb544fe4ac5a2ffdf1c84094176 Mon Sep 17 00:00:00 2001 From: Irene Bandera Date: Tue, 14 May 2024 08:15:26 +0200 Subject: [PATCH 1/6] Wait for parent_id before processing incoming data Signed-off-by: Irene Bandera --- amlip_cpp/test/unittest/node/statusNodeTest.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/amlip_cpp/test/unittest/node/statusNodeTest.cpp b/amlip_cpp/test/unittest/node/statusNodeTest.cpp index 5b38acfb..9b18acd5 100644 --- a/amlip_cpp/test/unittest/node/statusNodeTest.cpp +++ b/amlip_cpp/test/unittest/node/statusNodeTest.cpp @@ -108,13 +108,18 @@ TEST(StatusNodeTest, process_status_parent) // Create a waiter so the Parent Node is not destroyed before the status node has received first message eprosima::utils::event::IntWaitHandler waiter(0, true); + // Create a waiter to initialise parent_id before processing incoming data + eprosima::utils::event::BooleanWaitHandler waiter_id(false, true); + // Execute Status node and store the data that arrives types::AmlipIdDataType parent_id; std::vector data_arrived; status_node.process_status_async( - [&data_arrived, &waiter, &parent_id](const types::StatusDataType& data) + [&data_arrived, &waiter_id, &waiter, &parent_id](const types::StatusDataType& data) { data_arrived.push_back(data); + // Wait for parent_id to be set + waiter_id.wait(); // Only open when data comes from target. Skip data coming from this participant. if (data.id() == parent_id) { @@ -125,7 +130,10 @@ TEST(StatusNodeTest, process_status_parent) { // Create Parent Node to be destroyed afterwards node::test::DummyNode dummy_node("TestParentNode", types::NodeKind::undetermined); + parent_id = dummy_node.id(); + // Open the waiter_id + waiter_id.open(); // Wait so status reader has time to process the data waiter.wait_greater_equal_than(1); From 45192c62682ebcd5d12effff658c862e833c2c69 Mon Sep 17 00:00:00 2001 From: Irene Bandera Date: Tue, 14 May 2024 08:18:08 +0200 Subject: [PATCH 2/6] Set list of tests that can fail using TSAN Signed-off-by: Irene Bandera --- amlip_cpp/test/labels/CMakeLists.txt | 2 ++ amlip_cpp/test/labels/XTSAN.list | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 amlip_cpp/test/labels/XTSAN.list diff --git a/amlip_cpp/test/labels/CMakeLists.txt b/amlip_cpp/test/labels/CMakeLists.txt index 035b2333..434eacf3 100644 --- a/amlip_cpp/test/labels/CMakeLists.txt +++ b/amlip_cpp/test/labels/CMakeLists.txt @@ -14,6 +14,8 @@ # Set list of tests that can fail using ASAN set_test_label_file(${CMAKE_CURRENT_SOURCE_DIR}/XASAN.list "xasan") +# Set list of tests that can fail using TSAN +set_test_label_file(${CMAKE_CURRENT_SOURCE_DIR}/XTSAN.list "xtsan") # Set list of tests that can fail in windows if (WIN32) diff --git a/amlip_cpp/test/labels/XTSAN.list b/amlip_cpp/test/labels/XTSAN.list new file mode 100644 index 00000000..285b7095 --- /dev/null +++ b/amlip_cpp/test/labels/XTSAN.list @@ -0,0 +1,4 @@ +agentTest.client_repeater_client +agentTest.repeater_n_clients +modelManagerTimeoutReplyTest.ping_pong +MultiServiceTest.communicate_service_n_to_n From bae2e7646cca7be9468b4a3fbe6b83f10eaa019f Mon Sep 17 00:00:00 2001 From: Irene Bandera Date: Tue, 14 May 2024 10:12:36 +0200 Subject: [PATCH 3/6] Throw InconsistencyException in StatusNode::stop_processing() if the node is already stopped Signed-off-by: Irene Bandera --- amlip_cpp/src/cpp/node/StatusNode.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/amlip_cpp/src/cpp/node/StatusNode.cpp b/amlip_cpp/src/cpp/node/StatusNode.cpp index 5d414c95..2ef2f564 100644 --- a/amlip_cpp/src/cpp/node/StatusNode.cpp +++ b/amlip_cpp/src/cpp/node/StatusNode.cpp @@ -125,12 +125,17 @@ void StatusNode::stop_processing() { if (processing_) { + logInfo(AMLIPCPP_NODE_STATUS, "Stop processing Status Node: " << *this << "."); processing_ = false; status_reader_->stop(); // This must awake thread and it must finish process_thread_.join(); - change_status_(types::StateKind::stopped); } + else + { + throw utils::InconsistencyException( + STR_ENTRY << "Status node " << this << " is already stopped."); + } } void StatusNode::process_routine_( From 4088322d9dd01084c1280a990d97904a30807990 Mon Sep 17 00:00:00 2001 From: Irene Bandera Date: Fri, 17 May 2024 14:10:59 +0200 Subject: [PATCH 4/6] Refactor StatusNode to handle InconsistencyException when reading data Signed-off-by: Irene Bandera --- amlip_cpp/src/cpp/node/StatusNode.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/amlip_cpp/src/cpp/node/StatusNode.cpp b/amlip_cpp/src/cpp/node/StatusNode.cpp index 2ef2f564..0161b08f 100644 --- a/amlip_cpp/src/cpp/node/StatusNode.cpp +++ b/amlip_cpp/src/cpp/node/StatusNode.cpp @@ -154,13 +154,20 @@ void StatusNode::process_routine_( return; } - // Read data - types::StatusDataType status = status_reader_->read(); + try + { + // Read data + types::StatusDataType status = status_reader_->read(); - logDebug(AMLIPCPP_NODE_STATUS, "Status Node " << *this << " read data :" << status << "."); + logDebug(AMLIPCPP_NODE_STATUS, "Status Node " << *this << " read data :" << status << "."); - // Call callback - callback(status); + // Call callback + callback(status); + } + catch (const eprosima::utils::InconsistencyException& e) + { + std::cerr << e.what() << '\n'; + } } } From 2a20ecec2be38866b4666f6def14caa39de636e6 Mon Sep 17 00:00:00 2001 From: Irene Bandera Date: Wed, 29 May 2024 11:03:22 +0200 Subject: [PATCH 5/6] Activate logs in statusNodeTests Signed-off-by: Irene Bandera --- amlip_cpp/test/unittest/node/statusNodeTest.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/amlip_cpp/test/unittest/node/statusNodeTest.cpp b/amlip_cpp/test/unittest/node/statusNodeTest.cpp index 9b18acd5..8012ede6 100644 --- a/amlip_cpp/test/unittest/node/statusNodeTest.cpp +++ b/amlip_cpp/test/unittest/node/statusNodeTest.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -102,6 +103,9 @@ TEST(StatusNodeTest, run_and_stop) */ TEST(StatusNodeTest, process_status_parent) { + // Activate log + eprosima::utils::Log::SetVerbosity(eprosima::utils::Log::Kind::Info); + // Create Status Node node::StatusNode status_node("TestStatusNode"); @@ -173,6 +177,9 @@ TEST(StatusNodeTest, process_status_parent) */ TEST(StatusNodeTest, process_status_state) { + // Activate log + eprosima::utils::Log::SetVerbosity(eprosima::utils::Log::Kind::Info); + // Create Status Node node::StatusNode status_node("TestStatusNode"); auto st_id = status_node.id(); From 671aabfbff1b8096aebcc7495e7b8fa701d173b5 Mon Sep 17 00:00:00 2001 From: Denisa Date: Mon, 21 Oct 2024 16:03:09 +0200 Subject: [PATCH 6/6] Fix TSAN AgentTest.cpp Signed-off-by: Denisa --- .../test/blackbox/communication/agent/agentTest.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/amlip_cpp/test/blackbox/communication/agent/agentTest.cpp b/amlip_cpp/test/blackbox/communication/agent/agentTest.cpp index 0f8f355e..17dd7159 100644 --- a/amlip_cpp/test/blackbox/communication/agent/agentTest.cpp +++ b/amlip_cpp/test/blackbox/communication/agent/agentTest.cpp @@ -129,9 +129,13 @@ TEST(agentTest, client_repeater_client) std::atomic n_jobs_solved(0u); // Create Main in its own Thread - auto main_node_routine = [&n_jobs_solved]() + //__FLAG__ + node::MainNode main_node("TestMainNode", 10); + //__FLAG__ + //Added &main_node to the lambda capture list + auto main_node_routine = [&n_jobs_solved, &main_node]() { - node::MainNode main_node("TestMainNode", 10); + //node::MainNode main_node("TestMainNode", 10); for (unsigned int i = 0; i < test::N_JOBS_TO_SEND; i++) { std::string job_str = std::string("TEST_SEND") + std::to_string(i); @@ -144,9 +148,10 @@ TEST(agentTest, client_repeater_client) std::thread main_thread(main_node_routine); // Create Computing in its own Thread - auto computing_node_routine = []() + node::ComputingNode computing_node("TestComputingNode", 11); + auto computing_node_routine = [&computing_node]() { - node::ComputingNode computing_node("TestComputingNode", 11); + //node::ComputingNode computing_node("TestComputingNode", 11); for (unsigned int i = 0; i < test::N_JOBS_TO_SEND; i++) { computing_node.process_job(test::process_routine);