1 #define TRACE_NAME "SharedMemoryEventManager_t"
3 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "artdaq-core/Core/SharedMemoryEventReceiver.hh"
7 #define BOOST_TEST_MODULE SharedMemoryEventManager_t
8 #include "cetlib/quiet_unit_test.hpp"
9 #include "cetlib_except/exception.h"
12 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
14 BOOST_AUTO_TEST_CASE(Construct)
16 TLOG(TLVL_INFO) <<
"Test Construct BEGIN" ;
17 fhicl::ParameterSet pset;
18 pset.put(
"use_art",
false);
19 pset.put(
"buffer_count", 2);
20 pset.put(
"max_event_size_bytes", 1000);
21 pset.put(
"expected_fragments_per_event", 2);
24 BOOST_REQUIRE_EQUAL(t.runID(), 0);
25 BOOST_REQUIRE_EQUAL(t.GetSubrunForSequenceID(1), 1);
26 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
27 TLOG(TLVL_INFO) <<
"Test Construct END" ;
30 BOOST_AUTO_TEST_CASE(AddFragment)
32 TLOG(TLVL_INFO) <<
"Test AddFragment BEGIN" ;
34 fhicl::ParameterSet pset;
35 pset.put(
"use_art",
false);
36 pset.put(
"buffer_count", 2);
37 pset.put(
"max_event_size_bytes", 1000);
38 pset.put(
"expected_fragments_per_event", 2);
41 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
43 for (
auto ii = 0; ii < 4; ++ii)
45 *(frag->dataBegin() + ii) = ii;
48 bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag);
49 BOOST_REQUIRE_EQUAL(sts,
true);
50 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
51 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
52 TLOG(TLVL_INFO) <<
"Test AddFragment END" ;
55 BOOST_AUTO_TEST_CASE(DataFlow)
57 TLOG(TLVL_INFO) <<
"Test DataFlow BEGIN" ;
58 fhicl::ParameterSet pset;
59 pset.put(
"use_art",
false);
60 pset.put(
"buffer_count", 2);
61 pset.put(
"max_event_size_bytes", 1000);
62 pset.put(
"expected_fragments_per_event", 3);
65 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
67 for (
auto ii = 0; ii < 4; ++ii)
69 *(frag->dataBegin() + ii) = ii;
72 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
73 auto fragLoc = t.WriteFragmentHeader(hdr);
74 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
75 t.DoneWritingFragment(hdr);
76 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
77 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
79 frag->setFragmentID(1);
80 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
81 auto fragLoc2 = t.WriteFragmentHeader(hdr);
82 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
83 t.DoneWritingFragment(hdr);
84 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
85 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2);
86 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
88 frag->setFragmentID(2);
89 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
90 auto fragLoc3 = t.WriteFragmentHeader(hdr);
91 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
92 t.DoneWritingFragment(hdr);
93 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
94 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
95 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
97 TLOG(TLVL_INFO) <<
"Test DataFlow END" ;
469 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
471 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active BEGIN" ;
472 fhicl::ParameterSet pset;
473 pset.put(
"use_art",
false);
474 pset.put(
"buffer_count", 20);
475 pset.put(
"max_event_size_bytes", 1000);
476 pset.put(
"expected_fragments_per_event", 2);
477 pset.put(
"stale_buffer_timeout_usec", 100000);
479 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
481 for (
auto ii = 0; ii < 4; ++ii)
483 *(frag->dataBegin() + ii) = ii;
489 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
490 auto fragLoc = t.WriteFragmentHeader(hdr);
491 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
492 t.DoneWritingFragment(hdr);
493 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
495 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
496 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
499 frag->setSequenceID(2);
500 frag->setFragmentID(0);
502 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
503 auto fragLoc = t.WriteFragmentHeader(hdr);
504 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
505 t.DoneWritingFragment(hdr);
506 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
508 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
509 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
511 frag->setFragmentID(1);
512 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
513 auto fragLoc2 = t.WriteFragmentHeader(hdr);
514 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
515 t.DoneWritingFragment(hdr);
516 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
517 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
520 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
521 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
525 frag->setSequenceID(3);
526 frag->setFragmentID(0);
528 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
529 auto fragLoc = t.WriteFragmentHeader(hdr);
530 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
531 t.DoneWritingFragment(hdr);
532 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
534 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
535 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
537 frag->setFragmentID(1);
538 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
539 auto fragLoc2 = t.WriteFragmentHeader(hdr);
540 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
541 t.DoneWritingFragment(hdr);
542 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
544 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
545 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
551 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
552 frag->setSequenceID(4);
553 frag->setFragmentID(1);
554 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
555 auto fragLoc = t.WriteFragmentHeader(hdr);
556 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
557 t.DoneWritingFragment(hdr);
558 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
560 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
561 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
563 frag->setFragmentID(1);
564 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
565 auto fragLoc2 = t.WriteFragmentHeader(hdr);
566 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
567 t.DoneWritingFragment(hdr);
568 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
569 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
570 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
573 frag->setSequenceID(1);
574 frag->setFragmentID(1);
575 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
576 auto fragLoc2 = t.WriteFragmentHeader(hdr);
577 #if !ART_SUPPORTS_DUPLICATE_EVENTS
578 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1));
580 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
581 t.DoneWritingFragment(hdr);
582 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
584 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
585 #if ART_SUPPORTS_DUPLICATE_EVENTS
586 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
588 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
592 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active END" ;
706 BOOST_AUTO_TEST_CASE(RunNumbers)
708 TLOG(TLVL_INFO) <<
"Test RunNumbers BEGIN" ;
709 fhicl::ParameterSet pset;
710 pset.put(
"use_art",
false);
711 pset.put(
"buffer_count", 2);
712 pset.put(
"max_event_size_bytes", 1000);
713 pset.put(
"expected_fragments_per_event", 2);
717 BOOST_REQUIRE_EQUAL(t.runID(), 1);
718 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
720 BOOST_REQUIRE_EQUAL(t.runID(), 1);
721 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
723 BOOST_REQUIRE_EQUAL(t.runID(), 1);
724 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
726 BOOST_REQUIRE_EQUAL(t.runID(), 3);
727 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
730 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
731 bool errflag =
false;
734 bool sts = r.ReadyForRead();
735 BOOST_REQUIRE_EQUAL(sts,
true);
736 auto hdr = r.ReadHeader(errflag);
737 BOOST_REQUIRE_EQUAL(errflag,
false);
738 BOOST_REQUIRE(hdr !=
nullptr);
739 if (hdr !=
nullptr) {
740 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
741 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
742 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
744 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
745 BOOST_REQUIRE_EQUAL(errflag,
false);
746 BOOST_REQUIRE_EQUAL(frags->size(), 1);
749 TLOG(TLVL_INFO) <<
"Test RunNumbers END" ;
752 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...