diff --git a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp index cc07e4e920b..19991b76d06 100644 --- a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp +++ b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp @@ -280,6 +280,40 @@ struct ReadTakeCommand } } + /** + * @brief Generate SampleInfo for an instance without data. + * + * @param[out] info SampleInfo to fill. + * @param[in] instance_handle Handle of the instance. + * @param[in] instance DataReaderInstance information. + */ + static void generate_instance_info( + SampleInfo& info, + const InstanceHandle_t& instance_handle, + const DataReaderInstance& instance) + { + fastdds::rtps::Time_t current_time; + fastdds::rtps::Time_t::now(current_time); + + info.sample_state = NOT_READ_SAMPLE_STATE; + info.instance_state = instance.instance_state; + info.view_state = instance.view_state; + info.disposed_generation_count = instance.disposed_generation_count; + info.no_writers_generation_count = instance.no_writers_generation_count; + info.sample_rank = 0; + info.generation_rank = 0; + info.absolute_generation_rank = 0; + info.source_timestamp = current_time; + info.reception_timestamp = current_time; + info.instance_handle = instance_handle; + info.publication_handle = InstanceHandle_t{}; + + info.sample_identity = rtps::SampleIdentity{}; + info.related_sample_identity = rtps::SampleIdentity{}; + + info.valid_data = false; + } + private: const TypeSupport& type_; @@ -418,26 +452,7 @@ struct ReadTakeCommand } else { - fastdds::rtps::Time_t current_time; - fastdds::rtps::Time_t::now(current_time); - - info.sample_state = NOT_READ_SAMPLE_STATE; - info.instance_state = instance.instance_state; - info.view_state = instance.view_state; - info.disposed_generation_count = instance.disposed_generation_count; - info.no_writers_generation_count = instance.no_writers_generation_count; - info.sample_rank = 0; - info.generation_rank = 0; - info.absolute_generation_rank = 0; - info.source_timestamp = current_time; - info.reception_timestamp = current_time; - info.instance_handle = instance_->first; - info.publication_handle = HANDLE_NIL; - - info.sample_identity = rtps::SampleIdentity{}; - info.related_sample_identity = rtps::SampleIdentity{}; - - info.valid_data = false; + generate_instance_info(info, instance_->first, instance); } } diff --git a/src/cpp/fastdds/subscriber/history/DataReaderHistory.cpp b/src/cpp/fastdds/subscriber/history/DataReaderHistory.cpp index e86be622d52..7a2a2d3cec0 100644 --- a/src/cpp/fastdds/subscriber/history/DataReaderHistory.cpp +++ b/src/cpp/fastdds/subscriber/history/DataReaderHistory.cpp @@ -387,6 +387,13 @@ bool DataReaderHistory::get_first_untaken_info( ReadTakeCommand::generate_info(info, *(it.second), instance_change); return true; } + + if (it.second->has_state_notification_sample) + { + // Generate SampleInfo for state notification sample + ReadTakeCommand::generate_instance_info(info, it.first, *(it.second)); + return true; + } } return false; diff --git a/test/blackbox/common/DDSBlackboxTestsDataReader.cpp b/test/blackbox/common/DDSBlackboxTestsDataReader.cpp index 30b90798a0c..535595dd0a2 100644 --- a/test/blackbox/common/DDSBlackboxTestsDataReader.cpp +++ b/test/blackbox/common/DDSBlackboxTestsDataReader.cpp @@ -42,7 +42,7 @@ using namespace eprosima::fastdds; using namespace eprosima::fastdds::rtps; #define INCOMPATIBLE_TEST_TOPIC_NAME std::string( \ - std::string("incompatible_") + TEST_TOPIC_NAME) + std::string("incompatible_") + TEST_TOPIC_NAME) enum communication_type @@ -59,11 +59,12 @@ class DDSDataReader : public testing::TestWithParam void SetUp() override { eprosima::fastdds::LibrarySettings library_settings; + auto factory = eprosima::fastdds::dds::DomainParticipantFactory::get_shared_instance(); switch (GetParam()) { case INTRAPROCESS: library_settings.intraprocess_delivery = eprosima::fastdds::IntraprocessDeliveryType::INTRAPROCESS_FULL; - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->set_library_settings(library_settings); + factory->set_library_settings(library_settings); break; case DATASHARING: enable_datasharing = true; @@ -77,11 +78,12 @@ class DDSDataReader : public testing::TestWithParam void TearDown() override { eprosima::fastdds::LibrarySettings library_settings; + auto factory = eprosima::fastdds::dds::DomainParticipantFactory::get_shared_instance(); switch (GetParam()) { case INTRAPROCESS: library_settings.intraprocess_delivery = eprosima::fastdds::IntraprocessDeliveryType::INTRAPROCESS_OFF; - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->set_library_settings(library_settings); + factory->set_library_settings(library_settings); break; case DATASHARING: enable_datasharing = false; @@ -1548,6 +1550,12 @@ TEST_P(DDSDataReader, return_sample_when_writer_disappears) EXPECT_TRUE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available())); EXPECT_EQ(listener.get_data_available_count(), 1u); + fdds::SampleInfo untaken_info; + EXPECT_EQ(data_reader.get_first_untaken_info(&untaken_info), fdds::RETCODE_OK); + + EXPECT_TRUE(untaken_info.valid_data); + EXPECT_EQ(untaken_info.instance_state, fdds::ALIVE_INSTANCE_STATE); + fdds::SampleInfo info; KeyedHelloWorldPubSubType::type sample; EXPECT_EQ(data_reader.take_next_sample(&sample, &info), fdds::RETCODE_OK); @@ -1569,12 +1577,19 @@ TEST_P(DDSDataReader, return_sample_when_writer_disappears) // Verify expectations { - fdds::SampleInfo info; - KeyedHelloWorldPubSubType::type sample; - EXPECT_TRUE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available())); EXPECT_EQ(listener.get_data_available_count(), 2u); + fdds::SampleInfo untaken_info; + EXPECT_EQ(data_reader.get_first_untaken_info(&untaken_info), fdds::RETCODE_OK); + + EXPECT_FALSE(untaken_info.valid_data); + EXPECT_EQ(untaken_info.instance_handle, instance_handle); + EXPECT_EQ(untaken_info.instance_state, fdds::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + + fdds::SampleInfo info; + KeyedHelloWorldPubSubType::type sample; + EXPECT_EQ(data_reader.take_next_sample(&sample, &info), fdds::RETCODE_OK); EXPECT_FALSE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available()));