From 3548b2fdfe83c95bdd27b8fc8f46fbcf71e2e677 Mon Sep 17 00:00:00 2001
From: Miguel Company <miguelcompany@eprosima.com>
Date: Tue, 3 Sep 2024 15:39:38 +0200
Subject: [PATCH] Refs #20866. Fix unit tests.

Signed-off-by: Miguel Company <miguelcompany@eprosima.com>
---
 .../dds/subscriber/DataReaderHistoryTests.cpp | 127 +++++++-----------
 1 file changed, 46 insertions(+), 81 deletions(-)

diff --git a/test/unittest/dds/subscriber/DataReaderHistoryTests.cpp b/test/unittest/dds/subscriber/DataReaderHistoryTests.cpp
index 1b69e5672dc..2fea658022c 100644
--- a/test/unittest/dds/subscriber/DataReaderHistoryTests.cpp
+++ b/test/unittest/dds/subscriber/DataReaderHistoryTests.cpp
@@ -51,6 +51,23 @@ class TestType : public TopicDataType
             (override));
 };
 
+bool add_test_change(
+        eprosima::fastdds::dds::detail::DataReaderHistory& history,
+        eprosima::fastdds::rtps::CacheChange_t& change,
+        std::vector<std::unique_ptr<eprosima::fastdds::rtps::CacheChange_t>>& test_changes)
+{
+    ++change.sequenceNumber;
+    eprosima::fastdds::rtps::Time_t::now(change.sourceTimestamp);
+    eprosima::fastdds::rtps::CacheChange_t* new_change = new eprosima::fastdds::rtps::CacheChange_t();
+    new_change->copy(&change);
+    new_change->reader_info.writer_ownership_strength = change.reader_info.writer_ownership_strength;
+
+    EXPECT_TRUE(history.received_change(new_change, 0));
+    bool ret = history.update_instance_nts(new_change);
+    test_changes.push_back(std::unique_ptr<eprosima::fastdds::rtps::CacheChange_t>(new_change));
+    return ret;
+}
+
 /*!
  * \test DDS-OWN-HIST-01 Tests `DataReaderInstance` handles successfully the reception of Non-Keyed samples with
  * different Ownership's strength.
@@ -65,6 +82,7 @@ TEST(DataReaderHistory, exclusive_ownership_non_keyed_sample_reception)
     DataReaderHistory history(type, topic, qos);
     eprosima::fastdds::RecursiveTimedMutex mutex;
     eprosima::fastdds::rtps::StatelessReader reader(&history, &mutex);
+    std::vector<std::unique_ptr<eprosima::fastdds::rtps::CacheChange_t>> changes;
 
     eprosima::fastdds::rtps::CacheChange_t dw1_change;
     dw1_change.writerGUID = {{}, 1};
@@ -77,50 +95,32 @@ TEST(DataReaderHistory, exclusive_ownership_non_keyed_sample_reception)
     dw3_change.reader_info.writer_ownership_strength = 3;
 
     // Receives a sample with seq 1 from DW1 and update instance with strength 1.
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw1_change));
+    ASSERT_TRUE(add_test_change(history, dw1_change, changes));
 
     // Receives a sample with seq 1 from DW2 and update instance with strength 2.
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     // Receives a sample with seq 2 from DW1 and update instance with strength 1.
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives a sample with seq 2 from DW2 and update instance with strength 2.
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     // Receives a sample with seq 1 from DW3 and update instance with strength 3.
-    ++dw3_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw3_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw3_change));
+    ASSERT_TRUE(add_test_change(history, dw3_change, changes));
 
     // Receives a sample with seq 3 from DW1 and update instance with strength 1.
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives a sample with seq 3 from DW2 and update instance with strength 2.
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw2_change));
+    ASSERT_FALSE(add_test_change(history, dw2_change, changes));
 
     // Receives a sample with seq 2 from DW3 and update instance with strength 1.
-    ++dw3_change.sequenceNumber;
     dw3_change.reader_info.writer_ownership_strength = 1;
-    ASSERT_TRUE(history.received_change(&dw3_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw3_change));
+    ASSERT_TRUE(add_test_change(history, dw3_change, changes));
 
     // Receives a sample with seq 4 from DW2 and update instance with strength 2.
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     ASSERT_EQ(9u, history.getHistorySize());
 }
@@ -142,6 +142,7 @@ TEST(DataReaderHistory, exclusive_ownership_keyed_sample_reception)
     DataReaderHistory history(type, topic, qos);
     eprosima::fastdds::RecursiveTimedMutex mutex;
     eprosima::fastdds::rtps::StatelessReader reader(&history, &mutex);
+    std::vector<std::unique_ptr<eprosima::fastdds::rtps::CacheChange_t>> changes;
 
     const InstanceHandle_t instance_1 = eprosima::fastdds::rtps::GUID_t{{}, 1};
     const InstanceHandle_t instance_2 = eprosima::fastdds::rtps::GUID_t{{}, 2};
@@ -158,112 +159,76 @@ TEST(DataReaderHistory, exclusive_ownership_keyed_sample_reception)
 
     // Receives instance 1 with seq 1 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_1;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw1_change));
+    ASSERT_TRUE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 2 with seq 2 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_2;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw1_change));
+    ASSERT_TRUE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 1 with seq 1 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_1;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     // Receives instance 1 with seq 3 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_1;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 2 with seq 4 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_2;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw1_change));
+    ASSERT_TRUE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 2 with seq 1 from DW3 and update instance with strength 3.
     dw3_change.instanceHandle = instance_2;
-    ++dw3_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw3_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw3_change));
+    ASSERT_TRUE(add_test_change(history, dw3_change, changes));
 
     // Receives instance 1 with seq 5 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_1;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 2 with seq 6 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_2;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 3 with seq 2 from DW3 and update instance with strength 3.
     dw3_change.instanceHandle = instance_3;
-    ++dw3_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw3_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw3_change));
+    ASSERT_TRUE(add_test_change(history, dw3_change, changes));
 
     // Receives instance 3 with seq 2 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_3;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw2_change));
+    ASSERT_FALSE(add_test_change(history, dw2_change, changes));
 
     // Receives instance 3 with seq 3 from DW3 and update instance with strength 1.
     dw3_change.instanceHandle = instance_3;
     dw3_change.reader_info.writer_ownership_strength = 1;
-    ++dw3_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw3_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw3_change));
+    ASSERT_TRUE(add_test_change(history, dw3_change, changes));
 
     // Receives instance 3 with seq 3 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_3;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     // Receives instance 1 with seq 7 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_1;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 2 with seq 8 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_2;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 3 with seq 9 from DW1 and update instance with strength 1.
     dw1_change.instanceHandle = instance_3;
-    ++dw1_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw1_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw1_change));
+    ASSERT_FALSE(add_test_change(history, dw1_change, changes));
 
     // Receives instance 1 with seq 4 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_1;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     // Receives instance 2 with seq 5 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_2;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_FALSE(history.update_instance_nts(&dw2_change));
+    ASSERT_FALSE(add_test_change(history, dw2_change, changes));
 
     // Receives instance 3 with seq 6 from DW2 and update instance with strength 2.
     dw2_change.instanceHandle = instance_3;
-    ++dw2_change.sequenceNumber;
-    ASSERT_TRUE(history.received_change(&dw2_change, 0));
-    ASSERT_TRUE(history.update_instance_nts(&dw2_change));
+    ASSERT_TRUE(add_test_change(history, dw2_change, changes));
 
     ASSERT_EQ(18u, history.getHistorySize());
 }