artdaq_core  v3_06_00
ContainerFragment_t.cc
1 #include "artdaq-core/Data/ContainerFragmentLoader.hh"
2 
3 #define BOOST_TEST_MODULE(ContainerFragment_t)
4 #include "cetlib/quiet_unit_test.hpp"
5 
6 BOOST_AUTO_TEST_SUITE(ContainerFragment_test)
7 
8 BOOST_AUTO_TEST_CASE(Construct)
9 {
10  artdaq::Fragment f(0);
12  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
13 
14  BOOST_REQUIRE_EQUAL(f.dataSize(), 1);
15  BOOST_REQUIRE_EQUAL(cf->block_count(), 0);
17  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
18  BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
19 }
20 
21 BOOST_AUTO_TEST_CASE(AddEmptyFragment)
22 {
23  auto frag = new artdaq::Fragment();
24  frag->setSequenceID(0);
25  frag->setSystemType(artdaq::Fragment::EmptyFragmentType);
26 
27  artdaq::Fragment f(0);
29  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
30  cfl.addFragment(*frag);
31 
32  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t)));
33  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
35  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
36 
37  delete frag;
38 }
39 
40 BOOST_AUTO_TEST_CASE(AddFragment_Ptr)
41 {
42  std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
45  0,
46  fakeData.begin(),
47  fakeData.end()));
48  tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
49 
50  artdaq::Fragment f(0);
51  f.setSequenceID(1);
53  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
54  cfl.addFragment(tmpFrag);
55 
56  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
57  BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
58  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
60  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
61  BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
62 
63  auto outfrag = cf->at(0);
64  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
65  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
66  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
67  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
68  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
69 }
70 
71 BOOST_AUTO_TEST_CASE(AddFragment_Ref)
72 {
73  std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
76  0,
77  fakeData.begin(),
78  fakeData.end()));
79  tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
80  auto frag = *tmpFrag.get();
81 
82  artdaq::Fragment f(0);
83  f.setSequenceID(1);
85  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
86  cfl.addFragment(frag);
87 
88  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
89  BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
90  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
92  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
93  BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
94 
95  auto outfrag = cf->at(0);
96  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
97  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
98  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
99  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
100  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
101 }
102 
103 BOOST_AUTO_TEST_CASE(AddFragments)
104 {
105  std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4};
106  std::vector<artdaq::Fragment::value_type> fakeData2{5, 6, 7, 8};
108  tmpFrag1(artdaq::Fragment::dataFrag(1,
109  0,
110  fakeData1.begin(),
111  fakeData1.end()));
112  tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
114  tmpFrag2(artdaq::Fragment::dataFrag(1,
115  1,
116  fakeData2.begin(),
117  fakeData2.end()));
118  tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType);
119  artdaq::FragmentPtrs frags;
120  frags.push_back(std::move(tmpFrag1));
121  frags.push_back(std::move(tmpFrag2));
122 
123  artdaq::Fragment f(0);
124  f.setSequenceID(1);
126  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
127  cfl.addFragments(frags);
128 
129  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t));
130  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));
131  BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
133  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
134 
135  auto outfrag = cf->at(0);
136  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
137  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
138  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
139  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
140  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
141  outfrag = cf->at(1);
142  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
143  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
144  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
145  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5);
146  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6);
147 }
148 
149 BOOST_AUTO_TEST_CASE(Exceptions)
150 {
151  artdaq::Fragment f(0);
152  f.setSequenceID(1);
154  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
155 
156  // Attempting to access a fragment which is not in the container is an exception
157  BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
158  BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
159  BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
160 
161  // Using an already-initialized Fragment to init a Container Fragment is an exception
162  artdaq::Fragment f2(2);
163  f2.setSequenceID(2);
164  f2.setFragmentID(0);
166  BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; });
167 
169  //for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii)
170  //{
171  // cfl.addFragment(f2);
172  //}
173  //BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; });
174 
175  // Adding a Fragment of different type to a Container is an exception
176  artdaq::Fragment f3(0);
177  f3.setSequenceID(1);
179  cfl3.addFragment(f2);
180  f2.setSystemType(artdaq::Fragment::EmptyFragmentType);
181  BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
182 }
183 
184 BOOST_AUTO_TEST_SUITE_END()
std::unique_ptr< Fragment > FragmentPtr
A std::unique_ptr to a Fragment object.
Definition: Fragment.hh:54
The artdaq::ContainerFragment class represents a Fragment which contains other Fragments.
A Read-Write version of the ContainerFragment, used for filling ContainerFragment objects with other ...
static constexpr type_t EmptyFragmentType
Copy EmptyFragmentType from RawFragmentHeader.
Definition: Fragment.hh:155
The RawFragmentHeader class contains the basic fields used by artdaq for routing Fragment objects thr...
static FragmentPtr dataFrag(sequence_id_t sequenceID, fragment_id_t fragID, InputIterator i, InputIterator e)
Creates a Fragment, copying data from given location. 12-Apr-2013, KAB - this method is deprecated...
Definition: Fragment.hh:711
static constexpr size_t CONTAINER_MAGIC
Marker word used in index.
QuickVec< RawDataType >::value_type value_type
Alias value_type type from QuickVec&lt;RawDataType&gt;
Definition: Fragment.hh:185
Contains the information necessary for retrieving Fragment objects from the ContainerFragment.
static constexpr type_t FirstUserFragmentType
Copy FIRST_USER_TYPE from RawFragmentHeader.
Definition: Fragment.hh:154
std::list< FragmentPtr > FragmentPtrs
A std::list of FragmentPtrs.
Definition: Fragment.hh:59
A Fragment contains the data from one piece of the DAQ system for one event The artdaq::Fragment is t...
Definition: Fragment.hh:85