Line data Source code
1 : #define TRACE_NAME "SharedMemoryEventManager_t"
2 :
3 : #include "artdaq-core/Core/SharedMemoryEventReceiver.hh"
4 : #include "artdaq-core/Data/Fragment.hh"
5 : #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
6 :
7 : #define BOOST_TEST_MODULE SharedMemoryEventManager_t
8 : #include "cetlib/quiet_unit_test.hpp"
9 : #include "cetlib_except/exception.h"
10 :
11 : #include <thread>
12 :
13 : BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
14 :
15 25 : artdaq::detail::RawFragmentHeader GetHeader(artdaq::FragmentPtr const& frag)
16 : {
17 25 : return *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
18 : }
19 :
20 2 : BOOST_AUTO_TEST_CASE(Construct)
21 : {
22 3 : TLOG(TLVL_INFO) << "Test Construct BEGIN";
23 1 : fhicl::ParameterSet pset;
24 2 : pset.put("use_art", false);
25 2 : pset.put("init_fragment_count", 0);
26 2 : pset.put("buffer_count", 2);
27 2 : pset.put("max_event_size_bytes", 1000);
28 2 : pset.put("expected_fragments_per_event", 2);
29 1 : artdaq::SharedMemoryEventManager t(pset, pset);
30 :
31 1 : BOOST_REQUIRE_EQUAL(t.runID(), 0);
32 1 : BOOST_REQUIRE_EQUAL(t.GetSubrunForSequenceID(1), 1);
33 1 : BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0);
34 1 : t.startRun(1);
35 1 : BOOST_REQUIRE_EQUAL(t.runID(), 1);
36 1 : BOOST_REQUIRE_EQUAL(t.GetSubrunForSequenceID(1), 1);
37 3 : TLOG(TLVL_INFO) << "Test Construct END";
38 1 : }
39 :
40 2 : BOOST_AUTO_TEST_CASE(AddFragment)
41 : {
42 3 : TLOG(TLVL_INFO) << "Test AddFragment BEGIN";
43 :
44 1 : fhicl::ParameterSet pset;
45 2 : pset.put("use_art", false);
46 2 : pset.put("init_fragment_count", 0);
47 2 : pset.put("buffer_count", 2);
48 2 : pset.put("max_event_size_bytes", 1000);
49 2 : pset.put("expected_fragments_per_event", 2);
50 1 : artdaq::SharedMemoryEventManager t(pset, pset);
51 1 : t.startRun(1);
52 :
53 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
54 1 : frag->resize(4);
55 5 : for (auto ii = 0; ii < 4; ++ii)
56 : {
57 4 : *(frag->dataBegin() + ii) = ii;
58 : }
59 :
60 1 : bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag);
61 1 : BOOST_REQUIRE_EQUAL(sts, true);
62 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
63 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
64 3 : TLOG(TLVL_INFO) << "Test AddFragment END";
65 1 : }
66 :
67 2 : BOOST_AUTO_TEST_CASE(DataFlow)
68 : {
69 3 : TLOG(TLVL_INFO) << "Test DataFlow BEGIN";
70 1 : fhicl::ParameterSet pset;
71 2 : pset.put("use_art", false);
72 2 : pset.put("init_fragment_count", 0);
73 2 : pset.put("buffer_count", 2);
74 2 : pset.put("max_event_size_bytes", 1000);
75 2 : pset.put("expected_fragments_per_event", 3);
76 1 : artdaq::SharedMemoryEventManager t(pset, pset);
77 1 : t.startRun(1);
78 :
79 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
80 1 : frag->resize(4);
81 5 : for (auto ii = 0; ii < 4; ++ii)
82 : {
83 4 : *(frag->dataBegin() + ii) = ii;
84 : }
85 :
86 1 : auto hdr = GetHeader(frag);
87 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
88 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
89 1 : t.DoneWritingFragment(hdr);
90 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
91 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
92 :
93 1 : frag->setFragmentID(1);
94 1 : hdr = GetHeader(frag);
95 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
96 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
97 1 : t.DoneWritingFragment(hdr);
98 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
99 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2);
100 1 : BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
101 :
102 1 : frag->setFragmentID(2);
103 1 : hdr = GetHeader(frag);
104 1 : auto fragLoc3 = t.WriteFragmentHeader(hdr);
105 1 : memcpy(fragLoc3, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
106 1 : t.DoneWritingFragment(hdr);
107 1 : BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
108 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
109 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
110 :
111 3 : TLOG(TLVL_INFO) << "Test DataFlow END";
112 1 : }
113 :
114 2 : BOOST_AUTO_TEST_CASE(EndOfData)
115 : {
116 3 : TLOG(TLVL_INFO) << "Test EndOfData BEGIN";
117 1 : fhicl::ParameterSet pset;
118 2 : pset.put("use_art", false);
119 2 : pset.put("init_fragment_count", 0);
120 2 : pset.put("buffer_count", 2);
121 2 : pset.put("max_event_size_bytes", 1000);
122 2 : pset.put("expected_fragments_per_event", 1);
123 1 : artdaq::SharedMemoryEventManager t(pset, pset);
124 1 : t.startRun(1);
125 :
126 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
127 1 : frag->resize(4);
128 5 : for (auto ii = 0; ii < 4; ++ii)
129 : {
130 4 : *(frag->dataBegin() + ii) = ii;
131 : }
132 :
133 1 : auto hdr = GetHeader(frag);
134 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
135 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
136 1 : t.DoneWritingFragment(hdr);
137 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
138 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
139 :
140 1 : t.endOfData();
141 :
142 1 : t.startRun(2);
143 :
144 1 : frag->setSequenceID(1);
145 1 : hdr = GetHeader(frag);
146 1 : auto fragLoc3 = t.WriteFragmentHeader(hdr);
147 :
148 1 : std::atomic<bool> endComplete = false;
149 : std::thread thread{
150 2 : [&] { endComplete = t.endOfData(); }};
151 :
152 1 : memcpy(fragLoc3, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
153 1 : usleep(100000);
154 1 : BOOST_REQUIRE_EQUAL(endComplete.load(), false);
155 1 : t.DoneWritingFragment(hdr);
156 1 : thread.join();
157 1 : BOOST_REQUIRE_EQUAL(endComplete.load(), true);
158 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
159 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
160 :
161 1 : frag->setSequenceID(2);
162 1 : hdr = GetHeader(frag);
163 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
164 1 : BOOST_REQUIRE_EQUAL(fragLoc2, nullptr);
165 :
166 3 : TLOG(TLVL_INFO) << "Test EndOfData END";
167 1 : }
168 :
169 2 : BOOST_AUTO_TEST_CASE(TooManyFragments_InterleavedWrites)
170 : {
171 3 : TLOG(TLVL_INFO) << "Test TooManyFragments_InterleavedWrites BEGIN";
172 1 : fhicl::ParameterSet pset;
173 2 : pset.put("use_art", false);
174 2 : pset.put("init_fragment_count", 0);
175 2 : pset.put("buffer_count", 2);
176 2 : pset.put("max_event_size_bytes", 1000);
177 2 : pset.put("expected_fragments_per_event", 3);
178 2 : pset.put("stale_buffer_timeout_usec", 100000);
179 1 : artdaq::SharedMemoryEventManager t(pset, pset);
180 1 : t.startRun(1);
181 :
182 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
183 1 : frag->resize(4);
184 5 : for (auto ii = 0; ii < 4; ++ii)
185 : {
186 4 : *(frag->dataBegin() + ii) = ii;
187 : }
188 :
189 1 : auto hdr = GetHeader(frag);
190 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
191 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
192 1 : t.DoneWritingFragment(hdr);
193 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
194 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
195 :
196 1 : frag->setFragmentID(1);
197 1 : hdr = GetHeader(frag);
198 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
199 1 : frag->setFragmentID(2);
200 1 : hdr = GetHeader(frag);
201 1 : auto fragLoc3 = t.WriteFragmentHeader(hdr);
202 1 : frag->setFragmentID(3);
203 1 : hdr = GetHeader(frag);
204 1 : auto fragLoc4 = t.WriteFragmentHeader(hdr);
205 1 : frag->setFragmentID(4);
206 1 : hdr = GetHeader(frag);
207 1 : auto fragLoc5 = t.WriteFragmentHeader(hdr);
208 :
209 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
210 1 : t.DoneWritingFragment(hdr);
211 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
212 1 : BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
213 :
214 1 : memcpy(fragLoc3, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
215 1 : t.DoneWritingFragment(hdr);
216 1 : BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
217 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
218 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
219 :
220 1 : memcpy(fragLoc4, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
221 1 : t.DoneWritingFragment(hdr);
222 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
223 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
224 :
225 1 : memcpy(fragLoc5, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
226 1 : t.DoneWritingFragment(hdr);
227 1 : BOOST_REQUIRE_EQUAL(fragLoc4 + frag->size(), fragLoc5); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
228 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
229 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
230 :
231 1 : usleep(1000000);
232 : {
233 1 : frag->setSequenceID(2);
234 1 : frag->setFragmentID(0);
235 :
236 1 : auto hdr = GetHeader(frag);
237 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
238 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
239 1 : t.DoneWritingFragment(hdr);
240 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
241 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
242 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
243 : }
244 3 : TLOG(TLVL_INFO) << "Test TooManyFragments_InterleavedWrites END";
245 1 : }
246 :
247 2 : BOOST_AUTO_TEST_CASE(TooManyFragments_DiscreteWrites)
248 : {
249 3 : TLOG(TLVL_INFO) << "Test TooManyFragments_DiscreteWrites BEGIN";
250 1 : fhicl::ParameterSet pset;
251 2 : pset.put("use_art", false);
252 2 : pset.put("init_fragment_count", 0);
253 2 : pset.put("buffer_count", 2);
254 2 : pset.put("max_event_size_bytes", 1000);
255 2 : pset.put("expected_fragments_per_event", 3);
256 2 : pset.put("stale_buffer_timeout_usec", 100000);
257 1 : artdaq::SharedMemoryEventManager t(pset, pset);
258 1 : t.startRun(1);
259 :
260 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
261 1 : frag->resize(4);
262 5 : for (auto ii = 0; ii < 4; ++ii)
263 : {
264 4 : *(frag->dataBegin() + ii) = ii;
265 : }
266 :
267 1 : auto hdr = GetHeader(frag);
268 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
269 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
270 1 : t.DoneWritingFragment(hdr);
271 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
272 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
273 :
274 1 : frag->setFragmentID(1);
275 1 : hdr = GetHeader(frag);
276 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
277 :
278 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
279 1 : t.DoneWritingFragment(hdr);
280 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
281 1 : BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
282 :
283 1 : frag->setFragmentID(2);
284 1 : hdr = GetHeader(frag);
285 1 : auto fragLoc3 = t.WriteFragmentHeader(hdr);
286 1 : memcpy(fragLoc3, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
287 1 : t.DoneWritingFragment(hdr);
288 1 : BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
289 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
290 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
291 :
292 1 : frag->setFragmentID(3);
293 1 : hdr = GetHeader(frag);
294 1 : auto fragLoc4 = t.WriteFragmentHeader(hdr);
295 : #if !ART_SUPPORTS_DUPLICATE_EVENTS
296 1 : BOOST_REQUIRE_EQUAL(fragLoc4, t.GetDroppedDataAddress(hdr));
297 : #endif
298 1 : memcpy(fragLoc4, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
299 1 : t.DoneWritingFragment(hdr);
300 : #if ART_SUPPORTS_DUPLICATE_EVENTS
301 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
302 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
303 : #else
304 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
305 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
306 : #endif
307 :
308 1 : usleep(1000000);
309 : {
310 1 : frag->setSequenceID(2);
311 1 : frag->setFragmentID(0);
312 :
313 1 : auto hdr = GetHeader(frag);
314 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
315 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
316 1 : t.DoneWritingFragment(hdr);
317 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
318 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
319 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
320 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
321 : }
322 3 : TLOG(TLVL_INFO) << "Test TooManyFragments_DiscreteWrites END";
323 1 : }
324 :
325 : // SharedMemoryEventManager should print error messages, but consume data for buffers which have timed out
326 2 : BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
327 : {
328 3 : TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Active BEGIN";
329 1 : fhicl::ParameterSet pset;
330 2 : pset.put("use_art", false);
331 2 : pset.put("init_fragment_count", 0);
332 2 : pset.put("buffer_count", 20);
333 2 : pset.put("max_event_size_bytes", 1000);
334 2 : pset.put("expected_fragments_per_event", 2);
335 2 : pset.put("stale_buffer_timeout_usec", 100000);
336 :
337 1 : artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
338 1 : frag->resize(4);
339 5 : for (auto ii = 0; ii < 4; ++ii)
340 : {
341 4 : *(frag->dataBegin() + ii) = ii;
342 : }
343 :
344 1 : artdaq::SharedMemoryEventManager t(pset, pset);
345 1 : t.startRun(1);
346 : {
347 1 : auto hdr = GetHeader(frag);
348 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
349 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
350 1 : t.DoneWritingFragment(hdr);
351 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
352 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
353 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
354 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
355 : }
356 : {
357 1 : frag->setSequenceID(2);
358 1 : frag->setFragmentID(0);
359 :
360 1 : auto hdr = GetHeader(frag);
361 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
362 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
363 1 : t.DoneWritingFragment(hdr);
364 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 2);
365 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
366 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
367 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
368 :
369 1 : frag->setFragmentID(1);
370 1 : hdr = GetHeader(frag);
371 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
372 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
373 1 : t.DoneWritingFragment(hdr);
374 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
375 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
376 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
377 : // BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
378 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
379 1 : BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
380 : }
381 : {
382 1 : frag->setSequenceID(3);
383 1 : frag->setFragmentID(0);
384 :
385 1 : auto hdr = GetHeader(frag);
386 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
387 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
388 1 : t.DoneWritingFragment(hdr);
389 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 2);
390 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
391 1 : BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
392 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
393 :
394 1 : frag->setFragmentID(1);
395 1 : hdr = GetHeader(frag);
396 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
397 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
398 1 : t.DoneWritingFragment(hdr);
399 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
400 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
401 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
402 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
403 : }
404 :
405 1 : sleep(1);
406 :
407 : {
408 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
409 1 : frag->setSequenceID(4);
410 1 : frag->setFragmentID(1);
411 1 : auto hdr = GetHeader(frag);
412 1 : auto fragLoc = t.WriteFragmentHeader(hdr);
413 1 : memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
414 1 : t.DoneWritingFragment(hdr);
415 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
416 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
417 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 1);
418 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount() + t.GetArtEventCount(), 3);
419 :
420 1 : frag->setFragmentID(1);
421 1 : hdr = GetHeader(frag);
422 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
423 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
424 1 : t.DoneWritingFragment(hdr);
425 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
426 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount() + t.GetArtEventCount(), 4);
427 : }
428 : {
429 1 : frag->setSequenceID(1);
430 1 : frag->setFragmentID(1);
431 1 : auto hdr = GetHeader(frag);
432 1 : auto fragLoc2 = t.WriteFragmentHeader(hdr);
433 : #if !ART_SUPPORTS_DUPLICATE_EVENTS
434 1 : BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(hdr));
435 : #endif
436 1 : memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
437 1 : t.DoneWritingFragment(hdr);
438 1 : BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
439 : // BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
440 1 : BOOST_REQUIRE_EQUAL(t.GetOpenEventCount(), 0);
441 : #if ART_SUPPORTS_DUPLICATE_EVENTS
442 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
443 : #else
444 1 : BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
445 : #endif
446 : }
447 :
448 3 : TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Active END";
449 1 : }
450 :
451 2 : BOOST_AUTO_TEST_CASE(RunNumbers)
452 : {
453 3 : TLOG(TLVL_INFO) << "Test RunNumbers BEGIN";
454 1 : fhicl::ParameterSet pset;
455 2 : pset.put("use_art", false);
456 2 : pset.put("init_fragment_count", 0);
457 2 : pset.put("buffer_count", 2);
458 2 : pset.put("max_event_size_bytes", 1000);
459 2 : pset.put("expected_fragments_per_event", 2);
460 1 : artdaq::SharedMemoryEventManager t(pset, pset);
461 :
462 1 : t.startRun(1);
463 1 : BOOST_REQUIRE_EQUAL(t.runID(), 1);
464 1 : BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
465 1 : t.rolloverSubrun(false);
466 1 : BOOST_REQUIRE_EQUAL(t.runID(), 1);
467 1 : BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
468 1 : t.rolloverSubrun(false);
469 1 : BOOST_REQUIRE_EQUAL(t.runID(), 1);
470 1 : BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
471 :
472 : // Check repeated requests for same subrun
473 1 : t.rolloverSubrun(3, 4, false);
474 1 : t.rolloverSubrun(4, 4, false);
475 1 : t.rolloverSubrun(5, 4, false);
476 :
477 1 : t.startRun(3);
478 1 : BOOST_REQUIRE_EQUAL(t.runID(), 3);
479 1 : BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
480 :
481 1 : artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
482 :
483 1 : t.endRun();
484 :
485 3 : TLOG(TLVL_INFO) << "Test RunNumbers END";
486 1 : }
487 :
488 : BOOST_AUTO_TEST_SUITE_END()
|