diff --git a/test/unittest/dds/subscriber/CMakeLists.txt b/test/unittest/dds/subscriber/CMakeLists.txt index b24e4e81b6d..8187cf0e5c1 100644 --- a/test/unittest/dds/subscriber/CMakeLists.txt +++ b/test/unittest/dds/subscriber/CMakeLists.txt @@ -43,6 +43,8 @@ if(NOT ((MSVC OR MSVC_IDE) AND EPROSIMA_INSTALLER)) add_executable(DataReaderTests ${DATAREADERTESTS_SOURCE}) target_compile_definitions(DataReaderTests PRIVATE FASTRTPS_NO_LIB + BOOST_ASIO_STANDALONE + ASIO_STANDALONE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) diff --git a/test/unittest/dds/subscriber/DataReaderTests.cpp b/test/unittest/dds/subscriber/DataReaderTests.cpp index 0213f0a1d44..edda31f8ba4 100644 --- a/test/unittest/dds/subscriber/DataReaderTests.cpp +++ b/test/unittest/dds/subscriber/DataReaderTests.cpp @@ -57,6 +57,9 @@ #include "../../logging/mock/MockConsumer.h" +#include +#include + namespace eprosima { namespace fastdds { namespace dds { @@ -141,7 +144,7 @@ class DataReaderTests : public ::testing::Test ASSERT_NE(data_reader_, nullptr); data_writer_ = publisher_->create_datawriter(topic_, wqos); - ASSERT_NE(data_reader_, nullptr); + ASSERT_NE(data_writer_, nullptr); } void create_instance_handles() @@ -1915,6 +1918,91 @@ TEST_F(DataReaderUnsupportedTests, UnsupportedDataReaderMethods) ASSERT_EQ(DomainParticipantFactory::get_instance()->delete_participant(participant), ReturnCode_t::RETCODE_OK); } +// Regression test for #12133. +TEST_F(DataReaderTests, read_samples_with_future_changes) +{ + fastrtps::LibrarySettingsAttributes att; + att.intraprocess_delivery = fastrtps::INTRAPROCESS_OFF; + eprosima::fastrtps::xmlparser::XMLProfileManager::library_settings(att); + static constexpr int32_t num_samples = 8; + static constexpr int32_t expected_samples = 4; + const ReturnCode_t& ok_code = ReturnCode_t::RETCODE_OK; + bool start_dropping = false; + static const Duration_t time_to_wait(0, 100 * 1000 * 1000); + std::shared_ptr test_descriptor = + std::make_shared(); + test_descriptor->drop_ack_nack_messages_filter_ = [&](fastrtps::rtps::CDRMessage_t&) -> bool + { + return start_dropping; + }; + + DomainParticipantQos participant_qos = PARTICIPANT_QOS_DEFAULT; + participant_qos.transport().use_builtin_transports = false; + participant_qos.transport().user_transports.push_back(test_descriptor); + + DataReaderQos reader_qos = DATAREADER_QOS_DEFAULT; + reader_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; + reader_qos.history().kind = KEEP_ALL_HISTORY_QOS; + + DataWriterQos writer_qos = DATAWRITER_QOS_DEFAULT; + writer_qos.history().kind = KEEP_ALL_HISTORY_QOS; + + create_entities( + nullptr, + reader_qos, + SUBSCRIBER_QOS_DEFAULT, + writer_qos, + PUBLISHER_QOS_DEFAULT, + TOPIC_QOS_DEFAULT, + participant_qos); + + DataWriter* data_writer2 = publisher_->create_datawriter(topic_, writer_qos); + + create_instance_handles(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Wait discovery + + FooType data; + data.index(1); + data.message()[0] = '\0'; + data.message()[1] = '\0'; + + for (int i = 0; i < 2; ++i) + { + data_writer_->write(&data, handle_ok_); + } + + rtps::test_UDPv4Transport::test_UDPv4Transport_ShutdownAllNetwork = true; + + for (int i = 0; i < 2; ++i) + { + data_writer2->write(&data, handle_ok_); + } + + start_dropping = true; + + rtps::test_UDPv4Transport::test_UDPv4Transport_ShutdownAllNetwork = false; + + for (int i = 0; i < 2; ++i) + { + data_writer2->write(&data, handle_ok_); + } + + for (int i = 0; i < 2; ++i) + { + data_writer_->write(&data, handle_ok_); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Wait all received + + FooSeq data_seq(num_samples); + SampleInfoSeq info_seq(num_samples); + + EXPECT_EQ(ok_code, data_reader_->take(data_seq, info_seq, num_samples, NOT_READ_SAMPLE_STATE)); + check_collection(data_seq, true, num_samples, expected_samples); + + ASSERT_EQ(publisher_->delete_datawriter(data_writer2), ReturnCode_t::RETCODE_OK); +} + } // namespace dds