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
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
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
00173
00174
00175
00176
00177
00178
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()