Skip to content

Commit b75e336

Browse files
Chen LihuiChen Lihui
authored andcommitted
add test
Signed-off-by: Chen Lihui <Lihui.Chen@sony.com>
1 parent 77360b8 commit b75e336

5 files changed

Lines changed: 80 additions & 17 deletions

File tree

rclcpp/include/rclcpp/subscription_options.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,15 @@ struct SubscriptionOptionsWithAllocator : public SubscriptionOptionsBase
152152

153153
if (!content_filter_options.expression_parameters.empty()) {
154154
rcutils_string_array_t * parameters =
155-
static_cast<rcutils_string_array_t *>(allocator.allocate(
155+
static_cast<rcutils_string_array_t *>(allocator.zero_allocate(
156+
1,
156157
sizeof(rcutils_string_array_t),
157158
allocator.state));
158159
if (!parameters) {
159160
fail_clean();
160161
throw std::runtime_error("failed to allocate memory for expression parameters");
161162
}
163+
result.rmw_subscription_options.expression_parameters = parameters;
162164
rcutils_ret_t ret = rcutils_string_array_init(
163165
parameters, content_filter_options.expression_parameters.size(), &allocator);
164166
if (RCUTILS_RET_OK != ret) {
@@ -177,8 +179,6 @@ struct SubscriptionOptionsWithAllocator : public SubscriptionOptionsBase
177179
}
178180
parameters->data[i] = parameter;
179181
}
180-
181-
result.rmw_subscription_options.expression_parameters = parameters;
182182
}
183183
}
184184

rclcpp/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<test_depend>rmw</test_depend>
4444
<test_depend>rmw_implementation_cmake</test_depend>
4545
<test_depend>rosidl_default_generators</test_depend>
46+
<test_depend>std_msgs</test_depend>
4647
<test_depend>test_msgs</test_depend>
4748

4849
<export>

rclcpp/src/rclcpp/subscription_base.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,6 @@ SubscriptionBase::SubscriptionBase(
4848
type_support_(type_support_handle),
4949
is_serialized_(is_serialized)
5050
{
51-
// finalize subscription_options
52-
RCLCPP_SCOPE_EXIT(
53-
{
54-
rcl_ret_t ret = rcl_subscription_options_fini(
55-
const_cast<rcl_subscription_options_t *>(&subscription_options));
56-
if (RCL_RET_OK != ret) {
57-
RCLCPP_ERROR(
58-
rclcpp::get_node_logger(node_handle_.get()).get_child("rclcpp"),
59-
"Failed to fini subscription option: %s",
60-
rcl_get_error_string().str);
61-
rcl_reset_error();
62-
}
63-
});
64-
6551
auto custom_deletor = [node_handle = this->node_handle_](rcl_subscription_t * rcl_subs)
6652
{
6753
if (rcl_subscription_fini(rcl_subs, node_handle.get()) != RCL_RET_OK) {

rclcpp/test/rclcpp/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ if(TARGET test_subscription)
430430
"rmw"
431431
"rosidl_runtime_cpp"
432432
"rosidl_typesupport_cpp"
433+
"std_msgs"
433434
"test_msgs"
434435
)
435436
target_link_libraries(test_subscription ${PROJECT_NAME} mimick)

rclcpp/test/rclcpp/test_subscription.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "../utils/rclcpp_gtest_macros.hpp"
2929

3030
#include "test_msgs/msg/empty.hpp"
31+
#include "std_msgs/msg/string.hpp"
3132

3233
// Note: This is a long running test with rmw_connext_cpp, if you change this file, please check
3334
// that this test can complete fully, or adjust the timeout as necessary.
@@ -148,6 +149,44 @@ class SubscriptionClass
148149
}
149150
};
150151

152+
class TestCftSubscription : public ::testing::Test
153+
{
154+
public:
155+
static void SetUpTestCase()
156+
{
157+
rclcpp::init(0, nullptr);
158+
}
159+
160+
static void TearDownTestCase()
161+
{
162+
rclcpp::shutdown();
163+
}
164+
165+
void SetUp()
166+
{
167+
node = std::make_shared<rclcpp::Node>("test_cft_subscription", "/ns");
168+
rclcpp::SubscriptionOptionsBase options_base;
169+
options_base.content_filter_options.filter_expression =
170+
"data MATCH 'Hello World: 5' or data MATCH %0";
171+
options_base.content_filter_options.expression_parameters = {"'Hello World: 10'"};
172+
rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void>> subscription_options(
173+
options_base);
174+
auto callback = [](std::shared_ptr<const std_msgs::msg::String>) {};
175+
sub = node->create_subscription<std_msgs::msg::String>(
176+
"topic", 10, callback, subscription_options);
177+
}
178+
179+
void TearDown()
180+
{
181+
sub.reset();
182+
node.reset();
183+
}
184+
185+
protected:
186+
rclcpp::Node::SharedPtr node;
187+
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub;
188+
};
189+
151190
/*
152191
Testing subscription construction and destruction.
153192
*/
@@ -444,6 +483,42 @@ TEST_F(TestSubscription, handle_loaned_message) {
444483
EXPECT_NO_THROW(sub->handle_loaned_message(&msg, message_info));
445484
}
446485

486+
TEST_F(TestCftSubscription, is_cft_supported) {
487+
{
488+
auto mock = mocking_utils::patch_and_return(
489+
"lib:rclcpp", rcl_subscription_is_cft_supported, false);
490+
EXPECT_FALSE(sub->is_cft_supported());
491+
}
492+
493+
{
494+
auto mock = mocking_utils::patch_and_return(
495+
"lib:rclcpp", rcl_subscription_is_cft_supported, true);
496+
EXPECT_TRUE(sub->is_cft_supported());
497+
}
498+
}
499+
500+
TEST_F(TestCftSubscription, get_cft_expression_parameters_error) {
501+
auto mock = mocking_utils::patch_and_return(
502+
"lib:rclcpp", rcl_subscription_get_cft_expression_parameters, RCL_RET_ERROR);
503+
504+
std::string filter_expression;
505+
std::vector<std::string> expression_parameters;
506+
EXPECT_THROW(
507+
sub->get_cft_expression_parameters(filter_expression, expression_parameters),
508+
rclcpp::exceptions::RCLError);
509+
}
510+
511+
TEST_F(TestCftSubscription, set_cft_expression_parameters_error) {
512+
auto mock = mocking_utils::patch_and_return(
513+
"lib:rclcpp", rcl_subscription_set_cft_expression_parameters, RCL_RET_ERROR);
514+
515+
std::string filter_expression = "data MATCH %0";
516+
std::string expression_parameter = "'Hello World: 8'";
517+
EXPECT_THROW(
518+
sub->set_cft_expression_parameters(filter_expression, {expression_parameter}),
519+
rclcpp::exceptions::RCLError);
520+
}
521+
447522
/*
448523
Testing subscription with intraprocess enabled and invalid QoS
449524
*/

0 commit comments

Comments
 (0)