$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_06_01
$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 BOOST_AUTO_TEST_SUITE(ContainerFragment_test) 00007 00008 BOOST_AUTO_TEST_CASE(Construct) 00009 { 00010 artdaq::Fragment f(0); 00011 artdaq::ContainerFragmentLoader cfl(f); 00012 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00013 00014 BOOST_REQUIRE_EQUAL(f.dataSize(), 1); 00015 BOOST_REQUIRE_EQUAL(cf->block_count(), 0); 00016 auto type = artdaq::Fragment::EmptyFragmentType; 00017 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00018 BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00019 } 00020 00021 BOOST_AUTO_TEST_CASE(AddEmptyFragment) 00022 { 00023 auto frag = new artdaq::Fragment(); 00024 frag->setSequenceID(0); 00025 frag->setSystemType(artdaq::Fragment::EmptyFragmentType); 00026 00027 artdaq::Fragment f(0); 00028 artdaq::ContainerFragmentLoader cfl(f); 00029 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00030 cfl.addFragment(*frag); 00031 00032 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t))); 00033 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00034 auto type = artdaq::Fragment::EmptyFragmentType; 00035 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00036 00037 delete frag; 00038 } 00039 00040 BOOST_AUTO_TEST_CASE(AddFragment_Ptr) 00041 { 00042 std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4}; 00043 artdaq::FragmentPtr 00044 tmpFrag(artdaq::Fragment::dataFrag(1, 00045 0, 00046 fakeData.begin(), 00047 fakeData.end())); 00048 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType); 00049 00050 artdaq::Fragment f(0); 00051 f.setSequenceID(1); 00052 artdaq::ContainerFragmentLoader cfl(f); 00053 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00054 cfl.addFragment(tmpFrag); 00055 00056 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t))); 00057 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata)); 00058 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00059 auto type = artdaq::Fragment::FirstUserFragmentType; 00060 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00061 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes()); 00062 00063 auto outfrag = cf->at(0); 00064 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00065 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00066 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00067 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00068 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00069 } 00070 00071 BOOST_AUTO_TEST_CASE(AddFragment_Ref) 00072 { 00073 std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4}; 00074 artdaq::FragmentPtr 00075 tmpFrag(artdaq::Fragment::dataFrag(1, 00076 0, 00077 fakeData.begin(), 00078 fakeData.end())); 00079 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType); 00080 auto frag = *tmpFrag.get(); 00081 00082 artdaq::Fragment f(0); 00083 f.setSequenceID(1); 00084 artdaq::ContainerFragmentLoader cfl(f); 00085 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00086 cfl.addFragment(frag); 00087 00088 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t))); 00089 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata)); 00090 BOOST_REQUIRE_EQUAL(cf->block_count(), 1); 00091 auto type = artdaq::Fragment::FirstUserFragmentType; 00092 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00093 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes()); 00094 00095 auto outfrag = cf->at(0); 00096 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00097 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00098 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00099 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00100 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00101 } 00102 00103 BOOST_AUTO_TEST_CASE(AddFragments) 00104 { 00105 std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4}; 00106 std::vector<artdaq::Fragment::value_type> fakeData2{5, 6, 7, 8}; 00107 artdaq::FragmentPtr 00108 tmpFrag1(artdaq::Fragment::dataFrag(1, 00109 0, 00110 fakeData1.begin(), 00111 fakeData1.end())); 00112 tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType); 00113 artdaq::FragmentPtr 00114 tmpFrag2(artdaq::Fragment::dataFrag(1, 00115 1, 00116 fakeData2.begin(), 00117 fakeData2.end())); 00118 tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType); 00119 artdaq::FragmentPtrs frags; 00120 frags.push_back(std::move(tmpFrag1)); 00121 frags.push_back(std::move(tmpFrag2)); 00122 00123 artdaq::Fragment f(0); 00124 f.setSequenceID(1); 00125 artdaq::ContainerFragmentLoader cfl(f); 00126 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00127 cfl.addFragments(frags); 00128 00129 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t)); 00130 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)); 00131 BOOST_REQUIRE_EQUAL(cf->block_count(), 2); 00132 auto type = artdaq::Fragment::FirstUserFragmentType; 00133 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00134 00135 auto outfrag = cf->at(0); 00136 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00137 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0); 00138 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00139 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1); 00140 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2); 00141 outfrag = cf->at(1); 00142 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1); 00143 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1); 00144 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4); 00145 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5); 00146 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6); 00147 } 00148 00149 #define PERF_TEST_FRAGMENT_COUNT 1000 00150 BOOST_AUTO_TEST_CASE(Performance) 00151 { 00152 artdaq::FragmentPtrs frags; 00153 std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4}; 00154 for (int ii = 0; ii < PERF_TEST_FRAGMENT_COUNT; ++ii) 00155 { 00156 artdaq::FragmentPtr 00157 tmpFrag1(artdaq::Fragment::dataFrag(1, 00158 ii, 00159 fakeData1.begin(), 00160 fakeData1.end())); 00161 tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType); 00162 frags.push_back(std::move(tmpFrag1)); 00163 } 00164 00165 // Test individual adds 00166 artdaq::Fragment f(0); 00167 f.setSequenceID(1); 00168 artdaq::ContainerFragmentLoader cfl(f); 00169 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00170 auto start_time = std::chrono::steady_clock::now(); 00171 for (auto& it : frags) 00172 { 00173 cfl.addFragment(it); 00174 } 00175 auto end_time = std::chrono::steady_clock::now(); 00176 00177 BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT); 00178 auto type = artdaq::Fragment::FirstUserFragmentType; 00179 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00180 TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments individually took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us"; 00181 00182 // Test group add 00183 artdaq::Fragment f2(0); 00184 f2.setSequenceID(1); 00185 artdaq::ContainerFragmentLoader cfl2(f2); 00186 cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl2); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00187 00188 start_time = std::chrono::steady_clock::now(); 00189 cfl2.addFragments(frags); 00190 end_time = std::chrono::steady_clock::now(); 00191 00192 BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT); 00193 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type); 00194 TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments in a group took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us"; 00195 } 00196 00197 BOOST_AUTO_TEST_CASE(Exceptions) 00198 { 00199 artdaq::Fragment f(0); 00200 f.setSequenceID(1); 00201 artdaq::ContainerFragmentLoader cfl(f); 00202 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) 00203 00204 // Attempting to access a fragment which is not in the container is an exception 00205 BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00206 BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00207 BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; }); 00208 00209 // Using an already-initialized Fragment to init a Container Fragment is an exception 00210 artdaq::Fragment f2(2); 00211 f2.setSequenceID(2); 00212 f2.setFragmentID(0); 00213 f2.setUserType(artdaq::Fragment::FirstUserFragmentType); 00214 BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; }); 00215 00217 //for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii) 00218 //{ 00219 // cfl.addFragment(f2); 00220 //} 00221 //BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; }); 00222 00223 // Adding a Fragment of different type to a Container is an exception 00224 artdaq::Fragment f3(0); 00225 f3.setSequenceID(1); 00226 artdaq::ContainerFragmentLoader cfl3(f3); 00227 cfl3.addFragment(f2); 00228 f2.setSystemType(artdaq::Fragment::EmptyFragmentType); 00229 BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; }); 00230 } 00231 00232 BOOST_AUTO_TEST_SUITE_END()