@@ -278,3 +278,155 @@ TEST_F(CLASSNAME(TestSubscriptionFixture, RMW_IMPLEMENTATION), test_subscription
278278 ASSERT_EQ (std::string (test_string), std::string (msg.string_value .data , msg.string_value .size ));
279279 }
280280}
281+
282+ /* Basic nominal test of a subscription taking a sequence.
283+ */
284+ TEST_F (
285+ CLASSNAME (
286+ TestSubscriptionFixture,
287+ RMW_IMPLEMENTATION), test_subscription_nominal_string_sequence) {
288+ rcl_ret_t ret;
289+ rcl_publisher_t publisher = rcl_get_zero_initialized_publisher ();
290+ const rosidl_message_type_support_t * ts =
291+ ROSIDL_GET_MSG_TYPE_SUPPORT (test_msgs, msg, Strings);
292+ const char * topic = " rcl_test_subscription_nominal_string_sequence_chatter" ;
293+ rcl_publisher_options_t publisher_options = rcl_publisher_get_default_options ();
294+ ret = rcl_publisher_init (&publisher, this ->node_ptr , ts, topic, &publisher_options);
295+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
296+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
297+ {
298+ rcl_ret_t ret = rcl_publisher_fini (&publisher, this ->node_ptr );
299+ EXPECT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
300+ });
301+ rcl_subscription_t subscription = rcl_get_zero_initialized_subscription ();
302+ rcl_subscription_options_t subscription_options = rcl_subscription_get_default_options ();
303+ ret = rcl_subscription_init (&subscription, this ->node_ptr , ts, topic, &subscription_options);
304+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
305+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
306+ {
307+ rcl_ret_t ret = rcl_subscription_fini (&subscription, this ->node_ptr );
308+ EXPECT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
309+ });
310+ // TODO(wjwwood): add logic to wait for the connection to be established
311+ // probably using the count_subscriptions busy wait mechanism
312+ // until then we will sleep for a short period of time
313+ std::this_thread::sleep_for (std::chrono::milliseconds (1000 ));
314+ const char * test_string = " testing" ;
315+ {
316+ test_msgs__msg__Strings msg;
317+ test_msgs__msg__Strings__init (&msg);
318+ ASSERT_TRUE (rosidl_runtime_c__String__assign (&msg.string_value , test_string));
319+ ret = rcl_publish (&publisher, &msg, nullptr );
320+ ret = rcl_publish (&publisher, &msg, nullptr );
321+ ret = rcl_publish (&publisher, &msg, nullptr );
322+ test_msgs__msg__Strings__fini (&msg);
323+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
324+ }
325+ bool success;
326+ wait_for_subscription_to_be_ready (&subscription, context_ptr, 10 , 100 , success);
327+ ASSERT_TRUE (success);
328+ auto allocator = rcutils_get_default_allocator ();
329+ {
330+ size_t size = 1 ;
331+ rmw_message_info_sequence_t message_infos;
332+ rmw_message_info_sequence_init (&message_infos, size, &allocator);
333+
334+ rmw_message_sequence_t messages;
335+ rmw_message_sequence_init (&messages, size, &allocator);
336+
337+ auto seq = test_msgs__msg__Strings__Sequence__create (size);
338+
339+ for (size_t ii = 0 ; ii < size; ++ii) {
340+ messages.data [ii] = &seq->data [ii];
341+ }
342+
343+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
344+ {
345+ rmw_message_info_sequence_fini (&message_infos);
346+ rmw_message_sequence_fini (&messages);
347+ test_msgs__msg__Strings__Sequence__destroy (seq);
348+ });
349+
350+ // Attempt to take more than capacity allows.
351+ ret = rcl_take_sequence (&subscription, 5 , &messages, &message_infos, nullptr );
352+ ASSERT_EQ (RCL_RET_INVALID_ARGUMENT, ret) << rcl_get_error_string ().str ;
353+
354+ ASSERT_EQ (0u , messages.size );
355+ ASSERT_EQ (0u , message_infos.size );
356+ }
357+
358+ {
359+ size_t size = 5 ;
360+ rmw_message_info_sequence_t message_infos;
361+ rmw_message_info_sequence_init (&message_infos, size, &allocator);
362+
363+ rmw_message_sequence_t messages;
364+ rmw_message_sequence_init (&messages, size, &allocator);
365+
366+ auto seq = test_msgs__msg__Strings__Sequence__create (size);
367+
368+ for (size_t ii = 0 ; ii < size; ++ii) {
369+ messages.data [ii] = &seq->data [ii];
370+ }
371+
372+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
373+ {
374+ rmw_message_info_sequence_fini (&message_infos);
375+ rmw_message_sequence_fini (&messages);
376+ test_msgs__msg__Strings__Sequence__destroy (seq);
377+ });
378+
379+ ret = rcl_take_sequence (&subscription, 5 , &messages, &message_infos, nullptr );
380+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
381+ ASSERT_EQ (3u , messages.size );
382+ ASSERT_EQ (3u , message_infos.size );
383+ }
384+
385+ {
386+ test_msgs__msg__Strings msg;
387+ test_msgs__msg__Strings__init (&msg);
388+ ASSERT_TRUE (rosidl_runtime_c__String__assign (&msg.string_value , test_string));
389+ ret = rcl_publish (&publisher, &msg, nullptr );
390+ ret = rcl_publish (&publisher, &msg, nullptr );
391+ ret = rcl_publish (&publisher, &msg, nullptr );
392+ ret = rcl_publish (&publisher, &msg, nullptr );
393+ ret = rcl_publish (&publisher, &msg, nullptr );
394+ test_msgs__msg__Strings__fini (&msg);
395+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
396+ }
397+
398+ // Give a brief moment for publications to go through.
399+ std::this_thread::sleep_for (std::chrono::milliseconds (500 ));
400+ // Take fewer messages than are available in the subscription
401+ {
402+ size_t size = 3 ;
403+ rmw_message_info_sequence_t message_infos;
404+ rmw_message_info_sequence_init (&message_infos, size, &allocator);
405+
406+ rmw_message_sequence_t messages;
407+ rmw_message_sequence_init (&messages, size, &allocator);
408+
409+ auto seq = test_msgs__msg__Strings__Sequence__create (size);
410+
411+ for (size_t ii = 0 ; ii < size; ++ii) {
412+ messages.data [ii] = &seq->data [ii];
413+ }
414+
415+ OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT (
416+ {
417+ rmw_message_info_sequence_fini (&message_infos);
418+ rmw_message_sequence_fini (&messages);
419+ test_msgs__msg__Strings__Sequence__destroy (seq);
420+ });
421+
422+ ret = rcl_take_sequence (&subscription, 3 , &messages, &message_infos, nullptr );
423+
424+ ASSERT_EQ (RCL_RET_OK, ret) << rcl_get_error_string ().str ;
425+ ASSERT_EQ (3u , messages.size );
426+ ASSERT_EQ (3u , message_infos.size );
427+
428+ ASSERT_EQ (
429+ std::string (test_string),
430+ std::string (seq->data [0 ].string_value .data , seq->data [0 ].string_value .size ));
431+ }
432+ }
0 commit comments