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"
11 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
13 BOOST_AUTO_TEST_CASE(Construct)
15 TLOG(TLVL_INFO) <<
"Test Construct BEGIN";
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.GetSubrunForSequenceID(1), 1);
25 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
26 TLOG(TLVL_INFO) <<
"Test Construct END";
29 BOOST_AUTO_TEST_CASE(AddFragment)
31 TLOG(TLVL_INFO) <<
"Test AddFragment BEGIN";
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(TLVL_INFO) <<
"Test AddFragment END";
54 BOOST_AUTO_TEST_CASE(DataFlow)
56 TLOG(TLVL_INFO) <<
"Test DataFlow BEGIN";
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(TLVL_INFO) <<
"Test DataFlow END";
99 BOOST_AUTO_TEST_CASE(TooManyFragments_InterleavedWrites)
101 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites BEGIN";
102 fhicl::ParameterSet pset;
103 pset.put(
"use_art",
false);
104 pset.put(
"buffer_count", 2);
105 pset.put(
"max_event_size_bytes", 1000);
106 pset.put(
"expected_fragments_per_event", 3);
107 pset.put(
"stale_buffer_timeout_usec", 100000);
110 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
112 for (
auto ii = 0; ii < 4; ++ii)
114 *(frag->dataBegin() + ii) = ii;
117 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
118 auto fragLoc = t.WriteFragmentHeader(hdr);
119 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
120 t.DoneWritingFragment(hdr);
121 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
122 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
124 frag->setFragmentID(1);
125 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
126 auto fragLoc2 = t.WriteFragmentHeader(hdr);
127 frag->setFragmentID(2);
128 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
129 auto fragLoc3 = t.WriteFragmentHeader(hdr);
130 frag->setFragmentID(3);
131 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
132 auto fragLoc4 = t.WriteFragmentHeader(hdr);
133 frag->setFragmentID(4);
134 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
135 auto fragLoc5 = t.WriteFragmentHeader(hdr);
137 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
138 t.DoneWritingFragment(hdr);
139 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
140 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
142 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
143 t.DoneWritingFragment(hdr);
144 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
145 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
146 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
148 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
149 t.DoneWritingFragment(hdr);
150 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
151 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
153 memcpy(fragLoc5, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
154 t.DoneWritingFragment(hdr);
155 BOOST_REQUIRE_EQUAL(fragLoc4 + frag->size(), fragLoc5);
156 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
157 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
161 frag->setSequenceID(2);
162 frag->setFragmentID(0);
164 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
165 auto fragLoc = t.WriteFragmentHeader(hdr);
166 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
167 t.DoneWritingFragment(hdr);
168 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
169 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
170 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
172 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites END";
175 BOOST_AUTO_TEST_CASE(TooManyFragments_DiscreteWrites)
177 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites BEGIN";
178 fhicl::ParameterSet pset;
179 pset.put(
"use_art",
false);
180 pset.put(
"buffer_count", 2);
181 pset.put(
"max_event_size_bytes", 1000);
182 pset.put(
"expected_fragments_per_event", 3);
183 pset.put(
"stale_buffer_timeout_usec", 100000);
186 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
188 for (
auto ii = 0; ii < 4; ++ii)
190 *(frag->dataBegin() + ii) = ii;
193 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
194 auto fragLoc = t.WriteFragmentHeader(hdr);
195 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
196 t.DoneWritingFragment(hdr);
197 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
198 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
200 frag->setFragmentID(1);
201 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
202 auto fragLoc2 = t.WriteFragmentHeader(hdr);
204 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
205 t.DoneWritingFragment(hdr);
206 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
207 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
209 frag->setFragmentID(2);
210 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
211 auto fragLoc3 = t.WriteFragmentHeader(hdr);
212 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
213 t.DoneWritingFragment(hdr);
214 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
215 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
216 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
218 frag->setFragmentID(3);
219 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
220 auto fragLoc4 = t.WriteFragmentHeader(hdr);
221 #if !ART_SUPPORTS_DUPLICATE_EVENTS
222 BOOST_REQUIRE_EQUAL(fragLoc4, t.GetDroppedDataAddress(3));
224 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
225 t.DoneWritingFragment(hdr);
226 #if ART_SUPPORTS_DUPLICATE_EVENTS
227 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
228 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
230 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
231 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
236 frag->setSequenceID(2);
237 frag->setFragmentID(0);
239 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
240 auto fragLoc = t.WriteFragmentHeader(hdr);
241 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
242 t.DoneWritingFragment(hdr);
243 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
245 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
246 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
248 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites END";
620 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
622 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active BEGIN";
623 fhicl::ParameterSet pset;
624 pset.put(
"use_art",
false);
625 pset.put(
"buffer_count", 20);
626 pset.put(
"max_event_size_bytes", 1000);
627 pset.put(
"expected_fragments_per_event", 2);
628 pset.put(
"stale_buffer_timeout_usec", 100000);
630 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
632 for (
auto ii = 0; ii < 4; ++ii)
634 *(frag->dataBegin() + ii) = ii;
639 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
640 auto fragLoc = t.WriteFragmentHeader(hdr);
641 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
642 t.DoneWritingFragment(hdr);
643 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
645 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
646 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
649 frag->setSequenceID(2);
650 frag->setFragmentID(0);
652 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
653 auto fragLoc = t.WriteFragmentHeader(hdr);
654 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
655 t.DoneWritingFragment(hdr);
656 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
658 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
659 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
661 frag->setFragmentID(1);
662 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
663 auto fragLoc2 = t.WriteFragmentHeader(hdr);
664 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
665 t.DoneWritingFragment(hdr);
666 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
667 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
670 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
671 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
674 frag->setSequenceID(3);
675 frag->setFragmentID(0);
677 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
678 auto fragLoc = t.WriteFragmentHeader(hdr);
679 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
680 t.DoneWritingFragment(hdr);
681 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
683 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
684 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
686 frag->setFragmentID(1);
687 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
688 auto fragLoc2 = t.WriteFragmentHeader(hdr);
689 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
690 t.DoneWritingFragment(hdr);
691 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
693 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
694 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
700 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
701 frag->setSequenceID(4);
702 frag->setFragmentID(1);
703 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
704 auto fragLoc = t.WriteFragmentHeader(hdr);
705 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
706 t.DoneWritingFragment(hdr);
707 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
709 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
710 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
712 frag->setFragmentID(1);
713 hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
714 auto fragLoc2 = t.WriteFragmentHeader(hdr);
715 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
716 t.DoneWritingFragment(hdr);
717 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
718 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
719 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
722 frag->setSequenceID(1);
723 frag->setFragmentID(1);
724 auto hdr = *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
725 auto fragLoc2 = t.WriteFragmentHeader(hdr);
726 #if !ART_SUPPORTS_DUPLICATE_EVENTS
727 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1));
729 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
730 t.DoneWritingFragment(hdr);
731 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
733 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
734 #if ART_SUPPORTS_DUPLICATE_EVENTS
735 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
737 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
741 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active END";
855 BOOST_AUTO_TEST_CASE(RunNumbers)
857 TLOG(TLVL_INFO) <<
"Test RunNumbers BEGIN";
858 fhicl::ParameterSet pset;
859 pset.put(
"use_art",
false);
860 pset.put(
"buffer_count", 2);
861 pset.put(
"max_event_size_bytes", 1000);
862 pset.put(
"expected_fragments_per_event", 2);
866 BOOST_REQUIRE_EQUAL(t.runID(), 1);
867 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
869 BOOST_REQUIRE_EQUAL(t.runID(), 1);
870 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
872 BOOST_REQUIRE_EQUAL(t.runID(), 1);
873 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
875 BOOST_REQUIRE_EQUAL(t.runID(), 3);
876 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
878 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
879 bool errflag =
false;
882 bool sts = r.ReadyForRead();
883 BOOST_REQUIRE_EQUAL(sts,
true);
884 auto hdr = r.ReadHeader(errflag);
885 BOOST_REQUIRE_EQUAL(errflag,
false);
886 BOOST_REQUIRE(hdr !=
nullptr);
889 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
890 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
891 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
893 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
894 BOOST_REQUIRE_EQUAL(errflag,
false);
895 BOOST_REQUIRE_EQUAL(frags->size(), 1);
898 TLOG(TLVL_INFO) <<
"Test RunNumbers END";
901 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...