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