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 artdaq::detail::RawFragmentHeader GetHeader(artdaq::FragmentPtr const& frag)
15 return *
reinterpret_cast<artdaq::detail::RawFragmentHeader*
>(frag->headerAddress());
18 BOOST_AUTO_TEST_CASE(Construct)
20 TLOG(TLVL_INFO) <<
"Test Construct BEGIN";
21 fhicl::ParameterSet pset;
22 pset.put(
"use_art",
false);
23 pset.put(
"buffer_count", 2);
24 pset.put(
"max_event_size_bytes", 1000);
25 pset.put(
"expected_fragments_per_event", 2);
28 BOOST_REQUIRE_EQUAL(t.runID(), 0);
29 BOOST_REQUIRE_EQUAL(t.GetSubrunForSequenceID(1), 1);
30 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
31 TLOG(TLVL_INFO) <<
"Test Construct END";
34 BOOST_AUTO_TEST_CASE(AddFragment)
36 TLOG(TLVL_INFO) <<
"Test AddFragment BEGIN";
38 fhicl::ParameterSet pset;
39 pset.put(
"use_art",
false);
40 pset.put(
"buffer_count", 2);
41 pset.put(
"max_event_size_bytes", 1000);
42 pset.put(
"expected_fragments_per_event", 2);
45 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
47 for (
auto ii = 0; ii < 4; ++ii)
49 *(frag->dataBegin() + ii) = ii;
52 bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag);
53 BOOST_REQUIRE_EQUAL(sts,
true);
54 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
55 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
56 TLOG(TLVL_INFO) <<
"Test AddFragment END";
59 BOOST_AUTO_TEST_CASE(DataFlow)
61 TLOG(TLVL_INFO) <<
"Test DataFlow BEGIN";
62 fhicl::ParameterSet pset;
63 pset.put(
"use_art",
false);
64 pset.put(
"buffer_count", 2);
65 pset.put(
"max_event_size_bytes", 1000);
66 pset.put(
"expected_fragments_per_event", 3);
69 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
71 for (
auto ii = 0; ii < 4; ++ii)
73 *(frag->dataBegin() + ii) = ii;
76 auto hdr = GetHeader(frag);
77 auto fragLoc = t.WriteFragmentHeader(hdr);
78 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
79 t.DoneWritingFragment(hdr);
80 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
81 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
83 frag->setFragmentID(1);
84 hdr = GetHeader(frag);
85 auto fragLoc2 = t.WriteFragmentHeader(hdr);
86 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
87 t.DoneWritingFragment(hdr);
88 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
89 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2);
90 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
92 frag->setFragmentID(2);
93 hdr = GetHeader(frag);
94 auto fragLoc3 = t.WriteFragmentHeader(hdr);
95 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
96 t.DoneWritingFragment(hdr);
97 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
98 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
99 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
101 TLOG(TLVL_INFO) <<
"Test DataFlow END";
104 BOOST_AUTO_TEST_CASE(TooManyFragments_InterleavedWrites)
106 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites BEGIN";
107 fhicl::ParameterSet pset;
108 pset.put(
"use_art",
false);
109 pset.put(
"buffer_count", 2);
110 pset.put(
"max_event_size_bytes", 1000);
111 pset.put(
"expected_fragments_per_event", 3);
112 pset.put(
"stale_buffer_timeout_usec", 100000);
115 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
117 for (
auto ii = 0; ii < 4; ++ii)
119 *(frag->dataBegin() + ii) = ii;
122 auto hdr = GetHeader(frag);
123 auto fragLoc = t.WriteFragmentHeader(hdr);
124 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
125 t.DoneWritingFragment(hdr);
126 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
127 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
129 frag->setFragmentID(1);
130 hdr = GetHeader(frag);
131 auto fragLoc2 = t.WriteFragmentHeader(hdr);
132 frag->setFragmentID(2);
133 hdr = GetHeader(frag);
134 auto fragLoc3 = t.WriteFragmentHeader(hdr);
135 frag->setFragmentID(3);
136 hdr = GetHeader(frag);
137 auto fragLoc4 = t.WriteFragmentHeader(hdr);
138 frag->setFragmentID(4);
139 hdr = GetHeader(frag);
140 auto fragLoc5 = t.WriteFragmentHeader(hdr);
142 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
143 t.DoneWritingFragment(hdr);
144 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
145 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
147 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
148 t.DoneWritingFragment(hdr);
149 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
150 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
151 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
153 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
154 t.DoneWritingFragment(hdr);
155 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
156 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
158 memcpy(fragLoc5, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
159 t.DoneWritingFragment(hdr);
160 BOOST_REQUIRE_EQUAL(fragLoc4 + frag->size(), fragLoc5);
161 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
162 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
166 frag->setSequenceID(2);
167 frag->setFragmentID(0);
169 auto hdr = GetHeader(frag);
170 auto fragLoc = t.WriteFragmentHeader(hdr);
171 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
172 t.DoneWritingFragment(hdr);
173 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
174 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
175 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
177 TLOG(TLVL_INFO) <<
"Test TooManyFragments_InterleavedWrites END";
180 BOOST_AUTO_TEST_CASE(TooManyFragments_DiscreteWrites)
182 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites BEGIN";
183 fhicl::ParameterSet pset;
184 pset.put(
"use_art",
false);
185 pset.put(
"buffer_count", 2);
186 pset.put(
"max_event_size_bytes", 1000);
187 pset.put(
"expected_fragments_per_event", 3);
188 pset.put(
"stale_buffer_timeout_usec", 100000);
191 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
193 for (
auto ii = 0; ii < 4; ++ii)
195 *(frag->dataBegin() + ii) = ii;
198 auto hdr = GetHeader(frag);
199 auto fragLoc = t.WriteFragmentHeader(hdr);
200 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
201 t.DoneWritingFragment(hdr);
202 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
203 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
205 frag->setFragmentID(1);
206 hdr = GetHeader(frag);
207 auto fragLoc2 = t.WriteFragmentHeader(hdr);
209 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
210 t.DoneWritingFragment(hdr);
211 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
212 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
214 frag->setFragmentID(2);
215 hdr = GetHeader(frag);
216 auto fragLoc3 = t.WriteFragmentHeader(hdr);
217 memcpy(fragLoc3, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
218 t.DoneWritingFragment(hdr);
219 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3);
220 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
221 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
223 frag->setFragmentID(3);
224 hdr = GetHeader(frag);
225 auto fragLoc4 = t.WriteFragmentHeader(hdr);
226 #if !ART_SUPPORTS_DUPLICATE_EVENTS
227 BOOST_REQUIRE_EQUAL(fragLoc4, t.GetDroppedDataAddress(3));
229 memcpy(fragLoc4, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
230 t.DoneWritingFragment(hdr);
231 #if ART_SUPPORTS_DUPLICATE_EVENTS
232 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
233 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
235 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
236 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
241 frag->setSequenceID(2);
242 frag->setFragmentID(0);
244 auto hdr = GetHeader(frag);
245 auto fragLoc = t.WriteFragmentHeader(hdr);
246 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
247 t.DoneWritingFragment(hdr);
248 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
250 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
251 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
253 TLOG(TLVL_INFO) <<
"Test TooManyFragments_DiscreteWrites END";
625 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
627 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active BEGIN";
628 fhicl::ParameterSet pset;
629 pset.put(
"use_art",
false);
630 pset.put(
"buffer_count", 20);
631 pset.put(
"max_event_size_bytes", 1000);
632 pset.put(
"expected_fragments_per_event", 2);
633 pset.put(
"stale_buffer_timeout_usec", 100000);
635 artdaq::FragmentPtr frag(
new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
637 for (
auto ii = 0; ii < 4; ++ii)
639 *(frag->dataBegin() + ii) = ii;
644 auto hdr = GetHeader(frag);
645 auto fragLoc = t.WriteFragmentHeader(hdr);
646 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
647 t.DoneWritingFragment(hdr);
648 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
650 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
651 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
654 frag->setSequenceID(2);
655 frag->setFragmentID(0);
657 auto hdr = GetHeader(frag);
658 auto fragLoc = t.WriteFragmentHeader(hdr);
659 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
660 t.DoneWritingFragment(hdr);
661 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
663 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
664 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
666 frag->setFragmentID(1);
667 hdr = GetHeader(frag);
668 auto fragLoc2 = t.WriteFragmentHeader(hdr);
669 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
670 t.DoneWritingFragment(hdr);
671 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
672 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
675 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
676 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
679 frag->setSequenceID(3);
680 frag->setFragmentID(0);
682 auto hdr = GetHeader(frag);
683 auto fragLoc = t.WriteFragmentHeader(hdr);
684 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
685 t.DoneWritingFragment(hdr);
686 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
688 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
689 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
691 frag->setFragmentID(1);
692 hdr = GetHeader(frag);
693 auto fragLoc2 = t.WriteFragmentHeader(hdr);
694 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
695 t.DoneWritingFragment(hdr);
696 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
698 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
699 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
705 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
706 frag->setSequenceID(4);
707 frag->setFragmentID(1);
708 auto hdr = GetHeader(frag);
709 auto fragLoc = t.WriteFragmentHeader(hdr);
710 memcpy(fragLoc, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
711 t.DoneWritingFragment(hdr);
712 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
714 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
715 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
717 frag->setFragmentID(1);
718 hdr = GetHeader(frag);
719 auto fragLoc2 = t.WriteFragmentHeader(hdr);
720 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
721 t.DoneWritingFragment(hdr);
722 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
723 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
724 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
727 frag->setSequenceID(1);
728 frag->setFragmentID(1);
729 auto hdr = GetHeader(frag);
730 auto fragLoc2 = t.WriteFragmentHeader(hdr);
731 #if !ART_SUPPORTS_DUPLICATE_EVENTS
732 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1));
734 memcpy(fragLoc2, frag->dataBegin(), 4 *
sizeof(artdaq::RawDataType));
735 t.DoneWritingFragment(hdr);
736 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
738 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
739 #if ART_SUPPORTS_DUPLICATE_EVENTS
740 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
742 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
746 TLOG(TLVL_INFO) <<
"Test ConsumeDroppedData_Active END";
860 BOOST_AUTO_TEST_CASE(RunNumbers)
862 TLOG(TLVL_INFO) <<
"Test RunNumbers BEGIN";
863 fhicl::ParameterSet pset;
864 pset.put(
"use_art",
false);
865 pset.put(
"buffer_count", 2);
866 pset.put(
"max_event_size_bytes", 1000);
867 pset.put(
"expected_fragments_per_event", 2);
871 BOOST_REQUIRE_EQUAL(t.runID(), 1);
872 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
874 BOOST_REQUIRE_EQUAL(t.runID(), 1);
875 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
877 BOOST_REQUIRE_EQUAL(t.runID(), 1);
878 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
880 BOOST_REQUIRE_EQUAL(t.runID(), 3);
881 BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
883 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
884 bool errflag =
false;
887 bool sts = r.ReadyForRead();
888 BOOST_REQUIRE_EQUAL(sts,
true);
889 auto hdr = r.ReadHeader(errflag);
890 BOOST_REQUIRE_EQUAL(errflag,
false);
891 BOOST_REQUIRE(hdr !=
nullptr);
894 BOOST_REQUIRE_EQUAL(hdr->is_complete,
true);
895 BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
896 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
898 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
899 BOOST_REQUIRE_EQUAL(errflag,
false);
900 BOOST_REQUIRE_EQUAL(frags->size(), 1);
903 TLOG(TLVL_INFO) <<
"Test RunNumbers END";
906 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...