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