2 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
3 #include "artdaq-core/Data/Fragment.hh"
4 #include "artdaq-core/Core/SharedMemoryEventReceiver.hh"
6 #define BOOST_TEST_MODULE SharedMemoryEventManager_t
7 #include "cetlib/quiet_unit_test.hpp"
8 #include "cetlib_except/exception.h"
11 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
13 BOOST_AUTO_TEST_CASE(Construct)
15 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test Construct BEGIN" << TLOG_ENDL;
16 fhicl::ParameterSet pset;
17 pset.put(
"use_art",
false);
18 pset.put(
"buffer_count", 2);
19 pset.put(
"max_event_size_bytes", 1000);
20 pset.put(
"expected_fragments_per_event", 2);
23 BOOST_REQUIRE_EQUAL(t.runID(), 0);
24 BOOST_REQUIRE_EQUAL(t.subrunID(), 0);
25 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
26 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test Construct END" << TLOG_ENDL;
29 BOOST_AUTO_TEST_CASE(AddFragment)
31 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test AddFragment BEGIN" << TLOG_ENDL;
33 fhicl::ParameterSet pset;
34 pset.put(
"use_art",
false);
35 pset.put(
"buffer_count", 2);
36 pset.put(
"max_event_size_bytes", 1000);
37 pset.put(
"expected_fragments_per_event", 2);
40 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
42 for (
auto ii = 0; ii < 4; ++ii)
44 *(frag->dataBegin() + ii) = ii;
47 bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag);
48 BOOST_REQUIRE_EQUAL(sts,
true);
49 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
50 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
51 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test AddFragment END" << TLOG_ENDL;
54 BOOST_AUTO_TEST_CASE(DataFlow)
56 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test DataFlow BEGIN" << TLOG_ENDL;
57 fhicl::ParameterSet pset;
58 pset.put(
"use_art",
false);
59 pset.put(
"buffer_count", 2);
60 pset.put(
"max_event_size_bytes", 1000);
61 pset.put(
"expected_fragments_per_event", 3);
64 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
66 for (
auto ii = 0; ii < 4; ++ii)
68 *(frag->dataBegin() + ii) = ii;
71 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
72 auto fragLoc = t.WriteFragmentHeader(hdr);
73 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
74 t.DoneWritingFragment(hdr);
75 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
76 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
78 frag->setFragmentID(1);
79 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
80 auto fragLoc2 = t.WriteFragmentHeader(hdr);
81 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
82 t.DoneWritingFragment(hdr);
83 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
84 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2);
85 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
87 frag->setFragmentID(2);
88 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
89 auto fragLoc3 = t.WriteFragmentHeader(hdr);
90 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
91 t.DoneWritingFragment(hdr);
92 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
93 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
94 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
96 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test DataFlow END" << TLOG_ENDL;
468 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
470 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test ConsumeDroppedData_Active BEGIN" << TLOG_ENDL;
471 fhicl::ParameterSet pset;
472 pset.put(
"use_art",
false);
473 pset.put(
"buffer_count", 20);
474 pset.put(
"max_event_size_bytes", 1000);
475 pset.put(
"expected_fragments_per_event", 2);
476 pset.put(
"stale_buffer_timeout_usec", 100000);
478 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
480 for (
auto ii = 0; ii < 4; ++ii)
482 *(frag->dataBegin() + ii) = ii;
488 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
489 auto fragLoc = t.WriteFragmentHeader(hdr);
490 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
491 t.DoneWritingFragment(hdr);
492 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
494 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
495 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
498 frag->setSequenceID(2);
499 frag->setFragmentID(0);
501 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
502 auto fragLoc = t.WriteFragmentHeader(hdr);
503 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
504 t.DoneWritingFragment(hdr);
505 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
507 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
508 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
510 frag->setFragmentID(1);
511 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
512 auto fragLoc2 = t.WriteFragmentHeader(hdr);
513 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
514 t.DoneWritingFragment(hdr);
515 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
516 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
518 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
519 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
520 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
524 frag->setSequenceID(3);
525 frag->setFragmentID(0);
527 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
528 auto fragLoc = t.WriteFragmentHeader(hdr);
529 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
530 t.DoneWritingFragment(hdr);
531 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
533 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
534 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
536 frag->setFragmentID(1);
537 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
538 auto fragLoc2 = t.WriteFragmentHeader(hdr);
539 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
540 t.DoneWritingFragment(hdr);
541 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
543 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
544 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
550 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
551 frag->setSequenceID(4);
552 frag->setFragmentID(1);
553 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
554 auto fragLoc = t.WriteFragmentHeader(hdr);
555 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
556 t.DoneWritingFragment(hdr);
557 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
559 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
560 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
562 frag->setFragmentID(1);
563 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
564 auto fragLoc2 = t.WriteFragmentHeader(hdr);
565 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
566 t.DoneWritingFragment(hdr);
567 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
568 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
569 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
572 frag->setSequenceID(1);
573 frag->setFragmentID(1);
574 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
575 auto fragLoc2 = t.WriteFragmentHeader(hdr);
576 #if !ART_SUPPORTS_DUPLICATE_EVENTS
577 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress());
579 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
580 t.DoneWritingFragment(hdr);
581 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
583 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
584 #if ART_SUPPORTS_DUPLICATE_EVENTS
585 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
587 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
591 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test ConsumeDroppedData_Active END" << TLOG_ENDL;
705 BOOST_AUTO_TEST_CASE(RunNumbers)
707 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test RunNumbers BEGIN" << TLOG_ENDL;
708 fhicl::ParameterSet pset;
709 pset.put(
"use_art",
false);
710 pset.put(
"buffer_count", 2);
711 pset.put(
"max_event_size_bytes", 1000);
712 pset.put(
"expected_fragments_per_event", 2);
716 BOOST_REQUIRE_EQUAL(t.runID(), 1);
717 BOOST_REQUIRE_EQUAL(t.subrunID(), 1);
719 BOOST_REQUIRE_EQUAL(t.runID(), 1);
720 BOOST_REQUIRE_EQUAL(t.subrunID(), 2);
722 BOOST_REQUIRE_EQUAL(t.runID(), 1);
723 BOOST_REQUIRE_EQUAL(t.subrunID(), 3);
725 BOOST_REQUIRE_EQUAL(t.runID(), 3);
726 BOOST_REQUIRE_EQUAL(t.subrunID(), 1);
729 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
731 bool errflag =
false;
732 bool sts = r.ReadyForRead();
733 BOOST_REQUIRE_EQUAL(sts,
true);
734 auto hdr = r.ReadHeader(errflag);
735 BOOST_REQUIRE_EQUAL(errflag,
false);
736 BOOST_REQUIRE(hdr !=
nullptr);
737 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
738 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
739 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
740 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfSubrunFragmentType);
741 BOOST_REQUIRE_EQUAL(errflag,
false);
742 BOOST_REQUIRE_EQUAL(frags->size(), 1);
746 sts = r.ReadyForRead();
747 BOOST_REQUIRE_EQUAL(sts,
true);
748 hdr = r.ReadHeader(errflag);
749 BOOST_REQUIRE_EQUAL(errflag,
false);
750 BOOST_REQUIRE(hdr !=
nullptr);
751 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
752 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
753 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
754 frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
755 BOOST_REQUIRE_EQUAL(errflag,
false);
756 BOOST_REQUIRE_EQUAL(frags->size(), 1);
759 TLOG_INFO(
"SharedMemoryEventManager_t") <<
"Test RunNumbers END" << TLOG_ENDL;
762 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...