$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_05_08
$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 BOOST_AUTO_TEST_CASE(AddFragments) 00106 { 00107 std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4}; 00108 std::vector<artdaq::Fragment::value_type> fakeData2{5, 6, 7, 8}; 00109 artdaq::FragmentPtr 00110 tmpFrag1(artdaq::Fragment::dataFrag(1, 00111 0, 00112 fakeData1.begin(), 00113 fakeData1.end())); 00114 tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType); 00115 artdaq::FragmentPtr 00116 tmpFrag2(artdaq::Fragment::dataFrag(1, 00117 1, 00118 fakeData2.begin(), 00119 fakeData2.end())); 00120 tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType); 00121 artdaq::FragmentPtrs frags; 00122 frags.push_back(std::move(tmpFrag1)); 00123 frags.push_back(std::move(tmpFrag2)); 00124 00125 artdaq::Fragment f(0); 00126 f.setSequenceID(1); 00127 artdaq::ContainerFragmentLoader cfl(f); 00128 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00129 cfl.addFragments(frags); 00130 00131 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t)); 00132 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)); 00133 BOOST_REQUIRE_EQUAL(cf->block_count(), 2); 00134 auto type = artdaq::Fragment::FirstUserFragmentType; 00135 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00136 00137 auto outfrag = cf->at(0); 00138 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00139 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00140 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00141 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00142 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00143 outfrag = cf->at(1); 00144 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00145 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1); 00146 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00147 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5); 00148 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6); 00149 } 00150 00151 BOOST_AUTO_TEST_CASE(Exceptions) 00152 { 00153 artdaq::Fragment f(0); 00154 f.setSequenceID(1); 00155 artdaq::ContainerFragmentLoader cfl(f); 00156 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); 00157 00158 // Attempting to access a fragment which is not in the container is an exception 00159 BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00160 BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00161 BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00162 00163 // Using an already-initialized Fragment to init a Container Fragment is an exception 00164 artdaq::Fragment f2(2); 00165 f2.setSequenceID(2); 00166 f2.setFragmentID(0); 00167 f2.setUserType(artdaq::Fragment::FirstUserFragmentType); 00168 BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; }); 00169 00171 //for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii) 00172 //{ 00173 // cfl.addFragment(f2); 00174 //} 00175 //BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; }); 00176 00177 // Adding a Fragment of different type to a Container is an exception 00178 artdaq::Fragment f3(0); 00179 f3.setSequenceID(1); 00180 artdaq::ContainerFragmentLoader cfl3(f3); 00181 cfl3.addFragment(f2); 00182 f2.setSystemType(artdaq::Fragment::EmptyFragmentType); 00183 BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; }); 00184 } 00185 00186 BOOST_AUTO_TEST_SUITE_END()