1 #define TRACE_NAME "SharedMemoryEventManager_t"
3 #include "artdaq-core/Core/SharedMemoryEventReceiver.hh"
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
7 #define BOOST_TEST_MODULE SharedMemoryEventManager_t
8 #include "cetlib/quiet_unit_test.hpp"
9 #include "cetlib_except/exception.h"
13 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
15 artdaq::detail::RawFragmentHeader GetHeader(artdaq::FragmentPtr const& frag)
17 return *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
20 BOOST_AUTO_TEST_CASE(Construct)
22 TLOG(TLVL_INFO) <<
"Test Construct BEGIN";
23 fhicl::ParameterSet pset;
24 pset.put(
"use_art",
false);
25 pset.put(
"buffer_count", 2);
26 pset.put(
"max_event_size_bytes", 1000);
27 pset.put(
"expected_fragments_per_event", 2);
30 BOOST_REQUIRE_EQUAL(t.runID(), 0);
31 BOOST_REQUIRE_EQUAL(t.GetSubrunForSequenceID(1), 1);
32 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
34 BOOST_REQUIRE_EQUAL(t.runID(), 1);
35 TLOG(TLVL_INFO) <<
"Test Construct END";
38 BOOST_AUTO_TEST_CASE(AddFragment)
40 TLOG(TLVL_INFO) <<
"Test AddFragment BEGIN";
42 fhicl::ParameterSet pset;
43 pset.put(
"use_art",
false);
44 pset.put(
"buffer_count", 2);
45 pset.put(
"max_event_size_bytes", 1000);
46 pset.put(
"expected_fragments_per_event", 2);
50 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
52 for (
auto ii = 0; ii < 4; ++ii)
54 *(frag->dataBegin() + ii) = ii;
57 bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag);
58 BOOST_REQUIRE_EQUAL(sts,
true);
59 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
60 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
61 TLOG(TLVL_INFO) <<
"Test AddFragment END";
64 BOOST_AUTO_TEST_CASE(DataFlow)
66 TLOG(TLVL_INFO) <<
"Test DataFlow BEGIN";
67 fhicl::ParameterSet pset;
68 pset.put(
"use_art",
false);
69 pset.put(
"buffer_count", 2);
70 pset.put(
"max_event_size_bytes", 1000);
71 pset.put(
"expected_fragments_per_event", 3);
75 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
77 for (
auto ii = 0; ii < 4; ++ii)
79 *(frag->dataBegin() + ii) = ii;
82 auto hdr = GetHeader(frag);
83 auto fragLoc = t.WriteFragmentHeader(hdr);
84 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
85 t.DoneWritingFragment(hdr);
86 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
87 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
89 frag->setFragmentID(1);
90 hdr = GetHeader(frag);
91 auto fragLoc2 = t.WriteFragmentHeader(hdr);
92 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
93 t.DoneWritingFragment(hdr);
94 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
95 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2);
96 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
98 frag->setFragmentID(2);
99 hdr = GetHeader(frag);
100 auto fragLoc3 = t.WriteFragmentHeader(hdr);
101 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
102 t.DoneWritingFragment(hdr);
103 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
104 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
105 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
107 TLOG(TLVL_INFO) <<
"Test DataFlow END";
110 BOOST_AUTO_TEST_CASE(EndOfData)
112 TLOG(TLVL_INFO) <<
"Test EndOfData BEGIN";
113 fhicl::ParameterSet pset;
114 pset.put(
"use_art",
false);
115 pset.put(
"buffer_count", 2);
116 pset.put(
"max_event_size_bytes", 1000);
117 pset.put(
"expected_fragments_per_event", 1);
121 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
123 for (
auto ii = 0; ii < 4; ++ii)
125 *(frag->dataBegin() + ii) = ii;
128 auto hdr = GetHeader(frag);
129 auto fragLoc = t.WriteFragmentHeader(hdr);
130 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
131 t.DoneWritingFragment(hdr);
132 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
133 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
139 frag->setSequenceID(1);
140 hdr = GetHeader(frag);
141 auto fragLoc3 = t.WriteFragmentHeader(hdr);
143 std::atomic<bool> endComplete =
false;
145 [&] { endComplete = t.endOfData(); }};
147 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
149 BOOST_REQUIRE_EQUAL(endComplete.load(),
false);
150 t.DoneWritingFragment(hdr);
152 BOOST_REQUIRE_EQUAL(endComplete.load(),
true);
153 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
154 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
156 frag->setSequenceID(2);
157 hdr = GetHeader(frag);
158 auto fragLoc2 = t.WriteFragmentHeader(hdr);
159 BOOST_REQUIRE_EQUAL(fragLoc2,
nullptr);
161 TLOG(TLVL_INFO) <<
"Test EndOfData END";
164 BOOST_AUTO_TEST_CASE(TooManyFragments_InterleavedWrites)
166 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites BEGIN";
167 fhicl::ParameterSet pset;
168 pset.put(
"use_art",
false);
169 pset.put(
"buffer_count", 2);
170 pset.put(
"max_event_size_bytes", 1000);
171 pset.put(
"expected_fragments_per_event", 3);
172 pset.put(
"stale_buffer_timeout_usec", 100000);
176 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
178 for (
auto ii = 0; ii < 4; ++ii)
180 *(frag->dataBegin() + ii) = ii;
183 auto hdr = GetHeader(frag);
184 auto fragLoc = t.WriteFragmentHeader(hdr);
185 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
186 t.DoneWritingFragment(hdr);
187 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
188 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
190 frag->setFragmentID(1);
191 hdr = GetHeader(frag);
192 auto fragLoc2 = t.WriteFragmentHeader(hdr);
193 frag->setFragmentID(2);
194 hdr = GetHeader(frag);
195 auto fragLoc3 = t.WriteFragmentHeader(hdr);
196 frag->setFragmentID(3);
197 hdr = GetHeader(frag);
198 auto fragLoc4 = t.WriteFragmentHeader(hdr);
199 frag->setFragmentID(4);
200 hdr = GetHeader(frag);
201 auto fragLoc5 = t.WriteFragmentHeader(hdr);
203 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
204 t.DoneWritingFragment(hdr);
205 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
206 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
208 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
209 t.DoneWritingFragment(hdr);
210 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
211 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
212 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
214 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
215 t.DoneWritingFragment(hdr);
216 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
217 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
219 memcpy(fragLoc5, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
220 t.DoneWritingFragment(hdr);
221 BOOST_REQUIRE_EQUAL(fragLoc4 + frag->size(), fragLoc5);
222 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
223 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
227 frag->setSequenceID(2);
228 frag->setFragmentID(0);
230 auto hdr = GetHeader(frag);
231 auto fragLoc = t.WriteFragmentHeader(hdr);
232 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
233 t.DoneWritingFragment(hdr);
234 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
235 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
236 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
238 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites END";
241 BOOST_AUTO_TEST_CASE(TooManyFragments_DiscreteWrites)
243 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites BEGIN";
244 fhicl::ParameterSet pset;
245 pset.put(
"use_art",
false);
246 pset.put(
"buffer_count", 2);
247 pset.put(
"max_event_size_bytes", 1000);
248 pset.put(
"expected_fragments_per_event", 3);
249 pset.put(
"stale_buffer_timeout_usec", 100000);
253 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
255 for (
auto ii = 0; ii < 4; ++ii)
257 *(frag->dataBegin() + ii) = ii;
260 auto hdr = GetHeader(frag);
261 auto fragLoc = t.WriteFragmentHeader(hdr);
262 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
263 t.DoneWritingFragment(hdr);
264 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
265 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
267 frag->setFragmentID(1);
268 hdr = GetHeader(frag);
269 auto fragLoc2 = t.WriteFragmentHeader(hdr);
271 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
272 t.DoneWritingFragment(hdr);
273 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
274 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
276 frag->setFragmentID(2);
277 hdr = GetHeader(frag);
278 auto fragLoc3 = t.WriteFragmentHeader(hdr);
279 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
280 t.DoneWritingFragment(hdr);
281 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
282 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
283 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
285 frag->setFragmentID(3);
286 hdr = GetHeader(frag);
287 auto fragLoc4 = t.WriteFragmentHeader(hdr);
288 #if !ART_SUPPORTS_DUPLICATE_EVENTS
289 BOOST_REQUIRE_EQUAL(fragLoc4, t.GetDroppedDataAddress(hdr));
291 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
292 t.DoneWritingFragment(hdr);
293 #if ART_SUPPORTS_DUPLICATE_EVENTS
294 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
295 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
297 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
298 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
303 frag->setSequenceID(2);
304 frag->setFragmentID(0);
306 auto hdr = GetHeader(frag);
307 auto fragLoc = t.WriteFragmentHeader(hdr);
308 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
309 t.DoneWritingFragment(hdr);
310 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
312 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
313 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
315 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites END";
319 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
321 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active BEGIN";
322 fhicl::ParameterSet pset;
323 pset.put(
"use_art",
false);
324 pset.put(
"buffer_count", 20);
325 pset.put(
"max_event_size_bytes", 1000);
326 pset.put(
"expected_fragments_per_event", 2);
327 pset.put(
"stale_buffer_timeout_usec", 100000);
329 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
331 for (
auto ii = 0; ii < 4; ++ii)
333 *(frag->dataBegin() + ii) = ii;
339 auto hdr = GetHeader(frag);
340 auto fragLoc = t.WriteFragmentHeader(hdr);
341 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
342 t.DoneWritingFragment(hdr);
343 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
345 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
346 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
349 frag->setSequenceID(2);
350 frag->setFragmentID(0);
352 auto hdr = GetHeader(frag);
353 auto fragLoc = t.WriteFragmentHeader(hdr);
354 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
355 t.DoneWritingFragment(hdr);
356 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 2);
358 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
359 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
361 frag->setFragmentID(1);
362 hdr = GetHeader(frag);
363 auto fragLoc2 = t.WriteFragmentHeader(hdr);
364 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
365 t.DoneWritingFragment(hdr);
366 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
367 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
370 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
371 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
374 frag->setSequenceID(3);
375 frag->setFragmentID(0);
377 auto hdr = GetHeader(frag);
378 auto fragLoc = t.WriteFragmentHeader(hdr);
379 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
380 t.DoneWritingFragment(hdr);
381 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 2);
383 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
384 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
386 frag->setFragmentID(1);
387 hdr = GetHeader(frag);
388 auto fragLoc2 = t.WriteFragmentHeader(hdr);
389 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
390 t.DoneWritingFragment(hdr);
391 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
393 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
394 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
400 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
401 frag->setSequenceID(4);
402 frag->setFragmentID(1);
403 auto hdr = GetHeader(frag);
404 auto fragLoc = t.WriteFragmentHeader(hdr);
405 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
406 t.DoneWritingFragment(hdr);
407 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
409 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
410 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount() + t.GetArtEventCount(), 3);
412 frag->setFragmentID(1);
413 hdr = GetHeader(frag);
414 auto fragLoc2 = t.WriteFragmentHeader(hdr);
415 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
416 t.DoneWritingFragment(hdr);
417 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
418 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount() + t.GetArtEventCount(), 4);
421 frag->setSequenceID(1);
422 frag->setFragmentID(1);
423 auto hdr = GetHeader(frag);
424 auto fragLoc2 = t.WriteFragmentHeader(hdr);
425 #if !ART_SUPPORTS_DUPLICATE_EVENTS
426 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(hdr));
428 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
429 t.DoneWritingFragment(hdr);
430 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
432 BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
433 #if ART_SUPPORTS_DUPLICATE_EVENTS
434 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
436 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
440 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active END";
443 BOOST_AUTO_TEST_CASE(RunNumbers)
445 TLOG(TLVL_INFO) <<
"Test RunNumbers BEGIN";
446 fhicl::ParameterSet pset;
447 pset.put(
"use_art",
false);
448 pset.put(
"buffer_count", 2);
449 pset.put(
"max_event_size_bytes", 1000);
450 pset.put(
"expected_fragments_per_event", 2);
454 BOOST_REQUIRE_EQUAL(t.runID(), 1);
455 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
457 BOOST_REQUIRE_EQUAL(t.runID(), 1);
458 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
460 BOOST_REQUIRE_EQUAL(t.runID(), 1);
461 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
464 t.rolloverSubrun(3, 4);
465 t.rolloverSubrun(4, 4);
466 t.rolloverSubrun(5, 4);
469 BOOST_REQUIRE_EQUAL(t.runID(), 3);
470 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
472 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
473 bool errflag =
false;
476 bool sts = r.ReadyForRead();
477 BOOST_REQUIRE_EQUAL(sts,
true);
478 auto hdr = r.ReadHeader(errflag);
479 BOOST_REQUIRE_EQUAL(errflag,
false);
480 BOOST_REQUIRE(hdr !=
nullptr);
483 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
484 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
485 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
487 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
488 BOOST_REQUIRE_EQUAL(errflag,
false);
489 BOOST_REQUIRE_EQUAL(frags->size(), 1);
492 TLOG(TLVL_INFO) <<
"Test RunNumbers END";
495 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...