LCOV - code coverage report
Current view: top level - ipm/unittest - ZmqSendReceive_test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 100.0 % 63 63
Test Date: 2026-02-16 10:18:04 Functions: 100.0 % 5 5

            Line data    Source code
       1              : /**
       2              :  * @file ZmqSendReceive_test.cxx Test ZmqSender to ZmqReceiver transfer
       3              :  *
       4              :  * This is part of the DUNE DAQ Application Framework, copyright 2020.
       5              :  * Licensing/copyright details are in the COPYING file that you should have
       6              :  * received with this code.
       7              :  */
       8              : 
       9              : #include "ipm/Receiver.hpp"
      10              : #include "ipm/Sender.hpp"
      11              : 
      12              : #define BOOST_TEST_MODULE ZmqSendReceive_test // NOLINT
      13              : 
      14              : #include "boost/test/unit_test.hpp"
      15              : 
      16              : #include <string>
      17              : #include <vector>
      18              : 
      19              : using namespace dunedaq::ipm;
      20              : 
      21              : BOOST_AUTO_TEST_SUITE(ZmqSendReceive_test)
      22              : 
      23            2 : BOOST_AUTO_TEST_CASE(SendReceiveTest)
      24              : {
      25            1 :   auto the_receiver = make_ipm_receiver("ZmqReceiver");
      26            1 :   BOOST_REQUIRE(the_receiver != nullptr);
      27            1 :   BOOST_REQUIRE(!the_receiver->can_receive());
      28            1 :   BOOST_REQUIRE(!the_receiver->data_pending());
      29              : 
      30            1 :   auto the_sender = make_ipm_sender("ZmqSender");
      31            1 :   BOOST_REQUIRE(the_sender != nullptr);
      32            1 :   BOOST_REQUIRE(!the_sender->can_send());
      33              : 
      34            1 :   Sender::ConnectionInfo send_info("ZmqSendReceive", "inproc://default");
      35            1 :   Receiver::ConnectionInfo recv_info("ZmqSendReceive", "inproc://default");
      36            1 :   the_receiver->connect_for_receives(recv_info);
      37            1 :   the_sender->connect_for_sends(send_info);
      38              : 
      39            1 :   BOOST_REQUIRE(the_receiver->can_receive());
      40            1 :   BOOST_REQUIRE(!the_receiver->data_pending());
      41            1 :   BOOST_REQUIRE(the_sender->can_send());
      42              : 
      43            1 :   std::vector<char> test_data{ 'T', 'E', 'S', 'T' };
      44              : 
      45            1 :   the_sender->send(test_data.data(), test_data.size(), Sender::s_no_block);
      46            1 :   BOOST_REQUIRE(the_receiver->data_pending());
      47            1 :   auto response = the_receiver->receive(Receiver::s_block);
      48            1 :   BOOST_REQUIRE(!the_receiver->data_pending());
      49              : 
      50            1 :   BOOST_REQUIRE_EQUAL(response.data.size(), 4);
      51            1 :   BOOST_REQUIRE_EQUAL(response.data[0], 'T');
      52            1 :   BOOST_REQUIRE_EQUAL(response.data[1], 'E');
      53            1 :   BOOST_REQUIRE_EQUAL(response.data[2], 'S');
      54            1 :   BOOST_REQUIRE_EQUAL(response.data[3], 'T');
      55            1 : }
      56              : 
      57            2 : BOOST_AUTO_TEST_CASE(CallbackTest)
      58              : {
      59              : 
      60            1 :   auto the_receiver = make_ipm_receiver("ZmqReceiver");
      61            1 :   BOOST_REQUIRE(the_receiver != nullptr);
      62            1 :   BOOST_REQUIRE(!the_receiver->can_receive());
      63              : 
      64            1 :   auto the_sender = make_ipm_sender("ZmqSender");
      65            1 :   BOOST_REQUIRE(the_sender != nullptr);
      66            1 :   BOOST_REQUIRE(!the_sender->can_send());
      67              : 
      68            1 :   Sender::ConnectionInfo send_info("ZmqSendReceive-Callbacks", "inproc://default");
      69            1 :   Receiver::ConnectionInfo recv_info("ZmqSendReceive-Callbacks", "inproc://default");
      70            1 :   the_receiver->connect_for_receives(recv_info);
      71            1 :   the_sender->connect_for_sends(send_info);
      72              : 
      73            1 :   BOOST_REQUIRE(the_receiver->can_receive());
      74            1 :   BOOST_REQUIRE(the_sender->can_send());
      75              : 
      76            1 :   std::vector<char> test_data{ 'T', 'E', 'S', 'T' };
      77            1 :   std::atomic<bool> message_received = false;
      78              : 
      79            3 :   auto callback_fun = [&](Receiver::Response& res) {
      80            2 :     BOOST_REQUIRE_EQUAL(res.data.size(), test_data.size());
      81           18 :     for (size_t ii = 0; ii < res.data.size(); ++ii) {
      82           16 :       BOOST_REQUIRE_EQUAL(res.data[ii], test_data[ii]);
      83              :     }
      84            2 :     message_received = true;
      85            3 :   };
      86            1 :   the_receiver->register_callback(callback_fun);
      87              : 
      88            1 :   the_sender->send(test_data.data(), test_data.size(), Sender::s_no_block);
      89            2 :   while (!message_received.load()) {
      90            1 :     usleep(15000);
      91              :   }
      92              : 
      93            1 :   message_received = false;
      94            1 :   test_data = { 'A', 'N', 'O', 'T', 'H', 'E', 'R', ' ', 'T', 'E', 'S', 'T' };
      95            1 :   the_sender->send(test_data.data(), test_data.size(), Sender::s_no_block);
      96            2 :   while (!message_received.load()) {
      97            1 :     usleep(15000);
      98              :   }
      99              : 
     100            1 :   message_received = false;
     101            1 :   test_data = { 'A', ' ', 'T', 'H', 'I', 'R', 'D', ' ', 'T', 'E', 'S', 'T' };
     102            1 :   the_receiver->unregister_callback();
     103            1 :   the_sender->send(test_data.data(), test_data.size(), Sender::s_no_block);
     104              : 
     105            1 :   usleep(100000);
     106            1 :   BOOST_REQUIRE_EQUAL(message_received, false);
     107            1 : }
     108              : 
     109              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1