LCOV - code coverage report
Current view: top level - /opt/artdaq/srcs/artdaq-core/test/Data - ContainerFragment_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 100.0 % 256 256
Test Date: 2025-09-04 00:45:34 Functions: 100.0 % 28 28

            Line data    Source code
       1              : #include "artdaq-core/Data/ContainerFragmentLoader.hh"
       2              : 
       3              : #define BOOST_TEST_MODULE(ContainerFragment_t)
       4              : #include "cetlib/quiet_unit_test.hpp"
       5              : 
       6              : BOOST_AUTO_TEST_SUITE(ContainerFragment_test)
       7              : 
       8            2 : BOOST_AUTO_TEST_CASE(Construct)
       9              : {
      10            1 :         artdaq::Fragment f(0);
      11            1 :         artdaq::ContainerFragmentLoader cfl(f);
      12            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
      13              : 
      14            1 :         BOOST_REQUIRE_EQUAL(f.dataSize(), 1);
      15            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 0);
      16            1 :         auto type = artdaq::Fragment::EmptyFragmentType;
      17            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
      18            1 :         BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
      19            1 : }
      20              : 
      21            2 : BOOST_AUTO_TEST_CASE(AddEmptyFragment)
      22              : {
      23            1 :         auto frag = new artdaq::Fragment();
      24            1 :         frag->setSequenceID(0);
      25            1 :         frag->setSystemType(artdaq::Fragment::EmptyFragmentType);
      26              : 
      27            1 :         artdaq::Fragment f(0);
      28            1 :         artdaq::ContainerFragmentLoader cfl(f);
      29            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
      30            1 :         cfl.set_fragment_type(artdaq::Fragment::EmptyFragmentType);
      31            1 :         cfl.addFragment(*frag);
      32              : 
      33            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t)));
      34            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
      35            1 :         auto type = artdaq::Fragment::EmptyFragmentType;
      36            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
      37              : 
      38            1 :         delete frag;
      39            1 : }
      40              : 
      41            2 : BOOST_AUTO_TEST_CASE(AddFragment_Ptr)
      42              : {
      43            2 :         std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
      44              :         artdaq::FragmentPtr
      45              :             tmpFrag(artdaq::Fragment::dataFrag(1,
      46              :                                                0,
      47              :                                                fakeData.begin(),
      48            1 :                                                fakeData.end()));
      49            1 :         tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
      50              : 
      51            1 :         artdaq::Fragment f(0);
      52            1 :         f.setSequenceID(1);
      53            1 :         artdaq::ContainerFragmentLoader cfl(f);
      54            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
      55            1 :         cfl.addFragment(tmpFrag);
      56              : 
      57            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
      58            1 :         BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
      59            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
      60            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
      61            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
      62            1 :         BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
      63              : 
      64            1 :         auto outfrag = cf->at(0);
      65            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
      66            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
      67            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
      68            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
      69            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
      70            1 : }
      71              : 
      72            2 : BOOST_AUTO_TEST_CASE(AddFragment_Ref)
      73              : {
      74            2 :         std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
      75              :         artdaq::FragmentPtr
      76              :             tmpFrag(artdaq::Fragment::dataFrag(1,
      77              :                                                0,
      78              :                                                fakeData.begin(),
      79            1 :                                                fakeData.end()));
      80            1 :         tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
      81            1 :         auto frag = *tmpFrag.get();
      82              : 
      83            1 :         artdaq::Fragment f(0);
      84            1 :         f.setSequenceID(1);
      85            1 :         artdaq::ContainerFragmentLoader cfl(f);
      86            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
      87            1 :         cfl.addFragment(frag);
      88              : 
      89            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
      90            1 :         BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
      91            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
      92            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
      93            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
      94            1 :         BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
      95              : 
      96            1 :         auto outfrag = cf->at(0);
      97            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
      98            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
      99            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     100            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     101            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     102            1 : }
     103              : 
     104            2 : BOOST_AUTO_TEST_CASE(AddFragments)
     105              : {
     106            2 :         std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4};
     107            2 :         std::vector<artdaq::Fragment::value_type> fakeData2{5, 6, 7, 8};
     108              :         artdaq::FragmentPtr
     109              :             tmpFrag1(artdaq::Fragment::dataFrag(1,
     110              :                                                 0,
     111              :                                                 fakeData1.begin(),
     112            1 :                                                 fakeData1.end()));
     113            1 :         tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
     114              :         artdaq::FragmentPtr
     115              :             tmpFrag2(artdaq::Fragment::dataFrag(1,
     116              :                                                 1,
     117              :                                                 fakeData2.begin(),
     118            1 :                                                 fakeData2.end()));
     119            1 :         tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType);
     120            1 :         artdaq::FragmentPtrs frags;
     121            1 :         frags.push_back(std::move(tmpFrag1));
     122            1 :         frags.push_back(std::move(tmpFrag2));
     123              : 
     124            1 :         artdaq::Fragment f(0);
     125            1 :         f.setSequenceID(1);
     126            1 :         artdaq::ContainerFragmentLoader cfl(f);
     127            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
     128            1 :         cfl.addFragments(frags);
     129              : 
     130            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t));
     131            1 :         BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t) + sizeof(artdaq::detail::RawFragmentHeader) + sizeof(artdaq::ContainerFragment::Metadata));
     132            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
     133            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
     134            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
     135              : 
     136            1 :         auto outfrag = cf->at(0);
     137            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     138            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
     139            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     140            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     141            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     142            1 :         outfrag = (*cf)[1];  // Alternate access operator
     143            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     144            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
     145            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     146            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5);
     147            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6);
     148            1 : }
     149              : 
     150              : #define PERF_TEST_FRAGMENT_COUNT 1000
     151            2 : BOOST_AUTO_TEST_CASE(Performance)
     152              : {
     153            1 :         artdaq::FragmentPtrs frags;
     154            2 :         std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4};
     155         1001 :         for (int ii = 0; ii < PERF_TEST_FRAGMENT_COUNT; ++ii)
     156              :         {
     157              :                 artdaq::FragmentPtr
     158              :                     tmpFrag1(artdaq::Fragment::dataFrag(1,
     159              :                                                         ii,
     160              :                                                         fakeData1.begin(),
     161         1000 :                                                         fakeData1.end()));
     162         1000 :                 tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
     163         1000 :                 frags.push_back(std::move(tmpFrag1));
     164         1000 :         }
     165              : 
     166              :         // Test individual adds
     167            1 :         artdaq::Fragment f(0);
     168            1 :         f.setSequenceID(1);
     169            1 :         artdaq::ContainerFragmentLoader cfl(f);
     170            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
     171            1 :         auto start_time = std::chrono::steady_clock::now();
     172         1001 :         for (auto& it : frags)
     173              :         {
     174         1000 :                 cfl.addFragment(it);
     175              :         }
     176            1 :         auto end_time = std::chrono::steady_clock::now();
     177              : 
     178            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT);
     179            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
     180            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
     181            3 :         TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments individually took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us";
     182              : 
     183              :         // Test group add
     184            1 :         artdaq::Fragment f2(0);
     185            1 :         f2.setSequenceID(1);
     186            1 :         artdaq::ContainerFragmentLoader cfl2(f2);
     187            1 :         cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl2);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
     188              : 
     189            1 :         start_time = std::chrono::steady_clock::now();
     190            1 :         cfl2.addFragments(frags);
     191            1 :         end_time = std::chrono::steady_clock::now();
     192              : 
     193            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT);
     194            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
     195            3 :         TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments in a group took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us";
     196            1 : }
     197              : 
     198            2 : BOOST_AUTO_TEST_CASE(Exceptions)
     199              : {
     200            1 :         artdaq::Fragment f(0);
     201            1 :         f.setSequenceID(1);
     202            1 :         artdaq::ContainerFragmentLoader cfl(f);
     203            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);  // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
     204              : 
     205              :         // Attempting to access a fragment which is not in the container is an exception
     206            2 :         BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
     207            2 :         BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
     208            2 :         BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
     209              : 
     210              :         // Using an already-initialized Fragment to init a Container Fragment is an exception
     211            1 :         artdaq::Fragment f2(2);
     212            1 :         f2.setSequenceID(2);
     213            1 :         f2.setFragmentID(0);
     214            1 :         f2.setUserType(artdaq::Fragment::FirstUserFragmentType);
     215            3 :         BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; });
     216              : 
     217              :         //// Adding a Fragment to a full Container is an exception
     218              :         // for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii)
     219              :         //{
     220              :         //      cfl.addFragment(f2);
     221              :         // }
     222              :         // BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; });
     223              : 
     224              :         // Adding a Fragment of different type to a Container is an exception
     225            1 :         artdaq::Fragment f3(0);
     226            1 :         f3.setSequenceID(1);
     227            1 :         artdaq::ContainerFragmentLoader cfl3(f3);
     228            1 :         cfl3.addFragment(f2);
     229            1 :         f2.setSystemType(artdaq::Fragment::EmptyFragmentType);
     230            2 :         BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
     231              : 
     232            1 :         artdaq::FragmentPtrs ff1;
     233            1 :         ff1.emplace_back(new artdaq::Fragment(101, 202, artdaq::Fragment::DataFragmentType));
     234            1 :         ff1.emplace_back(new artdaq::Fragment(102, 203));
     235            1 :         ff1.back()->setSystemType(artdaq::Fragment::EmptyFragmentType);
     236            2 :         BOOST_REQUIRE_EXCEPTION(cfl3.addFragments(ff1), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
     237            1 : }
     238              : 
     239            2 : BOOST_AUTO_TEST_CASE(Upgrade)
     240              : {
     241            1 :         artdaq::Fragment f(4 + artdaq::detail::RawFragmentHeader::num_words());
     242              :         artdaq::ContainerFragment::MetadataV0 oldMetadata;
     243              : 
     244            1 :         oldMetadata.block_count = 1;
     245            1 :         oldMetadata.index[0] = f.dataSizeBytes();
     246              : 
     247            1 :         f.setMetadata(oldMetadata);
     248              : 
     249            2 :         std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
     250              :         artdaq::FragmentPtr
     251              :             tmpFrag(artdaq::Fragment::dataFrag(1,
     252              :                                                0,
     253              :                                                fakeData.begin(),
     254            1 :                                                fakeData.end()));
     255            1 :         tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
     256            1 :         memcpy(f.dataBegin(), tmpFrag->headerAddress(), tmpFrag->sizeBytes());
     257              : 
     258            1 :         artdaq::ContainerFragment cf(f);
     259            1 :         auto md = cf.metadata();
     260            1 :         BOOST_REQUIRE_EQUAL(md->version, 0);
     261              : 
     262            1 :         auto outfrag = cf.at(0);
     263            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     264            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
     265            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     266            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     267            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     268            1 : }
     269              : 
     270            2 : BOOST_AUTO_TEST_CASE(AppendFragment)
     271              : {
     272            2 :         std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
     273              :         artdaq::FragmentPtr
     274              :             tmpFrag(artdaq::Fragment::dataFrag(1,
     275              :                                                0,
     276              :                                                fakeData.begin(),
     277            1 :                                                fakeData.end()));
     278            1 :         tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
     279              : 
     280            1 :         artdaq::Fragment f(0);
     281            1 :         f.setSequenceID(1);
     282            1 :         artdaq::ContainerFragmentLoader cfl(f);
     283            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
     284            1 :         cfl.addFragment(tmpFrag);
     285              : 
     286            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
     287            1 :         BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
     288            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
     289            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
     290            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
     291            1 :         BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
     292              : 
     293            1 :         auto outfrag = cf->at(0);
     294            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     295            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
     296            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     297            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     298            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     299              : 
     300            1 :         auto newHdr = cfl.appendFragment(4);
     301            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
     302            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
     303            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
     304            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
     305              : 
     306            1 :         memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
     307            1 :         newHdr->fragment_id = 1;
     308              : 
     309            1 :         outfrag = cf->at(1);
     310            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     311            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
     312            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     313            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     314            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     315            1 : }
     316              : 
     317            2 : BOOST_AUTO_TEST_CASE(ResizeLastFragment)
     318              : {
     319            2 :         std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
     320              :         artdaq::FragmentPtr
     321              :             tmpFrag(artdaq::Fragment::dataFrag(1,
     322              :                                                0,
     323              :                                                fakeData.begin(),
     324            1 :                                                fakeData.end()));
     325            1 :         tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
     326              : 
     327            1 :         artdaq::Fragment f(0);
     328            1 :         f.setSequenceID(1);
     329            1 :         artdaq::ContainerFragmentLoader cfl(f);
     330            1 :         auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
     331            1 :         cfl.addFragment(tmpFrag);
     332              : 
     333            1 :         BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
     334            1 :         BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
     335            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
     336            1 :         auto type = artdaq::Fragment::FirstUserFragmentType;
     337            1 :         BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
     338            1 :         BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
     339              : 
     340            1 :         auto outfrag = cf->at(0);
     341            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     342            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
     343            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     344            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     345            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     346              : 
     347            1 :         auto newHdr = cfl.appendFragment(4);
     348            1 :         BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
     349            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
     350            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
     351            1 :         BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
     352              : 
     353            1 :         memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
     354            1 :         newHdr->fragment_id = 1;
     355              : 
     356            1 :         outfrag = cf->at(1);
     357            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     358            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
     359            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
     360            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     361            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     362              : 
     363            1 :         cfl.resizeLastFragment(5);
     364            1 :         newHdr = cfl.lastFragmentHeader();
     365            1 :         outfrag = cf->at(1);
     366            1 :         BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
     367            1 :         BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
     368            1 :         BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 5);
     369            1 :         BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
     370            1 :         BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
     371            1 : }
     372              : 
     373              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1