Line data Source code
1 : /**
2 : * @file ReversedListValidator_test.cxx ReversedListValidator plugin Unit Tests
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 "ReversedListValidator.hpp"
10 :
11 : #include "appfwk/ConfigurationManager.hpp"
12 : #include "opmonlib/TestOpMonManager.hpp"
13 : #include "serialization/Serialization.hpp"
14 :
15 : #define BOOST_TEST_MODULE ReversedListValidator_test // NOLINT
16 :
17 : #include "boost/test/unit_test.hpp"
18 :
19 : #include <string>
20 : #include <vector>
21 :
22 : using namespace dunedaq::listrev;
23 :
24 : BOOST_AUTO_TEST_SUITE(ReversedListValidator_test)
25 :
26 : struct ConfigurationTestFixture
27 : {
28 4 : ConfigurationTestFixture()
29 4 : {
30 4 : std::string sessionName = "lr-session";
31 4 : std::string appName = "listrev";
32 4 : std::string TEST_OKS_DB = "oksconflibs:config/lrSession-singleapp.data.xml";
33 4 : cfgmgr = std::make_shared<dunedaq::appfwk::ConfigurationManager>(TEST_OKS_DB, appName, sessionName);
34 4 : dunedaq::get_iomanager()->configure(sessionName, cfgmgr->get_queues(), cfgmgr->get_networkconnections(), nullptr, opmgr);
35 4 : }
36 4 : ~ConfigurationTestFixture()
37 : {
38 4 : dunedaq::get_iomanager()->reset();
39 4 : cfgmgr = nullptr;
40 4 : }
41 :
42 : ConfigurationTestFixture(ConfigurationTestFixture const&) = default;
43 : ConfigurationTestFixture(ConfigurationTestFixture&&) = default;
44 : ConfigurationTestFixture& operator=(ConfigurationTestFixture const&) = default;
45 : ConfigurationTestFixture& operator=(ConfigurationTestFixture&&) = default;
46 :
47 : dunedaq::opmonlib::TestOpMonManager opmgr;
48 : std::shared_ptr<dunedaq::appfwk::ConfigurationManager> cfgmgr;
49 : };
50 :
51 2 : BOOST_FIXTURE_TEST_CASE(Commands, ConfigurationTestFixture)
52 : {
53 1 : std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
54 1 : opmgr.register_node("lrv", mod);
55 1 : BOOST_REQUIRE(mod->has_command("start"));
56 1 : BOOST_REQUIRE(mod->has_command("stop"));
57 :
58 1 : mod->init(cfgmgr);
59 1 : mod->execute_command("start");
60 :
61 1 : auto metrics = opmgr.collect();
62 :
63 1 : mod->execute_command("stop");
64 :
65 1 : auto facility = opmgr.get_backend_facility();
66 1 : auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
67 1 : BOOST_REQUIRE_EQUAL(entries.size(), 1);
68 1 : BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
69 1 : BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 0);
70 1 : BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 0);
71 3 : }
72 :
73 2 : BOOST_FIXTURE_TEST_CASE(ProcessList, ConfigurationTestFixture)
74 : {
75 1 : std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
76 1 : opmgr.register_node("lrv", mod);
77 :
78 1 : std::vector<CreateList> creates_received;
79 13 : auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
80 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
81 :
82 1 : std::vector<RequestList> requests_received;
83 13 : auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
84 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
85 :
86 1 : auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
87 :
88 1 : mod->init(cfgmgr);
89 1 : mod->execute_command("start");
90 :
91 1 : usleep(100000);
92 :
93 1 : BOOST_REQUIRE(creates_received.size() > 0);
94 1 : BOOST_REQUIRE(requests_received.size() > 0);
95 1 : BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
96 1 : BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
97 :
98 1 : size_t ii = 0;
99 21 : auto g = [&]() { return ++ii; };
100 21 : auto r = [&]() { return ii--; };
101 :
102 1 : ReversedList testList(1, 0, {});
103 1 : IntList original(1, 0, {});
104 1 : IntList reversed(1, 0, {});
105 1 : std::generate_n(std::back_inserter(original.list), creates_received[0].list_size, g);
106 1 : std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size, r);
107 1 : ReversedList::Data data;
108 1 : data.original = original;
109 1 : data.reversed = reversed;
110 1 : testList.lists.push_back(data);
111 1 : list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
112 :
113 1 : usleep(10000);
114 :
115 1 : auto metrics = opmgr.collect();
116 1 : mod->execute_command("stop");
117 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
118 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
119 :
120 1 : auto facility = opmgr.get_backend_facility();
121 1 : auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
122 1 : BOOST_REQUIRE_EQUAL(entries.size(), 1);
123 1 : BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 1);
124 1 : BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 0);
125 1 : BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
126 3 : }
127 :
128 2 : BOOST_FIXTURE_TEST_CASE(InvalidList, ConfigurationTestFixture)
129 : {
130 1 : std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
131 1 : opmgr.register_node("lrv", mod);
132 :
133 1 : std::vector<CreateList> creates_received;
134 13 : auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
135 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
136 :
137 1 : std::vector<RequestList> requests_received;
138 13 : auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
139 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
140 :
141 1 : auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
142 :
143 1 : mod->init(cfgmgr);
144 1 : mod->execute_command("start");
145 :
146 1 : usleep(100000);
147 :
148 1 : BOOST_REQUIRE(creates_received.size() > 0);
149 1 : BOOST_REQUIRE(requests_received.size() > 0);
150 1 : BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
151 1 : BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
152 :
153 1 : size_t ii = 0;
154 6 : auto g = [&]() { return ++ii; };
155 6 : auto r = [&]() { return ii--; };
156 :
157 1 : ReversedList testList(1, 0, {});
158 1 : IntList original(1, 0, {});
159 1 : IntList reversed(1, 0, {});
160 1 : std::generate_n(std::back_inserter(original.list), creates_received[0].list_size, g);
161 1 : std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size, r);
162 1 : reversed.list[0]++; // Invalidate the list
163 1 : ReversedList::Data data;
164 1 : data.original = original;
165 1 : data.reversed = reversed;
166 1 : testList.lists.push_back(data);
167 1 : list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
168 :
169 1 : usleep(10000);
170 :
171 1 : auto metrics = opmgr.collect();
172 1 : mod->execute_command("stop");
173 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
174 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
175 :
176 1 : auto facility = opmgr.get_backend_facility();
177 1 : auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
178 :
179 1 : BOOST_REQUIRE_EQUAL(entries.size(), 1);
180 1 : BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
181 1 : BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 1);
182 1 : BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
183 3 : }
184 :
185 2 : BOOST_FIXTURE_TEST_CASE(WrongSizeList, ConfigurationTestFixture)
186 : {
187 1 : std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
188 1 : opmgr.register_node("lrv", mod);
189 :
190 1 : std::vector<CreateList> creates_received;
191 13 : auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
192 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
193 :
194 1 : std::vector<RequestList> requests_received;
195 13 : auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
196 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
197 :
198 1 : auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
199 :
200 1 : mod->init(cfgmgr);
201 1 : mod->execute_command("start");
202 :
203 1 : usleep(100000);
204 :
205 1 : BOOST_REQUIRE(creates_received.size() > 0);
206 1 : BOOST_REQUIRE(requests_received.size() > 0);
207 1 : BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
208 1 : BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
209 :
210 1 : size_t ii = 0;
211 12 : auto g = [&]() { return ++ii; };
212 12 : auto r = [&]() { return ii--; };
213 :
214 1 : ReversedList testList(1, 0, {});
215 1 : IntList original(1, 0, {});
216 1 : IntList reversed(1, 0, {});
217 1 : std::generate_n(std::back_inserter(original.list), creates_received[0].list_size + 1, g);
218 1 : std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size + 1, r);
219 1 : ReversedList::Data data;
220 1 : data.original = original;
221 1 : data.reversed = reversed;
222 1 : testList.lists.push_back(data);
223 1 : list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
224 :
225 1 : usleep(10000);
226 :
227 1 : auto metrics = opmgr.collect();
228 1 : mod->execute_command("stop");
229 1 : dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
230 1 : dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
231 :
232 1 : auto facility = opmgr.get_backend_facility();
233 1 : auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
234 :
235 1 : BOOST_REQUIRE_EQUAL(entries.size(), 1);
236 1 : BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
237 1 : BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 1);
238 1 : BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
239 3 : }
240 : BOOST_AUTO_TEST_SUITE_END()
|