Line data Source code
1 : /**
2 : * @file TriggerRecord_serialization_test.cxx TriggerRecord class serialization 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 "dfmessages/TriggerRecord_serialization.hpp"
10 :
11 : /**
12 : * @brief Name of this test module
13 : */
14 : #define BOOST_TEST_MODULE TriggerRecord_serialization_test // NOLINT
15 :
16 : #include "boost/test/unit_test.hpp"
17 :
18 : #include <memory>
19 : #include <string>
20 : #include <utility>
21 : #include <vector>
22 :
23 : using namespace dunedaq::daqdataformats;
24 :
25 : BOOST_AUTO_TEST_SUITE(TriggerRecord_serialization_test)
26 :
27 2 : BOOST_AUTO_TEST_CASE(SerDes_MsgPack)
28 : {
29 : // Setup
30 1 : std::vector<ComponentRequest> components;
31 1 : components.emplace_back();
32 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
33 1 : components.back().component.id = 2;
34 1 : components.back().window_begin = 3;
35 1 : components.back().window_end = 4;
36 1 : components.emplace_back();
37 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
38 1 : components.back().component.id = 6;
39 1 : components.back().window_begin = 7;
40 1 : components.back().window_end = 8;
41 :
42 1 : TriggerRecordHeader record_header(components);
43 1 : record_header.set_trigger_number(1);
44 1 : record_header.set_trigger_timestamp(2);
45 1 : record_header.set_run_number(3);
46 1 : record_header.set_trigger_type(4);
47 1 : record_header.set_sequence_number(5);
48 1 : record_header.set_max_sequence_number(6);
49 :
50 1 : TriggerRecord record(record_header);
51 :
52 1 : FragmentHeader header;
53 1 : header.size = sizeof(FragmentHeader) + 4;
54 1 : header.trigger_number = 1;
55 1 : header.trigger_timestamp = 2;
56 1 : header.run_number = 3;
57 :
58 1 : auto frag = malloc(sizeof(FragmentHeader) + 4);
59 1 : memcpy(frag, &header, sizeof(FragmentHeader));
60 :
61 1 : uint8_t one = 1, two = 2, three = 3, four = 4; // NOLINT(build/unsigned)
62 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader), &one, 1); // NOLINT(build/unsigned)
63 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 1, &two, 1); // NOLINT(build/unsigned)
64 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 2, &three, 1); // NOLINT(build/unsigned)
65 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 3, &four, 1); // NOLINT(build/unsigned)
66 :
67 1 : auto another_frag = malloc(sizeof(FragmentHeader) + 8);
68 1 : header.size = sizeof(FragmentHeader) + 8;
69 1 : memcpy(another_frag, &header, sizeof(FragmentHeader));
70 :
71 1 : uint8_t five = 5, six = 6, seven = 7, eight = 8; // NOLINT(build/unsigned)
72 1 : uint8_t nine = 9, ten = 10, eleven = 11, twelve = 12; // NOLINT(build/unsigned)
73 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader), &five, 1); // NOLINT(build/unsigned)
74 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 1, &six, 1); // NOLINT(build/unsigned)
75 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 2, &seven, 1); // NOLINT(build/unsigned)
76 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 3, &eight, 1); // NOLINT(build/unsigned)
77 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 4, &nine, 1); // NOLINT(build/unsigned)
78 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 5, &ten, 1); // NOLINT(build/unsigned)
79 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 6, &eleven, 1); // NOLINT(build/unsigned)
80 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 7, &twelve, 1); // NOLINT(build/unsigned)
81 :
82 1 : auto test_frag = std::make_unique<Fragment>(frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
83 1 : auto another_test_frag = std::make_unique<Fragment>(another_frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
84 :
85 1 : record.add_fragment(std::move(test_frag));
86 1 : record.add_fragment(std::move(another_test_frag));
87 :
88 : // SERIALIZE
89 1 : auto bytes = dunedaq::serialization::serialize(record, dunedaq::serialization::kMsgPack);
90 :
91 : // DESERIALIZE
92 1 : TriggerRecord deserialized = dunedaq::serialization::deserialize<TriggerRecord>(bytes);
93 :
94 : // TEST
95 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().num_requested_components, 2);
96 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_number, 1);
97 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_timestamp, 2);
98 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().run_number, 3);
99 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_type, 4);
100 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().sequence_number, 5);
101 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().max_sequence_number, 6);
102 :
103 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().size(), 2);
104 :
105 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_trigger_number(), 1);
106 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_trigger_timestamp(), 2);
107 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_run_number(), 3);
108 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_trigger_number(), 1);
109 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_trigger_timestamp(), 2);
110 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_run_number(), 3);
111 :
112 1 : BOOST_REQUIRE_EQUAL(
113 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 0), // NOLINT(build/unsigned)
114 : 1); // NOLINT(build/unsigned)
115 1 : BOOST_REQUIRE_EQUAL(
116 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 1), // NOLINT(build/unsigned)
117 : 2); // NOLINT(build/unsigned)
118 1 : BOOST_REQUIRE_EQUAL(
119 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 2), // NOLINT(build/unsigned)
120 : 3); // NOLINT(build/unsigned)
121 1 : BOOST_REQUIRE_EQUAL(
122 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 3), // NOLINT(build/unsigned)
123 : 4); // NOLINT(build/unsigned)
124 :
125 1 : BOOST_REQUIRE_EQUAL(
126 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 0), // NOLINT(build/unsigned)
127 : 5); // NOLINT(build/unsigned)
128 1 : BOOST_REQUIRE_EQUAL(
129 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 1), // NOLINT(build/unsigned)
130 : 6); // NOLINT(build/unsigned)
131 1 : BOOST_REQUIRE_EQUAL(
132 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 2), // NOLINT(build/unsigned)
133 : 7); // NOLINT(build/unsigned)
134 1 : BOOST_REQUIRE_EQUAL(
135 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 3), // NOLINT(build/unsigned)
136 : 8); // NOLINT(build/unsigned)
137 1 : BOOST_REQUIRE_EQUAL(
138 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 4), // NOLINT(build/unsigned)
139 : 9); // NOLINT(build/unsigned)
140 1 : BOOST_REQUIRE_EQUAL(
141 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 5), // NOLINT(build/unsigned)
142 : 10); // NOLINT(build/unsigned
143 1 : BOOST_REQUIRE_EQUAL(
144 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 6), // NOLINT(build/unsigned)
145 : 11); // NOLINT(build/unsigned)
146 1 : BOOST_REQUIRE_EQUAL(
147 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 7), // NOLINT(build/unsigned)
148 : 12); // NOLINT(build/unsigned)
149 1 : }
150 :
151 2 : BOOST_AUTO_TEST_CASE(Ptr_SerDes_MsgPack)
152 : {
153 : // Setup
154 1 : std::vector<ComponentRequest> components;
155 1 : components.emplace_back();
156 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
157 1 : components.back().component.id = 2;
158 1 : components.back().window_begin = 3;
159 1 : components.back().window_end = 4;
160 1 : components.emplace_back();
161 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
162 1 : components.back().component.id = 6;
163 1 : components.back().window_begin = 7;
164 1 : components.back().window_end = 8;
165 :
166 1 : TriggerRecordHeader record_header(components);
167 1 : record_header.set_trigger_number(1);
168 1 : record_header.set_trigger_timestamp(2);
169 1 : record_header.set_run_number(3);
170 1 : record_header.set_trigger_type(4);
171 1 : record_header.set_sequence_number(5);
172 1 : record_header.set_max_sequence_number(6);
173 :
174 1 : auto record = std::make_unique<TriggerRecord>(record_header);
175 :
176 1 : FragmentHeader header;
177 1 : header.size = sizeof(FragmentHeader) + 4;
178 1 : header.trigger_number = 1;
179 1 : header.trigger_timestamp = 2;
180 1 : header.run_number = 3;
181 :
182 1 : auto frag = malloc(sizeof(FragmentHeader) + 4);
183 1 : memcpy(frag, &header, sizeof(FragmentHeader));
184 :
185 1 : uint8_t one = 1, two = 2, three = 3, four = 4; // NOLINT(build/unsigned)
186 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader), &one, 1); // NOLINT(build/unsigned)
187 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 1, &two, 1); // NOLINT(build/unsigned)
188 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 2, &three, 1); // NOLINT(build/unsigned)
189 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 3, &four, 1); // NOLINT(build/unsigned)
190 :
191 1 : auto another_frag = malloc(sizeof(FragmentHeader) + 8);
192 1 : header.size = sizeof(FragmentHeader) + 8;
193 1 : memcpy(another_frag, &header, sizeof(FragmentHeader));
194 :
195 1 : uint8_t five = 5, six = 6, seven = 7, eight = 8; // NOLINT(build/unsigned)
196 1 : uint8_t nine = 9, ten = 10, eleven = 11, twelve = 12; // NOLINT(build/unsigned)
197 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader), &five, 1); // NOLINT(build/unsigned)
198 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 1, &six, 1); // NOLINT(build/unsigned)
199 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 2, &seven, 1); // NOLINT(build/unsigned)
200 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 3, &eight, 1); // NOLINT(build/unsigned)
201 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 4, &nine, 1); // NOLINT(build/unsigned)
202 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 5, &ten, 1); // NOLINT(build/unsigned)
203 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 6, &eleven, 1); // NOLINT(build/unsigned)
204 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 7, &twelve, 1); // NOLINT(build/unsigned)
205 :
206 1 : auto test_frag = std::make_unique<Fragment>(frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
207 1 : auto another_test_frag = std::make_unique<Fragment>(another_frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
208 :
209 1 : record->add_fragment(std::move(test_frag));
210 1 : record->add_fragment(std::move(another_test_frag));
211 :
212 : // SERIALIZE
213 1 : auto bytes = dunedaq::serialization::serialize(record, dunedaq::serialization::kMsgPack);
214 :
215 : // DESERIALIZE
216 1 : auto deserialized = dunedaq::serialization::deserialize<std::unique_ptr<TriggerRecord>>(bytes);
217 :
218 : // TEST
219 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().num_requested_components, 2);
220 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_number, 1);
221 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_timestamp, 2);
222 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().run_number, 3);
223 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_type, 4);
224 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().sequence_number, 5);
225 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().max_sequence_number, 6);
226 :
227 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().size(), 2);
228 :
229 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_trigger_number(), 1);
230 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_trigger_timestamp(), 2);
231 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_run_number(), 3);
232 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_trigger_number(), 1);
233 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_trigger_timestamp(), 2);
234 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_run_number(), 3);
235 :
236 1 : BOOST_REQUIRE_EQUAL(
237 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 0), // NOLINT(build/unsigned)
238 : 1); // NOLINT(build/unsigned)
239 1 : BOOST_REQUIRE_EQUAL(
240 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 1), // NOLINT(build/unsigned)
241 : 2); // NOLINT(build/unsigned)
242 1 : BOOST_REQUIRE_EQUAL(
243 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 2), // NOLINT(build/unsigned)
244 : 3); // NOLINT(build/unsigned)
245 1 : BOOST_REQUIRE_EQUAL(
246 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 3), // NOLINT(build/unsigned)
247 : 4); // NOLINT(build/unsigned)
248 :
249 1 : BOOST_REQUIRE_EQUAL(
250 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 0), // NOLINT(build/unsigned)
251 : 5); // NOLINT(build/unsigned)
252 1 : BOOST_REQUIRE_EQUAL(
253 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 1), // NOLINT(build/unsigned)
254 : 6); // NOLINT(build/unsigned)
255 1 : BOOST_REQUIRE_EQUAL(
256 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 2), // NOLINT(build/unsigned)
257 : 7); // NOLINT(build/unsigned)
258 1 : BOOST_REQUIRE_EQUAL(
259 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 3), // NOLINT(build/unsigned)
260 : 8); // NOLINT(build/unsigned)
261 1 : BOOST_REQUIRE_EQUAL(
262 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 4), // NOLINT(build/unsigned)
263 : 9); // NOLINT(build/unsigned)
264 1 : BOOST_REQUIRE_EQUAL(
265 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 5), // NOLINT(build/unsigned)
266 : 10); // NOLINT(build/unsigned
267 1 : BOOST_REQUIRE_EQUAL(
268 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 6), // NOLINT(build/unsigned)
269 : 11); // NOLINT(build/unsigned)
270 1 : BOOST_REQUIRE_EQUAL(
271 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 7), // NOLINT(build/unsigned)
272 : 12); // NOLINT(build/unsigned)
273 1 : }
274 :
275 2 : BOOST_AUTO_TEST_CASE(SerDes_Ptr_to_TriggerRecord)
276 : {
277 : // Setup
278 1 : std::vector<ComponentRequest> components;
279 1 : components.emplace_back();
280 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
281 1 : components.back().component.id = 2;
282 1 : components.back().window_begin = 3;
283 1 : components.back().window_end = 4;
284 1 : components.emplace_back();
285 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
286 1 : components.back().component.id = 6;
287 1 : components.back().window_begin = 7;
288 1 : components.back().window_end = 8;
289 :
290 1 : TriggerRecordHeader record_header(components);
291 1 : record_header.set_trigger_number(1);
292 1 : record_header.set_trigger_timestamp(2);
293 1 : record_header.set_run_number(3);
294 1 : record_header.set_trigger_type(4);
295 1 : record_header.set_sequence_number(5);
296 1 : record_header.set_max_sequence_number(6);
297 :
298 1 : auto record = std::make_unique<TriggerRecord>(record_header);
299 :
300 1 : FragmentHeader header;
301 1 : header.size = sizeof(FragmentHeader) + 4;
302 1 : header.trigger_number = 1;
303 1 : header.trigger_timestamp = 2;
304 1 : header.run_number = 3;
305 :
306 1 : auto frag = malloc(sizeof(FragmentHeader) + 4);
307 1 : memcpy(frag, &header, sizeof(FragmentHeader));
308 :
309 1 : uint8_t one = 1, two = 2, three = 3, four = 4; // NOLINT(build/unsigned)
310 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader), &one, 1); // NOLINT(build/unsigned)
311 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 1, &two, 1); // NOLINT(build/unsigned)
312 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 2, &three, 1); // NOLINT(build/unsigned)
313 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 3, &four, 1); // NOLINT(build/unsigned)
314 :
315 1 : auto another_frag = malloc(sizeof(FragmentHeader) + 8);
316 1 : header.size = sizeof(FragmentHeader) + 8;
317 1 : memcpy(another_frag, &header, sizeof(FragmentHeader));
318 :
319 1 : uint8_t five = 5, six = 6, seven = 7, eight = 8; // NOLINT(build/unsigned)
320 1 : uint8_t nine = 9, ten = 10, eleven = 11, twelve = 12; // NOLINT(build/unsigned)
321 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader), &five, 1); // NOLINT(build/unsigned)
322 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 1, &six, 1); // NOLINT(build/unsigned)
323 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 2, &seven, 1); // NOLINT(build/unsigned)
324 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 3, &eight, 1); // NOLINT(build/unsigned)
325 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 4, &nine, 1); // NOLINT(build/unsigned)
326 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 5, &ten, 1); // NOLINT(build/unsigned)
327 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 6, &eleven, 1); // NOLINT(build/unsigned)
328 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 7, &twelve, 1); // NOLINT(build/unsigned)
329 :
330 1 : auto test_frag = std::make_unique<Fragment>(frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
331 1 : auto another_test_frag = std::make_unique<Fragment>(another_frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
332 :
333 1 : record->add_fragment(std::move(test_frag));
334 1 : record->add_fragment(std::move(another_test_frag));
335 :
336 : // SERIALIZE
337 1 : auto bytes = dunedaq::serialization::serialize(record, dunedaq::serialization::kMsgPack);
338 :
339 : // DESERIALIZE
340 1 : TriggerRecord deserialized = dunedaq::serialization::deserialize<TriggerRecord>(bytes);
341 :
342 : // TEST
343 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().num_requested_components, 2);
344 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_number, 1);
345 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_timestamp, 2);
346 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().run_number, 3);
347 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().trigger_type, 4);
348 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().sequence_number, 5);
349 1 : BOOST_REQUIRE_EQUAL(deserialized.get_header_data().max_sequence_number, 6);
350 :
351 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().size(), 2);
352 :
353 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_trigger_number(), 1);
354 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_trigger_timestamp(), 2);
355 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(0)->get_run_number(), 3);
356 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_trigger_number(), 1);
357 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_trigger_timestamp(), 2);
358 1 : BOOST_REQUIRE_EQUAL(deserialized.get_fragments_ref().at(1)->get_run_number(), 3);
359 :
360 1 : BOOST_REQUIRE_EQUAL(
361 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 0), // NOLINT(build/unsigned)
362 : 1); // NOLINT(build/unsigned)
363 1 : BOOST_REQUIRE_EQUAL(
364 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 1), // NOLINT(build/unsigned)
365 : 2); // NOLINT(build/unsigned)
366 1 : BOOST_REQUIRE_EQUAL(
367 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 2), // NOLINT(build/unsigned)
368 : 3); // NOLINT(build/unsigned)
369 1 : BOOST_REQUIRE_EQUAL(
370 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(0)->get_data()) + 3), // NOLINT(build/unsigned)
371 : 4); // NOLINT(build/unsigned)
372 :
373 1 : BOOST_REQUIRE_EQUAL(
374 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 0), // NOLINT(build/unsigned)
375 : 5); // NOLINT(build/unsigned)
376 1 : BOOST_REQUIRE_EQUAL(
377 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 1), // NOLINT(build/unsigned)
378 : 6); // NOLINT(build/unsigned)
379 1 : BOOST_REQUIRE_EQUAL(
380 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 2), // NOLINT(build/unsigned)
381 : 7); // NOLINT(build/unsigned)
382 1 : BOOST_REQUIRE_EQUAL(
383 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 3), // NOLINT(build/unsigned)
384 : 8); // NOLINT(build/unsigned)
385 1 : BOOST_REQUIRE_EQUAL(
386 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 4), // NOLINT(build/unsigned)
387 : 9); // NOLINT(build/unsigned)
388 1 : BOOST_REQUIRE_EQUAL(
389 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 5), // NOLINT(build/unsigned)
390 : 10); // NOLINT(build/unsigned
391 1 : BOOST_REQUIRE_EQUAL(
392 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 6), // NOLINT(build/unsigned)
393 : 11); // NOLINT(build/unsigned)
394 1 : BOOST_REQUIRE_EQUAL(
395 : *(static_cast<uint8_t*>(deserialized.get_fragments_ref().at(1)->get_data()) + 7), // NOLINT(build/unsigned)
396 : 12); // NOLINT(build/unsigned)
397 1 : }
398 :
399 2 : BOOST_AUTO_TEST_CASE(SerDes_TriggerRecord_to_Ptr)
400 : {
401 : // Setup
402 1 : std::vector<ComponentRequest> components;
403 1 : components.emplace_back();
404 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
405 1 : components.back().component.id = 2;
406 1 : components.back().window_begin = 3;
407 1 : components.back().window_end = 4;
408 1 : components.emplace_back();
409 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
410 1 : components.back().component.id = 6;
411 1 : components.back().window_begin = 7;
412 1 : components.back().window_end = 8;
413 :
414 1 : TriggerRecordHeader record_header(components);
415 1 : record_header.set_trigger_number(1);
416 1 : record_header.set_trigger_timestamp(2);
417 1 : record_header.set_run_number(3);
418 1 : record_header.set_trigger_type(4);
419 1 : record_header.set_sequence_number(5);
420 1 : record_header.set_max_sequence_number(6);
421 :
422 1 : TriggerRecord record(record_header);
423 :
424 1 : FragmentHeader header;
425 1 : header.size = sizeof(FragmentHeader) + 4;
426 1 : header.trigger_number = 1;
427 1 : header.trigger_timestamp = 2;
428 1 : header.run_number = 3;
429 :
430 1 : auto frag = malloc(sizeof(FragmentHeader) + 4);
431 1 : memcpy(frag, &header, sizeof(FragmentHeader));
432 :
433 1 : uint8_t one = 1, two = 2, three = 3, four = 4; // NOLINT(build/unsigned)
434 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader), &one, 1); // NOLINT(build/unsigned)
435 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 1, &two, 1); // NOLINT(build/unsigned)
436 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 2, &three, 1); // NOLINT(build/unsigned)
437 1 : memcpy(static_cast<uint8_t*>(frag) + sizeof(FragmentHeader) + 3, &four, 1); // NOLINT(build/unsigned)
438 :
439 1 : auto another_frag = malloc(sizeof(FragmentHeader) + 8);
440 1 : header.size = sizeof(FragmentHeader) + 8;
441 1 : memcpy(another_frag, &header, sizeof(FragmentHeader));
442 :
443 1 : uint8_t five = 5, six = 6, seven = 7, eight = 8; // NOLINT(build/unsigned)
444 1 : uint8_t nine = 9, ten = 10, eleven = 11, twelve = 12; // NOLINT(build/unsigned)
445 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader), &five, 1); // NOLINT(build/unsigned)
446 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 1, &six, 1); // NOLINT(build/unsigned)
447 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 2, &seven, 1); // NOLINT(build/unsigned)
448 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 3, &eight, 1); // NOLINT(build/unsigned)
449 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 4, &nine, 1); // NOLINT(build/unsigned)
450 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 5, &ten, 1); // NOLINT(build/unsigned)
451 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 6, &eleven, 1); // NOLINT(build/unsigned)
452 1 : memcpy(static_cast<uint8_t*>(another_frag) + sizeof(FragmentHeader) + 7, &twelve, 1); // NOLINT(build/unsigned)
453 :
454 1 : auto test_frag = std::make_unique<Fragment>(frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
455 1 : auto another_test_frag = std::make_unique<Fragment>(another_frag, Fragment::BufferAdoptionMode::kTakeOverBuffer);
456 :
457 1 : record.add_fragment(std::move(test_frag));
458 1 : record.add_fragment(std::move(another_test_frag));
459 :
460 : // SERIALIZE
461 1 : auto bytes = dunedaq::serialization::serialize(record, dunedaq::serialization::kMsgPack);
462 :
463 : // DESERIALIZE
464 1 : auto deserialized = dunedaq::serialization::deserialize<std::unique_ptr<TriggerRecord>>(bytes);
465 :
466 : // TEST
467 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().num_requested_components, 2);
468 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_number, 1);
469 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_timestamp, 2);
470 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().run_number, 3);
471 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().trigger_type, 4);
472 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().sequence_number, 5);
473 1 : BOOST_REQUIRE_EQUAL(deserialized->get_header_data().max_sequence_number, 6);
474 :
475 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().size(), 2);
476 :
477 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_trigger_number(), 1);
478 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_trigger_timestamp(), 2);
479 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(0)->get_run_number(), 3);
480 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_trigger_number(), 1);
481 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_trigger_timestamp(), 2);
482 1 : BOOST_REQUIRE_EQUAL(deserialized->get_fragments_ref().at(1)->get_run_number(), 3);
483 :
484 1 : BOOST_REQUIRE_EQUAL(
485 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 0), // NOLINT(build/unsigned)
486 : 1); // NOLINT(build/unsigned)
487 1 : BOOST_REQUIRE_EQUAL(
488 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 1), // NOLINT(build/unsigned)
489 : 2); // NOLINT(build/unsigned)
490 1 : BOOST_REQUIRE_EQUAL(
491 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 2), // NOLINT(build/unsigned)
492 : 3); // NOLINT(build/unsigned)
493 1 : BOOST_REQUIRE_EQUAL(
494 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(0)->get_data()) + 3), // NOLINT(build/unsigned)
495 : 4); // NOLINT(build/unsigned)
496 :
497 1 : BOOST_REQUIRE_EQUAL(
498 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 0), // NOLINT(build/unsigned)
499 : 5); // NOLINT(build/unsigned)
500 1 : BOOST_REQUIRE_EQUAL(
501 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 1), // NOLINT(build/unsigned)
502 : 6); // NOLINT(build/unsigned)
503 1 : BOOST_REQUIRE_EQUAL(
504 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 2), // NOLINT(build/unsigned)
505 : 7); // NOLINT(build/unsigned)
506 1 : BOOST_REQUIRE_EQUAL(
507 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 3), // NOLINT(build/unsigned)
508 : 8); // NOLINT(build/unsigned)
509 1 : BOOST_REQUIRE_EQUAL(
510 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 4), // NOLINT(build/unsigned)
511 : 9); // NOLINT(build/unsigned)
512 1 : BOOST_REQUIRE_EQUAL(
513 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 5), // NOLINT(build/unsigned)
514 : 10); // NOLINT(build/unsigned
515 1 : BOOST_REQUIRE_EQUAL(
516 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 6), // NOLINT(build/unsigned)
517 : 11); // NOLINT(build/unsigned)
518 1 : BOOST_REQUIRE_EQUAL(
519 : *(static_cast<uint8_t*>(deserialized->get_fragments_ref().at(1)->get_data()) + 7), // NOLINT(build/unsigned)
520 : 12); // NOLINT(build/unsigned)
521 1 : }
522 :
523 : BOOST_AUTO_TEST_SUITE_END()
|