artdaq_core  v3_04_09
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 constexpr size_t artdaq::ContainerFragment::CONTAINER_MAGIC;
7 
8 BOOST_AUTO_TEST_SUITE(ContainerFragment_test)
9 
10 BOOST_AUTO_TEST_CASE(Construct)
11 {
12  artdaq::Fragment f(0);
14  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
15 
16  BOOST_REQUIRE_EQUAL(f.dataSize(), 1);
17  BOOST_REQUIRE_EQUAL(cf->block_count(), 0);
19  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
20  BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC);
21 }
22 
23 BOOST_AUTO_TEST_CASE(AddEmptyFragment)
24 {
25  auto frag = new artdaq::Fragment();
26  frag->setSequenceID(0);
27  frag->setSystemType(artdaq::Fragment::EmptyFragmentType);
28 
29  artdaq::Fragment f(0);
31  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
32  cfl.addFragment(*frag);
33 
34  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t)));
35  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
37  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
38 
39  delete frag;
40 }
41 
42 BOOST_AUTO_TEST_CASE(AddFragment_Ptr)
43 {
44  std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 };
47  0,
48  fakeData.begin(),
49  fakeData.end()));
50  tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
51 
52  artdaq::Fragment f(0);
53  f.setSequenceID(1);
55  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
56  cfl.addFragment(tmpFrag);
57 
58  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
59  BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
60  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
62  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
63  BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
64 
65  auto outfrag = cf->at(0);
66  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
67  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
68  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
69  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
70  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
71 }
72 
73 BOOST_AUTO_TEST_CASE(AddFragment_Ref)
74 {
75  std::vector<artdaq::Fragment::value_type> fakeData{ 1, 2, 3, 4 };
78  0,
79  fakeData.begin(),
80  fakeData.end()));
81  tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
82  auto frag = *tmpFrag.get();
83 
84  artdaq::Fragment f(0);
85  f.setSequenceID(1);
87  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
88  cfl.addFragment(frag);
89 
90  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2*sizeof(size_t)));
91  BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2*sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
92  BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
94  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
95  BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
96 
97  auto outfrag = cf->at(0);
98  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
99  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
100  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
101  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
102  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
103 }
104 
105 
106 BOOST_AUTO_TEST_CASE(AddFragments)
107 {
108  std::vector<artdaq::Fragment::value_type> fakeData1{ 1, 2, 3, 4 };
109  std::vector<artdaq::Fragment::value_type> fakeData2{ 5, 6, 7, 8 };
111  tmpFrag1(artdaq::Fragment::dataFrag(1,
112  0,
113  fakeData1.begin(),
114  fakeData1.end()));
115  tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
117  tmpFrag2(artdaq::Fragment::dataFrag(1,
118  1,
119  fakeData2.begin(),
120  fakeData2.end()));
121  tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType);
122  artdaq::FragmentPtrs frags;
123  frags.push_back(std::move(tmpFrag1));
124  frags.push_back(std::move(tmpFrag2));
125 
126  artdaq::Fragment f(0);
127  f.setSequenceID(1);
129  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
130  cfl.addFragments(frags);
131 
132  BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t));
133  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));
134  BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
136  BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
137 
138  auto outfrag = cf->at(0);
139  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
140  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
141  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
142  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
143  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
144  outfrag = cf->at(1);
145  BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
146  BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
147  BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
148  BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5);
149  BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6);
150 }
151 
152 BOOST_AUTO_TEST_CASE(Exceptions)
153 {
154  artdaq::Fragment f(0);
155  f.setSequenceID(1);
157  auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
158 
159  // Attempting to access a fragment which is not in the container is an exception
160  BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
161  BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
162  BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
163 
164  // Using an already-initialized Fragment to init a Container Fragment is an exception
165  artdaq::Fragment f2(2);
166  f2.setSequenceID(2);
167  f2.setFragmentID(0);
169  BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; });
170 
172  //for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii)
173  //{
174  // cfl.addFragment(f2);
175  //}
176  //BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; });
177 
178  // Adding a Fragment of different type to a Container is an exception
179  artdaq::Fragment f3(0);
180  f3.setSequenceID(1);
182  cfl3.addFragment(f2);
183  f2.setSystemType(artdaq::Fragment::EmptyFragmentType);
184  BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
185 
186 }
187 
188 BOOST_AUTO_TEST_SUITE_END()
std::unique_ptr< Fragment > FragmentPtr
A std::unique_ptr to a Fragment object.
Definition: Fragment.hh:53
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:154
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:680
QuickVec< RawDataType >::value_type value_type
Alias value_type type from QuickVec&lt;RawDataType&gt;
Definition: Fragment.hh:184
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:153
std::list< FragmentPtr > FragmentPtrs
A std::list of FragmentPtrs.
Definition: Fragment.hh:58
A Fragment contains the data from one piece of the DAQ system for one event The artdaq::Fragment is t...
Definition: Fragment.hh:84