Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/rst/notes/forthcoming_version.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
###################
Forthcoming Version
###################

This release includes the following **features**:

- Support per-topic DataReader QoS customization via XML profiles in ``init_monitor``.
11 changes: 10 additions & 1 deletion src/cpp/StatisticsBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,16 @@ EntityId create_and_register_monitor(
}

/* Create DataReaders */
if (topic == MONITOR_SERVICE_TOPIC)
fastdds::dds::DataReaderQos unused_qos;
if (monitor->subscriber->get_datareader_qos_from_profile(topic, unused_qos) == RETCODE_OK)
{
monitor->statistics_readers[topic] = monitor->subscriber->create_datareader_with_profile(
monitor->statistics_topics[topic],
topic,
monitor->statistics_reader_listener,
StatusMask::all());
}
else if (topic == MONITOR_SERVICE_TOPIC)
{
monitor->statistics_readers[topic] = monitor->subscriber->create_datareader(
monitor->statistics_topics[topic],
Expand Down
30 changes: 30 additions & 0 deletions test/mock/dds/Subscriber/fastdds/dds/subscriber/Subscriber.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,36 @@ class Subscriber
get_default_datareader_qos,
DataReaderQos & ());

MOCK_CONST_METHOD2(
get_datareader_qos_from_profile,
ReturnCode_t(
const std::string& profile_name,
DataReaderQos & qos));

MOCK_METHOD5(
create_datareader_with_profile_mock_method,
DataReader * (
TopicDescription * topic,
const std::string& profile_name,
DataReaderListener * listener,
const StatusMask& mask,
std::shared_ptr<fastdds::rtps::IPayloadPool> payload_pool));

DataReader* create_datareader_with_profile(
TopicDescription* topic,
const std::string& profile_name,
DataReaderListener* listener = nullptr,
const StatusMask& mask = StatusMask::all(),
std::shared_ptr<fastdds::rtps::IPayloadPool> payload_pool = nullptr)
{
return create_datareader_with_profile_mock_method(
topic,
profile_name,
listener,
mask,
payload_pool);
}

MOCK_CONST_METHOD0(
get_participant,
DomainParticipant * ());
Expand Down
2 changes: 2 additions & 0 deletions test/unittest/StatisticsBackend/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,8 @@ set(INIT_MONITOR_TEST_LIST
init_monitor_check_participant_transport
init_monitor_easy_mode
profile_does_not_exist
init_monitor_datareader_uses_default_qos
init_monitor_datareader_uses_profile_qos
)

foreach(test_name ${INIT_MONITOR_TEST_LIST})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,9 @@ class init_monitor_factory_fails_tests : public ::testing::Test
ON_CALL(subscriber_, get_default_datareader_qos())
.WillByDefault(ReturnRef(datareader_qos_));

ON_CALL(subscriber_, get_datareader_qos_from_profile(_, _))
.WillByDefault(Return(eprosima::fastdds::dds::RETCODE_BAD_PARAMETER));

ON_CALL(domain_participant_, register_type(_, _))
.WillByDefault(Return(eprosima::fastdds::dds::RETCODE_OK));

Expand All @@ -193,6 +196,8 @@ class init_monitor_factory_fails_tests : public ::testing::Test
EXPECT_CALL(domain_participant_, get_default_subscriber_qos()).Times(AnyNumber());
EXPECT_CALL(domain_participant_, get_default_topic_qos()).Times(AnyNumber());
EXPECT_CALL(subscriber_, get_default_datareader_qos()).Times(AnyNumber());
EXPECT_CALL(subscriber_, get_datareader_qos_from_profile(_, _)).Times(AnyNumber());
EXPECT_CALL(subscriber_, create_datareader_with_profile_mock_method(_, _, _, _, _)).Times(AnyNumber());

// The default expectations
EXPECT_CALL(domain_participant_, create_subscriber(_, _, _)).Times(AnyNumber());
Expand Down
70 changes: 68 additions & 2 deletions test/unittest/StatisticsBackend/InitMonitorTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
#include <gmock/gmock.h>

#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/subscriber/DataReader.hpp>
#include <fastdds/dds/subscriber/qos/DataReaderQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/topic/TopicDataType.hpp>
Expand Down Expand Up @@ -149,7 +151,8 @@ class init_monitor_tests : public ::testing::Test
}

// Set the profile to ignore discovery data from other processes
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles/profile.xml");
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_XML_profiles_file(
"profiles/profile.xml");
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles();
}

Expand Down Expand Up @@ -259,7 +262,7 @@ class init_monitor_tests : public ::testing::Test
//Get data from participant discovery info
auto get_property_value =
[](const eprosima::fastdds::rtps::PropertySeq& properties,
const std::string& property_name) -> std::string
const std::string& property_name) -> std::string
{
auto property = std::find_if(
properties.begin(),
Expand Down Expand Up @@ -807,6 +810,69 @@ TEST_F(init_monitor_tests, profile_does_not_exist)
all_datakind_mask_), Error);
}

TEST_F(init_monitor_tests, init_monitor_datareader_uses_default_qos)
{
DomainId domain_id = 0;
DomainListener domain_listener;

EntityId monitor_id = StatisticsBackend::init_monitor(
domain_id,
&domain_listener,
all_callback_mask_,
all_datakind_mask_);

ASSERT_TRUE(monitor_id.is_valid());

auto domain_monitors = test::get_monitors_from_database();
ASSERT_EQ(domain_monitors.size(), 1u);

auto* monitor = domain_monitors[monitor_id];

auto* reader = monitor->statistics_readers[HISTORY_LATENCY_TOPIC];
ASSERT_NE(nullptr, reader);

DataReaderQos reader_qos;
reader->get_qos(reader_qos);

EXPECT_EQ(reader_qos.durability().kind, eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS);

StatisticsBackend::stop_monitor(monitor_id);
}

TEST_F(init_monitor_tests, init_monitor_datareader_uses_profile_qos)
{
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_XML_profiles_file(
"profiles/datareader_profile.xml");

DomainId domain_id = 0;
DomainListener domain_listener;

EntityId monitor_id = StatisticsBackend::init_monitor(
domain_id,
&domain_listener,
all_callback_mask_,
all_datakind_mask_);

ASSERT_TRUE(monitor_id.is_valid());

auto domain_monitors = test::get_monitors_from_database();
ASSERT_EQ(domain_monitors.size(), 1u);

auto* monitor = domain_monitors[monitor_id];

auto* reader = monitor->statistics_readers[HISTORY_LATENCY_TOPIC];
ASSERT_NE(nullptr, reader);

DataReaderQos reader_qos;
reader->get_qos(reader_qos);

EXPECT_EQ(reader_qos.durability().kind, eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS);

StatisticsBackend::stop_monitor(monitor_id);

eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles();
}

int main(
int argc,
char** argv)
Expand Down
10 changes: 10 additions & 0 deletions test/unittest/StatisticsBackend/profiles/datareader_profile.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<profiles>
<data_reader profile_name="_fastdds_statistics_history2history_latency">
<qos>
<durability>
<kind>VOLATILE</kind>
</durability>
</qos>
</data_reader>
</profiles>
Loading