Skip to content

Commit ee4e7d0

Browse files
authored
Utility to convert QoS ids and masks to string (#120)
* Auxiliar methods to convert to string QoS ids and policies Signed-off-by: tempate <danieldiaz@eprosima.com> * Documentation Signed-off-by: tempate <danieldiaz@eprosima.com> * Uncrustify Signed-off-by: tempate <danieldiaz@eprosima.com> * Tests Signed-off-by: tempate <danieldiaz@eprosima.com> * Print invalid policy masks as invalid Signed-off-by: tempate <danieldiaz@eprosima.com> * Apply self-suggestions Signed-off-by: tempate <danieldiaz@eprosima.com> * Apply suggestions Signed-off-by: tempate <danieldiaz@eprosima.com> --------- Signed-off-by: tempate <danieldiaz@eprosima.com>
1 parent 28dfaaa commit ee4e7d0

6 files changed

Lines changed: 386 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2024 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
/**
16+
* @file qos_utils.hpp
17+
*/
18+
19+
#pragma once
20+
21+
#include <string>
22+
23+
#include <fastdds/dds/core/policy/QosPolicies.hpp>
24+
25+
#include <cpp_utils/library/library_dll.h>
26+
27+
namespace eprosima {
28+
namespace utils {
29+
30+
/**
31+
* @brief Converts a \c QosPolicyId_t to a string.
32+
*
33+
* @param qos_policy_id The \c QosPolicyId_t to convert.
34+
* @return The string representation of the \c QosPolicyId_t.
35+
*/
36+
CPP_UTILS_DllAPI std::string qos_policy_id_to_string(
37+
const fastdds::dds::QosPolicyId_t& qos_policy_id);
38+
39+
/**
40+
* @brief Converts a \c PolicyMask to a string.
41+
*
42+
* @param qos_policy_mask The \c PolicyMask to convert.
43+
* @return The string representation of the \c PolicyMask.
44+
*/
45+
CPP_UTILS_DllAPI std::string qos_policy_mask_to_string(
46+
const fastdds::dds::PolicyMask& qos_policy_mask);
47+
48+
} /* namespace utils */
49+
} /* namespace eprosima */
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright 2024 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
/**
16+
* @file qos_utils.cpp
17+
*/
18+
19+
#include <string>
20+
21+
#include <fastdds/dds/core/policy/QosPolicies.hpp>
22+
23+
#include <cpp_utils/qos/qos_utils.hpp>
24+
25+
using namespace eprosima::fastdds::dds;
26+
27+
namespace eprosima {
28+
namespace utils {
29+
30+
std::string qos_policy_id_to_string(
31+
const QosPolicyId_t& qos_policy_id)
32+
{
33+
switch (qos_policy_id)
34+
{
35+
case QosPolicyId_t::USERDATA_QOS_POLICY_ID:
36+
return "User data";
37+
case QosPolicyId_t::DURABILITY_QOS_POLICY_ID:
38+
return "Durability";
39+
case QosPolicyId_t::PRESENTATION_QOS_POLICY_ID:
40+
return "Presentation";
41+
case QosPolicyId_t::DEADLINE_QOS_POLICY_ID:
42+
return "Deadline";
43+
case QosPolicyId_t::LATENCYBUDGET_QOS_POLICY_ID:
44+
return "Latency budget";
45+
case QosPolicyId_t::OWNERSHIP_QOS_POLICY_ID:
46+
return "Ownership";
47+
case QosPolicyId_t::OWNERSHIPSTRENGTH_QOS_POLICY_ID:
48+
return "Ownership strength";
49+
case QosPolicyId_t::LIVELINESS_QOS_POLICY_ID:
50+
return "Liveliness";
51+
case QosPolicyId_t::TIMEBASEDFILTER_QOS_POLICY_ID:
52+
return "Time-based filter";
53+
case QosPolicyId_t::PARTITION_QOS_POLICY_ID:
54+
return "Partition";
55+
case QosPolicyId_t::RELIABILITY_QOS_POLICY_ID:
56+
return "Reliability";
57+
case QosPolicyId_t::DESTINATIONORDER_QOS_POLICY_ID:
58+
return "Destination order";
59+
case QosPolicyId_t::HISTORY_QOS_POLICY_ID:
60+
return "History";
61+
case QosPolicyId_t::RESOURCELIMITS_QOS_POLICY_ID:
62+
return "Resource limits";
63+
case QosPolicyId_t::ENTITYFACTORY_QOS_POLICY_ID:
64+
return "Entity factory";
65+
case QosPolicyId_t::WRITERDATALIFECYCLE_QOS_POLICY_ID:
66+
return "Writer data lifecycle";
67+
case QosPolicyId_t::READERDATALIFECYCLE_QOS_POLICY_ID:
68+
return "Reader data lifecycle";
69+
case QosPolicyId_t::TOPICDATA_QOS_POLICY_ID:
70+
return "Topic data";
71+
case QosPolicyId_t::GROUPDATA_QOS_POLICY_ID:
72+
return "Group data";
73+
case QosPolicyId_t::TRANSPORTPRIORITY_QOS_POLICY_ID:
74+
return "Transport priority";
75+
case QosPolicyId_t::LIFESPAN_QOS_POLICY_ID:
76+
return "Lifespan";
77+
case QosPolicyId_t::DURABILITYSERVICE_QOS_POLICY_ID:
78+
return "Durability service";
79+
case QosPolicyId_t::DATAREPRESENTATION_QOS_POLICY_ID:
80+
return "Data representation";
81+
case QosPolicyId_t::TYPECONSISTENCYENFORCEMENT_QOS_POLICY_ID:
82+
return "Type consistency enforcement";
83+
case QosPolicyId_t::DISABLEPOSITIVEACKS_QOS_POLICY_ID:
84+
return "Disable positive acks";
85+
case QosPolicyId_t::PARTICIPANTRESOURCELIMITS_QOS_POLICY_ID:
86+
return "Participant resource limits";
87+
case QosPolicyId_t::PROPERTYPOLICY_QOS_POLICY_ID:
88+
return "Property policy";
89+
case QosPolicyId_t::PUBLISHMODE_QOS_POLICY_ID:
90+
return "Publish mode";
91+
case QosPolicyId_t::READERRESOURCELIMITS_QOS_POLICY_ID:
92+
return "Reader resource limits";
93+
case QosPolicyId_t::RTPSENDPOINT_QOS_POLICY_ID:
94+
return "RTPS endpoint";
95+
case QosPolicyId_t::RTPSRELIABLEREADER_QOS_POLICY_ID:
96+
return "RTPS reliable reader";
97+
case QosPolicyId_t::RTPSRELIABLEWRITER_QOS_POLICY_ID:
98+
return "RTPS reliable writer";
99+
case QosPolicyId_t::TRANSPORTCONFIG_QOS_POLICY_ID:
100+
return "Transport config";
101+
case QosPolicyId_t::TYPECONSISTENCY_QOS_POLICY_ID:
102+
return "Type consistency";
103+
case QosPolicyId_t::WIREPROTOCOLCONFIG_QOS_POLICY_ID:
104+
return "Wire protocol config";
105+
case QosPolicyId_t::WRITERRESOURCELIMITS_QOS_POLICY_ID:
106+
return "Writer resource limits";
107+
case QosPolicyId_t::INVALID_QOS_POLICY_ID:
108+
default:
109+
return "Invalid";
110+
}
111+
}
112+
113+
std::string qos_policy_mask_to_string(
114+
const PolicyMask& qos_policy_mask)
115+
{
116+
if (qos_policy_mask.none())
117+
{
118+
return qos_policy_id_to_string(QosPolicyId_t::INVALID_QOS_POLICY_ID);
119+
}
120+
121+
std::string policy_mask_str;
122+
bool first_id_in_mask = true;
123+
124+
for (std::uint32_t id_int = QosPolicyId_t::INVALID_QOS_POLICY_ID; id_int < QosPolicyId_t::NEXT_QOS_POLICY_ID;
125+
id_int++)
126+
{
127+
const auto qos_policy_id = static_cast<QosPolicyId_t>(id_int);
128+
129+
if (qos_policy_mask.test(qos_policy_id))
130+
{
131+
if (first_id_in_mask)
132+
{
133+
first_id_in_mask = false;
134+
}
135+
else
136+
{
137+
policy_mask_str += ", ";
138+
}
139+
140+
policy_mask_str += qos_policy_id_to_string(qos_policy_id);
141+
}
142+
}
143+
144+
return policy_mask_str;
145+
}
146+
147+
} /* namespace utils */
148+
} /* namespace eprosima */

cpp_utils/test/unittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_subdirectory(macros)
2323
add_subdirectory(math)
2424
add_subdirectory(math/random)
2525
add_subdirectory(memory)
26+
add_subdirectory(qos)
2627
add_subdirectory(return_code)
2728
add_subdirectory(ros2_mangling)
2829
add_subdirectory(testing)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Copyright 2024 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
############################
16+
# QOS UTILS TEST
17+
############################
18+
19+
set(TEST_NAME qos_utils_test)
20+
21+
set(TEST_SOURCES
22+
qos_utils_test.cpp
23+
${PROJECT_SOURCE_DIR}/src/cpp/qos/qos_utils.cpp
24+
)
25+
26+
set(TEST_LIST
27+
qos_policy_id_to_string,
28+
qos_policy_mask_to_string
29+
)
30+
31+
set(TEST_EXTRA_LIBRARIES
32+
fastcdr
33+
fastdds
34+
$<$<BOOL:${WIN32}>:iphlpapi$<SEMICOLON>Shlwapi>
35+
)
36+
37+
add_unittest_executable(
38+
"${TEST_NAME}"
39+
"${TEST_SOURCES}"
40+
"${TEST_LIST}"
41+
"${TEST_EXTRA_LIBRARIES}"
42+
)
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// Copyright 2024 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <map>
16+
#include <string>
17+
18+
#include <cpp_utils/testing/gtest_aux.hpp>
19+
#include <gtest/gtest.h>
20+
21+
#include <fastdds/dds/core/policy/QosPolicies.hpp>
22+
23+
#include <cpp_utils/qos/qos_utils.hpp>
24+
25+
using namespace eprosima;
26+
using namespace eprosima::fastdds::dds;
27+
28+
std::map<QosPolicyId_t, std::string> ids_to_str{
29+
{QosPolicyId_t::USERDATA_QOS_POLICY_ID, "User data"},
30+
{QosPolicyId_t::DURABILITY_QOS_POLICY_ID, "Durability"},
31+
{QosPolicyId_t::PRESENTATION_QOS_POLICY_ID, "Presentation"},
32+
{QosPolicyId_t::DEADLINE_QOS_POLICY_ID, "Deadline"},
33+
{QosPolicyId_t::LATENCYBUDGET_QOS_POLICY_ID, "Latency budget"},
34+
{QosPolicyId_t::OWNERSHIP_QOS_POLICY_ID, "Ownership"},
35+
{QosPolicyId_t::OWNERSHIPSTRENGTH_QOS_POLICY_ID, "Ownership strength"},
36+
{QosPolicyId_t::LIVELINESS_QOS_POLICY_ID, "Liveliness"},
37+
{QosPolicyId_t::TIMEBASEDFILTER_QOS_POLICY_ID, "Time-based filter"},
38+
{QosPolicyId_t::PARTITION_QOS_POLICY_ID, "Partition"},
39+
{QosPolicyId_t::RELIABILITY_QOS_POLICY_ID, "Reliability"},
40+
{QosPolicyId_t::DESTINATIONORDER_QOS_POLICY_ID, "Destination order"},
41+
{QosPolicyId_t::HISTORY_QOS_POLICY_ID, "History"},
42+
{QosPolicyId_t::RESOURCELIMITS_QOS_POLICY_ID, "Resource limits"},
43+
{QosPolicyId_t::ENTITYFACTORY_QOS_POLICY_ID, "Entity factory"},
44+
{QosPolicyId_t::WRITERDATALIFECYCLE_QOS_POLICY_ID, "Writer data lifecycle"},
45+
{QosPolicyId_t::READERDATALIFECYCLE_QOS_POLICY_ID, "Reader data lifecycle"},
46+
{QosPolicyId_t::TOPICDATA_QOS_POLICY_ID, "Topic data"},
47+
{QosPolicyId_t::GROUPDATA_QOS_POLICY_ID, "Group data"},
48+
{QosPolicyId_t::TRANSPORTPRIORITY_QOS_POLICY_ID, "Transport priority"},
49+
{QosPolicyId_t::LIFESPAN_QOS_POLICY_ID, "Lifespan"},
50+
{QosPolicyId_t::DURABILITYSERVICE_QOS_POLICY_ID, "Durability service"},
51+
{QosPolicyId_t::DATAREPRESENTATION_QOS_POLICY_ID, "Data representation"},
52+
{QosPolicyId_t::TYPECONSISTENCYENFORCEMENT_QOS_POLICY_ID, "Type consistency enforcement"},
53+
{QosPolicyId_t::DISABLEPOSITIVEACKS_QOS_POLICY_ID, "Disable positive acks"},
54+
{QosPolicyId_t::PARTICIPANTRESOURCELIMITS_QOS_POLICY_ID, "Participant resource limits"},
55+
{QosPolicyId_t::PROPERTYPOLICY_QOS_POLICY_ID, "Property policy"},
56+
{QosPolicyId_t::PUBLISHMODE_QOS_POLICY_ID, "Publish mode"},
57+
{QosPolicyId_t::READERRESOURCELIMITS_QOS_POLICY_ID, "Reader resource limits"},
58+
{QosPolicyId_t::RTPSENDPOINT_QOS_POLICY_ID, "RTPS endpoint"},
59+
{QosPolicyId_t::RTPSRELIABLEREADER_QOS_POLICY_ID, "RTPS reliable reader"},
60+
{QosPolicyId_t::RTPSRELIABLEWRITER_QOS_POLICY_ID, "RTPS reliable writer"},
61+
{QosPolicyId_t::TRANSPORTCONFIG_QOS_POLICY_ID, "Transport config"},
62+
{QosPolicyId_t::TYPECONSISTENCY_QOS_POLICY_ID, "Type consistency"},
63+
{QosPolicyId_t::WIREPROTOCOLCONFIG_QOS_POLICY_ID, "Wire protocol config"},
64+
{QosPolicyId_t::WRITERRESOURCELIMITS_QOS_POLICY_ID, "Writer resource limits"},
65+
{QosPolicyId_t::INVALID_QOS_POLICY_ID, "Invalid"}};
66+
67+
/**
68+
* Test \c qos_policy_id_to_string call
69+
*/
70+
TEST(qos_utils_test, qos_policy_id_to_string)
71+
{
72+
for (const auto& id_to_str : ids_to_str)
73+
{
74+
const auto id_str = utils::qos_policy_id_to_string(id_to_str.first);
75+
ASSERT_EQ(id_str, id_to_str.second);
76+
}
77+
}
78+
79+
/**
80+
* Test \c qos_policy_mask_to_string call
81+
*/
82+
TEST(qos_utils_test, qos_policy_mask_to_string)
83+
{
84+
// Empty mask
85+
{
86+
const PolicyMask mask;
87+
const auto mask_str = utils::qos_policy_mask_to_string(mask);
88+
const auto mask_str_expected = ids_to_str.at(QosPolicyId_t::INVALID_QOS_POLICY_ID);
89+
ASSERT_EQ(mask_str, mask_str_expected);
90+
}
91+
92+
// One policy
93+
{
94+
for (const auto& id_to_str : ids_to_str)
95+
{
96+
PolicyMask mask;
97+
mask.set(id_to_str.first);
98+
99+
const auto mask_str = utils::qos_policy_mask_to_string(mask);
100+
const auto mask_str_expected = id_to_str.second;
101+
ASSERT_EQ(mask_str, mask_str_expected);
102+
}
103+
}
104+
105+
// All policies
106+
{
107+
PolicyMask mask;
108+
109+
for (const auto& id_to_str : ids_to_str)
110+
{
111+
mask.set(id_to_str.first);
112+
}
113+
114+
const auto mask_str = utils::qos_policy_mask_to_string(mask);
115+
const auto mask_str_expected =
116+
"Invalid, User data, Durability, Presentation, Deadline, Latency budget, Ownership, "
117+
"Ownership strength, Liveliness, Time-based filter, Partition, Reliability, Destination order, "
118+
"History, Resource limits, Entity factory, Writer data lifecycle, Reader data lifecycle, Topic data, "
119+
"Group data, Transport priority, Lifespan, Durability service, Data representation, "
120+
"Type consistency enforcement, Disable positive acks, Participant resource limits, Property policy, "
121+
"Publish mode, Reader resource limits, RTPS endpoint, RTPS reliable reader, RTPS reliable writer, "
122+
"Transport config, Type consistency, Wire protocol config, Writer resource limits";
123+
ASSERT_EQ(mask_str, mask_str_expected);
124+
}
125+
126+
// Invalid policy
127+
{
128+
PolicyMask mask;
129+
mask.set(QosPolicyId_t::INVALID_QOS_POLICY_ID);
130+
131+
const auto mask_str = utils::qos_policy_mask_to_string(mask);
132+
const auto mask_str_expected = ids_to_str.at(QosPolicyId_t::INVALID_QOS_POLICY_ID);
133+
ASSERT_EQ(mask_str, mask_str_expected);
134+
}
135+
}
136+
137+
int main(
138+
int argc,
139+
char** argv)
140+
{
141+
::testing::InitGoogleTest(&argc, argv);
142+
return RUN_ALL_TESTS();
143+
}

0 commit comments

Comments
 (0)