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 delete frag;
00037 }
00038
00039 BOOST_AUTO_TEST_CASE(AddFragment_Ptr)
00040 {
00041 std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 };
00042 artdaq::FragmentPtr
00043 tmpFrag(artdaq::Fragment::dataFrag(1,
00044 0,
00045 fakeData.begin(),
00046 fakeData.end()));
00047 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
00048
00049 artdaq::Fragment f(0);
00050 f.setSequenceID(1);
00051 artdaq::ContainerFragmentLoader cfl(f);
00052 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
00053 cfl.addFragment(tmpFrag);
00054
00055 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type));
00056 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(artdaq::ContainerFragment::Metadata));
00057 BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
00058 auto type = artdaq::Fragment::FirstUserFragmentType;
00059 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
00060 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
00061
00062 auto outfrag = cf->at(0);
00063 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
00064 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
00065 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
00066 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
00067 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
00068 }
00069
00070 BOOST_AUTO_TEST_CASE(AddFragment_Ref)
00071 {
00072 std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 };
00073 artdaq::FragmentPtr
00074 tmpFrag(artdaq::Fragment::dataFrag(1,
00075 0,
00076 fakeData.begin(),
00077 fakeData.end()));
00078 tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
00079 auto frag = *tmpFrag.get();
00080
00081 artdaq::Fragment f(0);
00082 f.setSequenceID(1);
00083 artdaq::ContainerFragmentLoader cfl(f);
00084 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
00085 cfl.addFragment(frag);
00086
00087 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type));
00088 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(artdaq::ContainerFragment::Metadata));
00089 BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
00090 auto type = artdaq::Fragment::FirstUserFragmentType;
00091 BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
00092 BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
00093
00094 auto outfrag = cf->at(0);
00095 BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
00096 BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
00097 BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
00098 BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
00099 BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
00100 }
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);
00127 cfl.addFragments(frags);
00128
00129 BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type)));
00130 BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type)) + 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 BOOST_AUTO_TEST_CASE(Exceptions)
00150 {
00151 artdaq::Fragment f(0);
00152 f.setSequenceID(1);
00153 artdaq::ContainerFragmentLoader cfl(f);
00154 auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
00155
00156
00157 BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
00158 BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
00159 BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
00160
00161
00162 artdaq::Fragment f2(2);
00163 f2.setSequenceID(2);
00164 f2.setFragmentID(0);
00165 f2.setUserType(artdaq::Fragment::FirstUserFragmentType);
00166 BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; });
00167
00168
00169 for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii)
00170 {
00171 cfl.addFragment(f2);
00172 }
00173 BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; });
00174
00175
00176 artdaq::Fragment f3(0);
00177 f3.setSequenceID(1);
00178 artdaq::ContainerFragmentLoader cfl3(f3);
00179 cfl3.addFragment(f2);
00180 f2.setSystemType(artdaq::Fragment::EmptyFragmentType);
00181 BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
00182
00183 }
00184
00185 BOOST_AUTO_TEST_SUITE_END()