$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_04_20a
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "artdaq-core/Data/ContainerFragmentLoader.hh" 00002 00003 #define BOOST_TEST_MODULE(ContainerFragment_t) 00004 #include "cetlib/quiet_unit_test.hpp" 00005 00006 constexpr size_t artdaq::ContainerFragment::CONTAINER_MAGIC; 00007 00008 BOOST_AUTO_TEST_SUITE(ContainerFragment_test) 00009 00010 BOOST_AUTO_TEST_CASE(Construct) 00011 { 00012 artdaq::Fragment f(0); 00013 artdaq::ContainerFragmentLoader cfl(f); 00014 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00015 00016 BOOST_REQUIRE_EQUAL(f.dataSize(), 1); 00017 BOOST_REQUIRE_EQUAL(cf->block_count(), 0); 00018 auto type = artdaq::Fragment::EmptyFragmentType; 00019 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00020 BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC); 00021 } 00022 00023 BOOST_AUTO_TEST_CASE(AddEmptyFragment) 00024 { 00025 auto frag = new artdaq::Fragment(); 00026 frag->setSequenceID(0); 00027 frag->setSystemType(artdaq::Fragment::EmptyFragmentType); 00028 00029 artdaq::Fragment f(0); 00030 artdaq::ContainerFragmentLoader cfl(f); 00031 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00032 cfl.addFragment(*frag); 00033 00034 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t))); 00035 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00036 auto type = artdaq::Fragment::EmptyFragmentType; 00037 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00038 00039 delete frag; 00040 } 00041 00042 BOOST_AUTO_TEST_CASE(AddFragment_Ptr) 00043 { 00044 std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 }; 00045 artdaq::FragmentPtr 00046 tmpFrag(artdaq::Fragment::dataFrag(1, 00047 0, 00048 fakeData.begin(), 00049 fakeData.end())); 00050 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType); 00051 00052 artdaq::Fragment f(0); 00053 f.setSequenceID(1); 00054 artdaq::ContainerFragmentLoader cfl(f); 00055 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00056 cfl.addFragment(tmpFrag); 00057 00058 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t))); 00059 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata)); 00060 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00061 auto type = artdaq::Fragment::FirstUserFragmentType; 00062 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00063 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes()); 00064 00065 auto outfrag = cf->at(0); 00066 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00067 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00068 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00069 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00070 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00071 } 00072 00073 BOOST_AUTO_TEST_CASE(AddFragment_Ref) 00074 { 00075 std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 }; 00076 artdaq::FragmentPtr 00077 tmpFrag(artdaq::Fragment::dataFrag(1, 00078 0, 00079 fakeData.begin(), 00080 fakeData.end())); 00081 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType); 00082 auto frag = *tmpFrag.get(); 00083 00084 artdaq::Fragment f(0); 00085 f.setSequenceID(1); 00086 artdaq::ContainerFragmentLoader cfl(f); 00087 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00088 cfl.addFragment(frag); 00089 00090 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2*sizeof(size_t))); 00091 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2*sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata)); 00092 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00093 auto type = artdaq::Fragment::FirstUserFragmentType; 00094 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00095 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes()); 00096 00097 auto outfrag = cf->at(0); 00098 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00099 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00100 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00101 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00102 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00103 } 00104 00105 00106 BOOST_AUTO_TEST_CASE(AddFragments) 00107 { 00108 std::vector<artdaq::Fragment::value_type> fakeData1{ 1, 2, 3, 4 }; 00109 std::vector<artdaq::Fragment::value_type> fakeData2{ 5, 6, 7, 8 }; 00110 artdaq::FragmentPtr 00111 tmpFrag1(artdaq::Fragment::dataFrag(1, 00112 0, 00113 fakeData1.begin(), 00114 fakeData1.end())); 00115 tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType); 00116 artdaq::FragmentPtr 00117 tmpFrag2(artdaq::Fragment::dataFrag(1, 00118 1, 00119 fakeData2.begin(), 00120 fakeData2.end())); 00121 tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType); 00122 artdaq::FragmentPtrs frags; 00123 frags.push_back(std::move(tmpFrag1)); 00124 frags.push_back(std::move(tmpFrag2)); 00125 00126 artdaq::Fragment f(0); 00127 f.setSequenceID(1); 00128 artdaq::ContainerFragmentLoader cfl(f); 00129 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00130 cfl.addFragments(frags); 00131 00132 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t)); 00133 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)); 00134 BOOST_REQUIRE_EQUAL(cf->block_count(), 2); 00135 auto type = artdaq::Fragment::FirstUserFragmentType; 00136 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00137 00138 auto outfrag = cf->at(0); 00139 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00140 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00141 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00142 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00143 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00144 outfrag = cf->at(1); 00145 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00146 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1); 00147 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00148 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5); 00149 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6); 00150 } 00151 00152 BOOST_AUTO_TEST_CASE(Exceptions) 00153 { 00154 artdaq::Fragment f(0); 00155 f.setSequenceID(1); 00156 artdaq::ContainerFragmentLoader cfl(f); 00157 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00158 00159 // Attempting to access a fragment which is not in the container is an exception 00160 BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00161 BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00162 BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00163 00164 // Using an already-initialized Fragment to init a Container Fragment is an exception 00165 artdaq::Fragment f2(2); 00166 f2.setSequenceID(2); 00167 f2.setFragmentID(0); 00168 f2.setUserType(artdaq::Fragment::FirstUserFragmentType); 00169 BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; }); 00170 00172 //for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii) 00173 //{ 00174 // cfl.addFragment(f2); 00175 //} 00176 //BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; }); 00177 00178 // Adding a Fragment of different type to a Container is an exception 00179 artdaq::Fragment f3(0); 00180 f3.setSequenceID(1); 00181 artdaq::ContainerFragmentLoader cfl3(f3); 00182 cfl3.addFragment(f2); 00183 f2.setSystemType(artdaq::Fragment::EmptyFragmentType); 00184 BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; }); 00185 00186 } 00187 00188 BOOST_AUTO_TEST_SUITE_END()