Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20543] Create Participant with default profile (use environment XML configuration) #4534

Merged
merged 12 commits into from
Mar 27, 2024
21 changes: 21 additions & 0 deletions include/fastdds/dds/domain/DomainParticipantFactory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,25 @@ class DomainParticipantFactory
DomainParticipantListener* listener = nullptr,
const StatusMask& mask = StatusMask::all());

/**
* Create a Participant with default domain id and qos.
*
* @return DomainParticipant pointer. (nullptr if not created.)
*/
FASTDDS_EXPORTED_API DomainParticipant* create_participant_with_default_profile();


/**
* Create a Participant with default domain id and qos.
*
* @return DomainParticipant pointer. (nullptr if not created.)
* @param listener DomainParticipantListener Pointer
* @param mask StatusMask Reference
*/
FASTDDS_EXPORTED_API DomainParticipant* create_participant_with_default_profile(
DomainParticipantListener* listener,
const StatusMask& mask);

/**
* Create a Participant.
*
Expand Down Expand Up @@ -342,6 +361,8 @@ class DomainParticipantFactory

mutable bool default_xml_profiles_loaded;

DomainId_t default_domain_id_;

DomainParticipantFactoryQos factory_qos_;

DomainParticipantQos default_participant_qos_;
Expand Down
32 changes: 25 additions & 7 deletions src/cpp/fastdds/domain/DomainParticipantFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ namespace dds {

DomainParticipantFactory::DomainParticipantFactory()
: default_xml_profiles_loaded(false)
, default_domain_id_(0)
, default_participant_qos_(PARTICIPANT_QOS_DEFAULT)
, topic_pool_(fastrtps::rtps::TopicPayloadPoolRegistry::instance())
, rtps_domain_(fastrtps::rtps::RTPSDomainImpl::get_instance())
Expand Down Expand Up @@ -155,7 +156,7 @@ ReturnCode_t DomainParticipantFactory::delete_participant(
DomainParticipant* DomainParticipantFactory::create_participant(
DomainId_t did,
const DomainParticipantQos& qos,
DomainParticipantListener* listen,
DomainParticipantListener* listener,
const StatusMask& mask)
{
load_profiles();
Expand All @@ -164,10 +165,10 @@ DomainParticipant* DomainParticipantFactory::create_participant(

DomainParticipant* dom_part = new DomainParticipant(mask);
#ifndef FASTDDS_STATISTICS
DomainParticipantImpl* dom_part_impl = new DomainParticipantImpl(dom_part, did, pqos, listen);
DomainParticipantImpl* dom_part_impl = new DomainParticipantImpl(dom_part, did, pqos, listener);
#else
eprosima::fastdds::statistics::dds::DomainParticipantImpl* dom_part_impl =
new eprosima::fastdds::statistics::dds::DomainParticipantImpl(dom_part, did, pqos, listen);
new eprosima::fastdds::statistics::dds::DomainParticipantImpl(dom_part, did, pqos, listener);
#endif // FASTDDS_STATISTICS

if (fastrtps::rtps::GUID_t::unknown() != dom_part_impl->guid())
Expand Down Expand Up @@ -206,10 +207,23 @@ DomainParticipant* DomainParticipantFactory::create_participant(
return dom_part;
}

DomainParticipant* DomainParticipantFactory::create_participant_with_default_profile()
{
return create_participant_with_default_profile(nullptr, StatusMask::none());
}

DomainParticipant* DomainParticipantFactory::create_participant_with_default_profile(
DomainParticipantListener* listener,
const StatusMask& mask)
{
load_profiles();
return create_participant(default_domain_id_, default_participant_qos_, listener, mask);
}

DomainParticipant* DomainParticipantFactory::create_participant_with_profile(
DomainId_t did,
const std::string& profile_name,
DomainParticipantListener* listen,
DomainParticipantListener* listener,
const StatusMask& mask)
{
load_profiles();
Expand All @@ -220,15 +234,15 @@ DomainParticipant* DomainParticipantFactory::create_participant_with_profile(
{
DomainParticipantQos qos = default_participant_qos_;
utils::set_qos_from_attributes(qos, attr.rtps);
return create_participant(did, qos, listen, mask);
return create_participant(did, qos, listener, mask);
}

return nullptr;
}

DomainParticipant* DomainParticipantFactory::create_participant_with_profile(
const std::string& profile_name,
DomainParticipantListener* listen,
DomainParticipantListener* listener,
const StatusMask& mask)
{
load_profiles();
Expand All @@ -239,7 +253,7 @@ DomainParticipant* DomainParticipantFactory::create_participant_with_profile(
{
DomainParticipantQos qos = default_participant_qos_;
utils::set_qos_from_attributes(qos, attr.rtps);
return create_participant(attr.domainId, qos, listen, mask);
return create_participant(attr.domainId, qos, listener, mask);
}

return nullptr;
Expand Down Expand Up @@ -349,6 +363,10 @@ ReturnCode_t DomainParticipantFactory::load_profiles()
{
reset_default_participant_qos();
}
// Take the default domain id from the default participant profile
eprosima::fastrtps::ParticipantAttributes attr;
XMLProfileManager::getDefaultParticipantAttributes(attr);
default_domain_id_ = attr.domainId;

RTPSDomain::set_filewatch_thread_config(factory_qos_.file_watch_threads(), factory_qos_.file_watch_threads());
}
Expand Down
78 changes: 78 additions & 0 deletions test/unittest/dds/participant/ParticipantTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// limitations under the License.

#include <chrono>
#include <cstdlib>
#include <fstream>
#include <future>
#include <memory>
Expand Down Expand Up @@ -64,6 +65,7 @@
#include <xmlparser/attributes/PublisherAttributes.hpp>
#include <xmlparser/attributes/SubscriberAttributes.hpp>

#include "../../common/env_var_utils.hpp"
#include "../../logging/mock/MockConsumer.h"

#if defined(__cplusplus_winrt)
Expand Down Expand Up @@ -568,6 +570,82 @@ TEST(ParticipantTests, CreateDomainParticipantWithProfile)
ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK);
}

TEST(ParticipantTests, CreateDomainParticipantWithDefaultProfile)
EduPonz marked this conversation as resolved.
Show resolved Hide resolved
{
uint32_t domain_id = 123u; // This is the domain ID set in the default profile above

// set XML profile as environment variable: "export FASTDDS_DEFAULT_PROFILES_FILE=test_xml_profile.xml"
eprosima::testing::set_environment_variable("FASTDDS_DEFAULT_PROFILES_FILE", "test_xml_profile.xml");

//participant using the given profile
DomainParticipant* default_env_participant =
DomainParticipantFactory::get_instance()->create_participant_with_default_profile();

// unset XML profile environment variable
eprosima::testing::clear_environment_variable("FASTDDS_DEFAULT_PROFILES_FILE");

ASSERT_NE(default_env_participant, nullptr);
ASSERT_EQ(default_env_participant->get_domain_id(), domain_id);
EduPonz marked this conversation as resolved.
Show resolved Hide resolved
ASSERT_EQ(default_env_participant->get_listener(), nullptr);
ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(
default_env_participant) == ReturnCode_t::RETCODE_OK);
}

TEST(ParticipantTests, CreateDomainParticipantWithDefaultProfileListener)
{
uint32_t domain_id = 123u; // This is the domain ID set in the default profile above

// set XML profile as environment variable: "export FASTDDS_DEFAULT_PROFILES_FILE=test_xml_profile.xml"
eprosima::testing::set_environment_variable("FASTDDS_DEFAULT_PROFILES_FILE", "test_xml_profile.xml");

DomainParticipantListener listener;

//participant using the given profile
DomainParticipant* default_env_participant =
DomainParticipantFactory::get_instance()->create_participant_with_default_profile(&listener,
StatusMask::none());

// unset XML profile environment variable
eprosima::testing::clear_environment_variable("FASTDDS_DEFAULT_PROFILES_FILE");

ASSERT_NE(default_env_participant, nullptr);
ASSERT_EQ(default_env_participant->get_domain_id(), domain_id);
ASSERT_EQ(default_env_participant->get_listener(), &listener);
ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(
default_env_participant) == ReturnCode_t::RETCODE_OK);
}

TEST(ParticipantTests, CreateDomainParticipantWithoutDefaultProfile)
EduPonz marked this conversation as resolved.
Show resolved Hide resolved
{
uint32_t default_domain_id = 0u; // This is the default domain ID

//participant using default values
DomainParticipant* default_participant =
DomainParticipantFactory::get_instance()->create_participant_with_default_profile();
ASSERT_NE(default_participant, nullptr);
ASSERT_EQ(default_participant->get_domain_id(), default_domain_id);
EduPonz marked this conversation as resolved.
Show resolved Hide resolved
ASSERT_EQ(default_participant->get_listener(), nullptr);
ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(
default_participant) == ReturnCode_t::RETCODE_OK);
}

TEST(ParticipantTests, CreateDomainParticipantWithoutDefaultProfileListener)
{
uint32_t default_domain_id = 0u; // This is the default domain ID

DomainParticipantListener listener;

//participant using default values
DomainParticipant* default_participant =
DomainParticipantFactory::get_instance()->create_participant_with_default_profile(&listener,
StatusMask::none());
ASSERT_NE(default_participant, nullptr);
ASSERT_EQ(default_participant->get_domain_id(), default_domain_id);
ASSERT_EQ(default_participant->get_listener(), &listener);
ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(
default_participant) == ReturnCode_t::RETCODE_OK);
}

TEST(ParticipantTests, GetParticipantProfileQos)
{
DomainParticipantFactory::get_instance()->load_XML_profiles_file("test_xml_profile.xml");
Expand Down
1 change: 1 addition & 0 deletions versions.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Forthcoming
* StringMatching
* TimeConversion
* DBQueue
* Added create participant methods that use environment XML profile for participant configuration.

Version 2.14.0
--------------
Expand Down