@@ -444,7 +444,7 @@ TEST_F(TestSubscription, handle_loaned_message) {
444444 Testing on_new_message callbacks.
445445 */
446446TEST_F (TestSubscription, on_new_message_callback) {
447- initialize ();
447+ initialize (rclcpp::NodeOptions (). use_intra_process_comms ( false ) );
448448 using test_msgs::msg::Empty;
449449
450450 auto do_nothing = [](std::shared_ptr<const test_msgs::msg::Empty>) {FAIL ();};
@@ -510,6 +510,76 @@ TEST_F(TestSubscription, on_new_message_callback) {
510510 EXPECT_THROW (sub->set_on_new_message_callback (invalid_cb), std::invalid_argument);
511511}
512512
513+ /*
514+ Testing on_new_intra_process_message callbacks.
515+ */
516+ TEST_F (TestSubscription, on_new_intra_process_message_callback) {
517+ initialize (rclcpp::NodeOptions ().use_intra_process_comms (true ));
518+ using test_msgs::msg::Empty;
519+
520+ auto do_nothing = [](std::shared_ptr<const test_msgs::msg::Empty>) {FAIL ();};
521+ auto sub = node->create_subscription <test_msgs::msg::Empty>(" ~/test_take" , 1 , do_nothing);
522+
523+ std::atomic<size_t > c1 {0 };
524+ auto increase_c1_cb = [&c1](size_t count_msgs) {c1 += count_msgs;};
525+ sub->set_on_new_intra_process_message_callback (increase_c1_cb);
526+
527+ auto pub = node->create_publisher <test_msgs::msg::Empty>(" ~/test_take" , 1 );
528+ {
529+ test_msgs::msg::Empty msg;
530+ pub->publish (msg);
531+ }
532+
533+ auto start = std::chrono::steady_clock::now ();
534+ do {
535+ std::this_thread::sleep_for (100ms);
536+ } while (c1 == 0 && std::chrono::steady_clock::now () - start < 10s);
537+
538+ EXPECT_EQ (c1.load (), 1u );
539+
540+ std::atomic<size_t > c2 {0 };
541+ auto increase_c2_cb = [&c2](size_t count_msgs) {c2 += count_msgs;};
542+ sub->set_on_new_intra_process_message_callback (increase_c2_cb);
543+
544+ {
545+ test_msgs::msg::Empty msg;
546+ pub->publish (msg);
547+ }
548+
549+ start = std::chrono::steady_clock::now ();
550+ do {
551+ std::this_thread::sleep_for (100ms);
552+ } while (c2 == 0 && std::chrono::steady_clock::now () - start < 10s);
553+
554+ EXPECT_EQ (c1.load (), 1u );
555+ EXPECT_EQ (c2.load (), 1u );
556+
557+ sub->clear_on_new_intra_process_message_callback ();
558+
559+ {
560+ test_msgs::msg::Empty msg;
561+ pub->publish (msg);
562+ pub->publish (msg);
563+ pub->publish (msg);
564+ }
565+
566+ std::atomic<size_t > c3 {0 };
567+ auto increase_c3_cb = [&c3](size_t count_msgs) {c3 += count_msgs;};
568+ sub->set_on_new_intra_process_message_callback (increase_c3_cb);
569+
570+ start = std::chrono::steady_clock::now ();
571+ do {
572+ std::this_thread::sleep_for (100ms);
573+ } while (c3 == 0 && std::chrono::steady_clock::now () - start < 10s);
574+
575+ EXPECT_EQ (c1.load (), 1u );
576+ EXPECT_EQ (c2.load (), 1u );
577+ EXPECT_EQ (c3.load (), 3u );
578+
579+ std::function<void (size_t )> invalid_cb = nullptr ;
580+ EXPECT_THROW (sub->set_on_new_intra_process_message_callback (invalid_cb), std::invalid_argument);
581+ }
582+
513583/*
514584 Testing subscription with intraprocess enabled and invalid QoS
515585 */
0 commit comments