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()
|