artdaq  v3_04_00
SharedMemoryEventManager_t.cc
1 #define TRACE_NAME "SharedMemoryEventManager_t"
2 
3 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "artdaq-core/Core/SharedMemoryEventReceiver.hh"
6 
7 #define BOOST_TEST_MODULE SharedMemoryEventManager_t
8 #include "cetlib/quiet_unit_test.hpp"
9 #include "cetlib_except/exception.h"
10 
11 
12 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test)
13 
14 BOOST_AUTO_TEST_CASE(Construct)
15 {
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);
23 
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" ;
28 }
29 
30 BOOST_AUTO_TEST_CASE(AddFragment)
31 {
32  TLOG(TLVL_INFO) << "Test AddFragment BEGIN" ;
33 
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);
40 
41  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
42  frag->resize(4);
43  for (auto ii = 0; ii < 4; ++ii)
44  {
45  *(frag->dataBegin() + ii) = ii;
46  }
47 
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" ;
53 }
54 
55 BOOST_AUTO_TEST_CASE(DataFlow)
56 {
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);
64 
65  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
66  frag->resize(4);
67  for (auto ii = 0; ii < 4; ++ii)
68  {
69  *(frag->dataBegin() + ii) = ii;
70  }
71 
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);
78 
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);
87 
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);
96 
97  TLOG(TLVL_INFO) << "Test DataFlow END" ;
98 }
99 
100 /*
101 // Need to check the following scenarios:
102 // 1. Active buffer with lower sequence id than a completed buffer (b. timeout case)
103 // 2a. Inactive buffer with lower sequence id than a completed buffer (b. timeout case)
104 // 2c. Inactive buffer times out and then data arrives (Error case)
105 BOOST_AUTO_TEST_CASE(Ordering_IncompleteActiveBuffer)
106 {
107  TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer BEGIN" ;
108  fhicl::ParameterSet pset;
109  pset.put("use_art", false);
110  pset.put("buffer_count", 20);
111  pset.put("max_event_size_bytes", 1000);
112  pset.put("expected_fragments_per_event", 2);
113 
114  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
115  frag->resize(4);
116  for (auto ii = 0; ii < 4; ++ii)
117  {
118  *(frag->dataBegin() + ii) = ii;
119  }
120 
121  artdaq::SharedMemoryEventManager t(pset, pset);
122  {
123 
124  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
125  auto fragLoc = t.WriteFragmentHeader(hdr);
126  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
127  t.DoneWritingFragment(hdr);
128  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
129  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
130  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
131  }
132  {
133  frag->setSequenceID(2);
134  frag->setFragmentID(0);
135 
136  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
137  auto fragLoc = t.WriteFragmentHeader(hdr);
138  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
139  t.DoneWritingFragment(hdr);
140  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
141  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
142  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
143 
144  frag->setFragmentID(1);
145  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
146  auto fragLoc2 = t.WriteFragmentHeader(hdr);
147  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
148  t.DoneWritingFragment(hdr);
149  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
150  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
151  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
152  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
153  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
154 
155  }
156  {
157  frag->setSequenceID(3);
158  frag->setFragmentID(0);
159 
160  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
161  auto fragLoc = t.WriteFragmentHeader(hdr);
162  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
163  t.DoneWritingFragment(hdr);
164  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
165  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
166  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
167 
168  frag->setFragmentID(1);
169  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
170  auto fragLoc2 = t.WriteFragmentHeader(hdr);
171  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
172  t.DoneWritingFragment(hdr);
173  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
174  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
175  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
176  }
177 
178  {
179  frag->setSequenceID(1);
180  frag->setFragmentID(1);
181  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
182  auto fragLoc2 = t.WriteFragmentHeader(hdr);
183  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
184  t.DoneWritingFragment(hdr);
185  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
186  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
187  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
188  }
189  TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer END" ;
190 }
191 
192 BOOST_AUTO_TEST_CASE(Ordering_IncompleteActiveBuffer_Timeout)
193 {
194  TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer_Timeout BEGIN" ;
195  fhicl::ParameterSet pset;
196  pset.put("use_art", false);
197  pset.put("buffer_count", 20);
198  pset.put("max_event_size_bytes", 1000);
199  pset.put("expected_fragments_per_event", 2);
200  pset.put("stale_buffer_timeout_usec", 100000);
201 
202  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
203  frag->resize(4);
204  for (auto ii = 0; ii < 4; ++ii)
205  {
206  *(frag->dataBegin() + ii) = ii;
207  }
208 
209  artdaq::SharedMemoryEventManager t(pset, pset);
210  {
211  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
212  auto fragLoc = t.WriteFragmentHeader(hdr);
213  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
214  t.DoneWritingFragment(hdr);
215  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
216  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
217  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
218  }
219  {
220  frag->setSequenceID(2);
221  frag->setFragmentID(0);
222 
223  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
224  auto fragLoc = t.WriteFragmentHeader(hdr);
225  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
226  t.DoneWritingFragment(hdr);
227  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
228  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
229  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
230 
231  frag->setFragmentID(1);
232  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
233  auto fragLoc2 = t.WriteFragmentHeader(hdr);
234  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
235  t.DoneWritingFragment(hdr);
236  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
237  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
238  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
239  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
240  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
241 
242  }
243  {
244  frag->setSequenceID(3);
245  frag->setFragmentID(0);
246 
247  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
248  auto fragLoc = t.WriteFragmentHeader(hdr);
249  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
250  t.DoneWritingFragment(hdr);
251  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2);
252  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
253  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
254 
255  frag->setFragmentID(1);
256  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
257  auto fragLoc2 = t.WriteFragmentHeader(hdr);
258  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
259  t.DoneWritingFragment(hdr);
260  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
261  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
262  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
263  }
264 
265  sleep(1);
266 
267  {
268  frag->setSequenceID(4);
269  frag->setFragmentID(0);
270  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
271  auto fragLoc = t.WriteFragmentHeader(hdr);
272  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
273  t.DoneWritingFragment(hdr);
274  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
275  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
276  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
277 
278  frag->setFragmentID(1);
279  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
280  auto fragLoc2 = t.WriteFragmentHeader(hdr);
281  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
282  t.DoneWritingFragment(hdr);
283  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
284  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
285  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
286  }
287  TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer_Timeout END" ;
288 }
289 
290 BOOST_AUTO_TEST_CASE(Ordering_InactiveBuffer)
291 {
292  TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer BEGIN" ;
293  fhicl::ParameterSet pset;
294  pset.put("use_art", false);
295  pset.put("buffer_count", 20);
296  pset.put("max_event_size_bytes", 1000);
297  pset.put("expected_fragments_per_event", 2);
298 
299  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
300  frag->resize(4);
301  for (auto ii = 0; ii < 4; ++ii)
302  {
303  *(frag->dataBegin() + ii) = ii;
304  }
305 
306  artdaq::SharedMemoryEventManager t(pset, pset);
307  {
308  frag->setSequenceID(2);
309  frag->setFragmentID(0);
310 
311  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
312  auto fragLoc = t.WriteFragmentHeader(hdr);
313  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
314  t.DoneWritingFragment(hdr);
315  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
316  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
317  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
318 
319  frag->setFragmentID(1);
320  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
321  auto fragLoc2 = t.WriteFragmentHeader(hdr);
322  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
323  t.DoneWritingFragment(hdr);
324  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
325  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
326  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
327  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
328  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
329  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
330 
331  }
332  {
333  frag->setSequenceID(3);
334  frag->setFragmentID(0);
335 
336  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
337  auto fragLoc = t.WriteFragmentHeader(hdr);
338  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
339  t.DoneWritingFragment(hdr);
340  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
341  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
342  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
343  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
344  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
345 
346  frag->setFragmentID(1);
347  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
348  auto fragLoc2 = t.WriteFragmentHeader(hdr);
349  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
350  t.DoneWritingFragment(hdr);
351  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
352  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
353  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
354  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
355  }
356 
357  {
358  frag->setSequenceID(1);
359  frag->setFragmentID(0);
360 
361  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
362  auto fragLoc = t.WriteFragmentHeader(hdr);
363  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
364  t.DoneWritingFragment(hdr);
365  frag->setFragmentID(1);
366  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
367  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
368  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
369  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
370 
371  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
372  auto fragLoc2 = t.WriteFragmentHeader(hdr);
373  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
374  t.DoneWritingFragment(hdr);
375  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
376  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
377  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
378  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
379  }
380  TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer END" ;
381 }
382 
383 BOOST_AUTO_TEST_CASE(Ordering_InactiveBuffer_Timeout)
384 {
385  TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer_Timeout BEGIN" ;
386  fhicl::ParameterSet pset;
387  pset.put("use_art", false);
388  pset.put("buffer_count", 20);
389  pset.put("max_event_size_bytes", 1000);
390  pset.put("expected_fragments_per_event", 2);
391  pset.put("stale_buffer_timeout_usec", 100000);
392 
393  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
394  frag->resize(4);
395  for (auto ii = 0; ii < 4; ++ii)
396  {
397  *(frag->dataBegin() + ii) = ii;
398  }
399 
400  artdaq::SharedMemoryEventManager t(pset, pset);
401  {
402  frag->setSequenceID(2);
403  frag->setFragmentID(0);
404 
405  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
406  auto fragLoc = t.WriteFragmentHeader(hdr);
407  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
408  t.DoneWritingFragment(hdr);
409  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
410  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
411  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
412 
413  frag->setFragmentID(1);
414  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
415  auto fragLoc2 = t.WriteFragmentHeader(hdr);
416  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
417  t.DoneWritingFragment(hdr);
418  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
419  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
420  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
421  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
422  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
423  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
424 
425  }
426  {
427  frag->setSequenceID(3);
428  frag->setFragmentID(0);
429 
430  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
431  auto fragLoc = t.WriteFragmentHeader(hdr);
432  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
433  t.DoneWritingFragment(hdr);
434  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
435  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
436  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
437  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
438  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
439 
440  frag->setFragmentID(1);
441  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
442  auto fragLoc2 = t.WriteFragmentHeader(hdr);
443  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
444  t.DoneWritingFragment(hdr);
445  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
446  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
447  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
448  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
449  }
450 
451  sleep(1);
452 
453  {
454  frag->setSequenceID(4);
455  frag->setFragmentID(1);
456  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
457  auto fragLoc2 = t.WriteFragmentHeader(hdr);
458  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
459  t.DoneWritingFragment(hdr);
460  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
461  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
462  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
463  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
464  }
465  TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer_Timeout END" ;
466 }
467 */
468 //SharedMemoryEventManager should print error messages, but consume data for buffers which have timed out
469 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active)
470 {
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);
478 
479  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
480  frag->resize(4);
481  for (auto ii = 0; ii < 4; ++ii)
482  {
483  *(frag->dataBegin() + ii) = ii;
484  }
485 
486  artdaq::SharedMemoryEventManager t(pset, pset);
487  {
488 
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);
494  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
495  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1);
496  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
497  }
498  {
499  frag->setSequenceID(2);
500  frag->setFragmentID(0);
501 
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);
507  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
508  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
509  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
510 
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);
518  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
519  //BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
520  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
521  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
522 
523  }
524  {
525  frag->setSequenceID(3);
526  frag->setFragmentID(0);
527 
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);
533  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
534  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
535  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1);
536 
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);
543  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
544  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
545  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
546  }
547 
548  sleep(1);
549 
550  {
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);
559  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
560  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
561  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
562 
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);
571  }
572  {
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));
579 #endif
580  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
581  t.DoneWritingFragment(hdr);
582  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
583  //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
584  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
585 #if ART_SUPPORTS_DUPLICATE_EVENTS
586  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5);
587 #else
588  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4);
589 #endif
590  }
591 
592  TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Active END" ;
593 }
594 /*
595 //SharedMemoryEventManager should print error messages, but consume data for buffers which have timed out
596 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Inactive)
597 {
598  TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Inactive BEGIN" ;
599  fhicl::ParameterSet pset;
600  pset.put("use_art", false);
601  pset.put("buffer_count", 20);
602  pset.put("max_event_size_bytes", 1000);
603  pset.put("expected_fragments_per_event", 2);
604  pset.put("stale_buffer_timeout_usec", 100000);
605 
606  artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag;
607  frag->resize(4);
608  for (auto ii = 0; ii < 4; ++ii)
609  {
610  *(frag->dataBegin() + ii) = ii;
611  }
612 
613  artdaq::SharedMemoryEventManager t(pset, pset);
614  {
615  frag->setSequenceID(2);
616  frag->setFragmentID(0);
617 
618  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
619  auto fragLoc = t.WriteFragmentHeader(hdr);
620  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
621  t.DoneWritingFragment(hdr);
622  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
623  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
624  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1);
625  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
626 
627  frag->setFragmentID(1);
628  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
629  auto fragLoc2 = t.WriteFragmentHeader(hdr);
630  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
631  t.DoneWritingFragment(hdr);
632  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1);
633  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
634  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
635  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2);
636  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
637  BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2);
638 
639  }
640  {
641  frag->setSequenceID(3);
642  frag->setFragmentID(0);
643 
644  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
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);
649  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
650  BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1);
651  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(),1);
652  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
653 
654  frag->setFragmentID(1);
655  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
656  auto fragLoc2 = t.WriteFragmentHeader(hdr);
657  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
658  t.DoneWritingFragment(hdr);
659  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2);
660  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1);
661  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
662  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
663  }
664 
665  sleep(1);
666 
667  {
668  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0);
669  frag->setSequenceID(4);
670  frag->setFragmentID(1);
671  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
672  auto fragLoc = t.WriteFragmentHeader(hdr);
673  memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
674  t.DoneWritingFragment(hdr);
675  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
676  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
677  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1);
678  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2);
679 
680  frag->setFragmentID(1);
681  hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
682  auto fragLoc2 = t.WriteFragmentHeader(hdr);
683  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
684  t.DoneWritingFragment(hdr);
685  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
686  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
687  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
688  }
689  {
690  frag->setSequenceID(1);
691  frag->setFragmentID(1);
692  auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress());
693  auto fragLoc2 = t.WriteFragmentHeader(hdr);
694  BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1));
695  memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType));
696  t.DoneWritingFragment(hdr);
697  BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0);
698  BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0);
699  BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0);
700  BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3);
701  }
702  TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Inactive END" ;
703 }
704 */
705 
706 BOOST_AUTO_TEST_CASE(RunNumbers)
707 {
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);
714  artdaq::SharedMemoryEventManager t(pset, pset);
715 
716  t.startRun(1);
717  BOOST_REQUIRE_EQUAL(t.runID(), 1);
718  BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
719  t.rolloverSubrun();
720  BOOST_REQUIRE_EQUAL(t.runID(), 1);
721  BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 2);
722  t.rolloverSubrun();
723  BOOST_REQUIRE_EQUAL(t.runID(), 1);
724  BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 3);
725  t.startRun(3);
726  BOOST_REQUIRE_EQUAL(t.runID(), 3);
727  BOOST_REQUIRE_EQUAL(t.GetCurrentSubrun(), 1);
728 
729 
730  artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey());
731  bool errflag = false;
732 
733  t.endRun();
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) { // Make static analyzer happy
740  BOOST_REQUIRE_EQUAL(hdr->is_complete, true);
741  BOOST_REQUIRE_EQUAL(hdr->run_id, 3);
742  BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1);
743  }
744  auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType);
745  BOOST_REQUIRE_EQUAL(errflag, false);
746  BOOST_REQUIRE_EQUAL(frags->size(), 1);
747  r.ReleaseBuffer();
748 
749  TLOG(TLVL_INFO) << "Test RunNumbers END" ;
750 }
751 
752 BOOST_AUTO_TEST_SUITE_END()
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...