LCOV - code coverage report
Current view: top level - test/DAQrate - SharedMemoryEventManager_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 100.0 % 352 352
Test Date: 2025-09-04 00:45:34 Functions: 100.0 % 34 34

            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()
        

Generated by: LCOV version 2.0-1