Line data Source code
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 2 : BOOST_AUTO_TEST_CASE(Construct)
9 : {
10 1 : artdaq::Fragment f(0);
11 1 : artdaq::ContainerFragmentLoader cfl(f);
12 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
13 :
14 1 : BOOST_REQUIRE_EQUAL(f.dataSize(), 1);
15 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 0);
16 1 : auto type = artdaq::Fragment::EmptyFragmentType;
17 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
18 1 : BOOST_REQUIRE_EQUAL(*reinterpret_cast<const size_t*>(cf->dataBegin()), artdaq::ContainerFragment::CONTAINER_MAGIC); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
19 1 : }
20 :
21 2 : BOOST_AUTO_TEST_CASE(AddEmptyFragment)
22 : {
23 1 : auto frag = new artdaq::Fragment();
24 1 : frag->setSequenceID(0);
25 1 : frag->setSystemType(artdaq::Fragment::EmptyFragmentType);
26 :
27 1 : artdaq::Fragment f(0);
28 1 : artdaq::ContainerFragmentLoader cfl(f);
29 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
30 1 : cfl.set_fragment_type(artdaq::Fragment::EmptyFragmentType);
31 1 : cfl.addFragment(*frag);
32 :
33 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + (2 * sizeof(size_t)));
34 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
35 1 : auto type = artdaq::Fragment::EmptyFragmentType;
36 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
37 :
38 1 : delete frag;
39 1 : }
40 :
41 2 : BOOST_AUTO_TEST_CASE(AddFragment_Ptr)
42 : {
43 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
44 : artdaq::FragmentPtr
45 : tmpFrag(artdaq::Fragment::dataFrag(1,
46 : 0,
47 : fakeData.begin(),
48 1 : fakeData.end()));
49 1 : tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
50 :
51 1 : artdaq::Fragment f(0);
52 1 : f.setSequenceID(1);
53 1 : artdaq::ContainerFragmentLoader cfl(f);
54 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
55 1 : cfl.addFragment(tmpFrag);
56 :
57 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
58 1 : BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
59 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
60 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
61 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
62 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
63 :
64 1 : auto outfrag = cf->at(0);
65 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
66 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
67 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
68 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
69 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
70 1 : }
71 :
72 2 : BOOST_AUTO_TEST_CASE(AddFragment_Ref)
73 : {
74 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
75 : artdaq::FragmentPtr
76 : tmpFrag(artdaq::Fragment::dataFrag(1,
77 : 0,
78 : fakeData.begin(),
79 1 : fakeData.end()));
80 1 : tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
81 1 : auto frag = *tmpFrag.get();
82 :
83 1 : artdaq::Fragment f(0);
84 1 : f.setSequenceID(1);
85 1 : artdaq::ContainerFragmentLoader cfl(f);
86 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
87 1 : cfl.addFragment(frag);
88 :
89 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
90 1 : BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
91 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
92 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
93 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
94 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
95 :
96 1 : auto outfrag = cf->at(0);
97 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
98 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
99 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
100 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
101 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
102 1 : }
103 :
104 2 : BOOST_AUTO_TEST_CASE(AddFragments)
105 : {
106 2 : std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4};
107 2 : std::vector<artdaq::Fragment::value_type> fakeData2{5, 6, 7, 8};
108 : artdaq::FragmentPtr
109 : tmpFrag1(artdaq::Fragment::dataFrag(1,
110 : 0,
111 : fakeData1.begin(),
112 1 : fakeData1.end()));
113 1 : tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
114 : artdaq::FragmentPtr
115 : tmpFrag2(artdaq::Fragment::dataFrag(1,
116 : 1,
117 : fakeData2.begin(),
118 1 : fakeData2.end()));
119 1 : tmpFrag2->setUserType(artdaq::Fragment::FirstUserFragmentType);
120 1 : artdaq::FragmentPtrs frags;
121 1 : frags.push_back(std::move(tmpFrag1));
122 1 : frags.push_back(std::move(tmpFrag2));
123 :
124 1 : artdaq::Fragment f(0);
125 1 : f.setSequenceID(1);
126 1 : artdaq::ContainerFragmentLoader cfl(f);
127 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
128 1 : cfl.addFragments(frags);
129 :
130 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), 2 * (sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + sizeof(size_t)) + sizeof(size_t));
131 1 : 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));
132 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
133 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
134 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
135 :
136 1 : auto outfrag = cf->at(0);
137 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
138 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
139 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
140 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
141 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
142 1 : outfrag = (*cf)[1]; // Alternate access operator
143 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
144 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
145 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
146 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 5);
147 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 6);
148 1 : }
149 :
150 : #define PERF_TEST_FRAGMENT_COUNT 1000
151 2 : BOOST_AUTO_TEST_CASE(Performance)
152 : {
153 1 : artdaq::FragmentPtrs frags;
154 2 : std::vector<artdaq::Fragment::value_type> fakeData1{1, 2, 3, 4};
155 1001 : for (int ii = 0; ii < PERF_TEST_FRAGMENT_COUNT; ++ii)
156 : {
157 : artdaq::FragmentPtr
158 : tmpFrag1(artdaq::Fragment::dataFrag(1,
159 : ii,
160 : fakeData1.begin(),
161 1000 : fakeData1.end()));
162 1000 : tmpFrag1->setUserType(artdaq::Fragment::FirstUserFragmentType);
163 1000 : frags.push_back(std::move(tmpFrag1));
164 1000 : }
165 :
166 : // Test individual adds
167 1 : artdaq::Fragment f(0);
168 1 : f.setSequenceID(1);
169 1 : artdaq::ContainerFragmentLoader cfl(f);
170 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
171 1 : auto start_time = std::chrono::steady_clock::now();
172 1001 : for (auto& it : frags)
173 : {
174 1000 : cfl.addFragment(it);
175 : }
176 1 : auto end_time = std::chrono::steady_clock::now();
177 :
178 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT);
179 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
180 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
181 3 : TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments individually took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us";
182 :
183 : // Test group add
184 1 : artdaq::Fragment f2(0);
185 1 : f2.setSequenceID(1);
186 1 : artdaq::ContainerFragmentLoader cfl2(f2);
187 1 : cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl2); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
188 :
189 1 : start_time = std::chrono::steady_clock::now();
190 1 : cfl2.addFragments(frags);
191 1 : end_time = std::chrono::steady_clock::now();
192 :
193 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), PERF_TEST_FRAGMENT_COUNT);
194 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
195 3 : TLOG(TLVL_INFO, "ContainerFragment_t") << "Adding " << PERF_TEST_FRAGMENT_COUNT << " Fragments in a group took " << artdaq::TimeUtils::GetElapsedTimeMicroseconds(start_time, end_time) << " us";
196 1 : }
197 :
198 2 : BOOST_AUTO_TEST_CASE(Exceptions)
199 : {
200 1 : artdaq::Fragment f(0);
201 1 : f.setSequenceID(1);
202 1 : artdaq::ContainerFragmentLoader cfl(f);
203 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
204 :
205 : // Attempting to access a fragment which is not in the container is an exception
206 2 : BOOST_REQUIRE_EXCEPTION(cf->at(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
207 2 : BOOST_REQUIRE_EXCEPTION(cf->fragSize(0), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
208 2 : BOOST_REQUIRE_EXCEPTION(cf->fragmentIndex(1), cet::exception, [&](cet::exception e) { return e.category() == "ArgumentOutOfRange"; });
209 :
210 : // Using an already-initialized Fragment to init a Container Fragment is an exception
211 1 : artdaq::Fragment f2(2);
212 1 : f2.setSequenceID(2);
213 1 : f2.setFragmentID(0);
214 1 : f2.setUserType(artdaq::Fragment::FirstUserFragmentType);
215 3 : BOOST_REQUIRE_EXCEPTION(artdaq::ContainerFragmentLoader cfl2(f2), cet::exception, [&](cet::exception e) { return e.category() == "InvalidFragment"; });
216 :
217 : //// Adding a Fragment to a full Container is an exception
218 : // for (int ii = 0; ii < artdaq::CONTAINER_FRAGMENT_COUNT_MAX; ++ii)
219 : //{
220 : // cfl.addFragment(f2);
221 : // }
222 : // BOOST_REQUIRE_EXCEPTION(cfl.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "ContainerFull"; });
223 :
224 : // Adding a Fragment of different type to a Container is an exception
225 1 : artdaq::Fragment f3(0);
226 1 : f3.setSequenceID(1);
227 1 : artdaq::ContainerFragmentLoader cfl3(f3);
228 1 : cfl3.addFragment(f2);
229 1 : f2.setSystemType(artdaq::Fragment::EmptyFragmentType);
230 2 : BOOST_REQUIRE_EXCEPTION(cfl3.addFragment(f2), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
231 :
232 1 : artdaq::FragmentPtrs ff1;
233 1 : ff1.emplace_back(new artdaq::Fragment(101, 202, artdaq::Fragment::DataFragmentType));
234 1 : ff1.emplace_back(new artdaq::Fragment(102, 203));
235 1 : ff1.back()->setSystemType(artdaq::Fragment::EmptyFragmentType);
236 2 : BOOST_REQUIRE_EXCEPTION(cfl3.addFragments(ff1), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
237 1 : }
238 :
239 2 : BOOST_AUTO_TEST_CASE(Upgrade)
240 : {
241 1 : artdaq::Fragment f(4 + artdaq::detail::RawFragmentHeader::num_words());
242 : artdaq::ContainerFragment::MetadataV0 oldMetadata;
243 :
244 1 : oldMetadata.block_count = 1;
245 1 : oldMetadata.index[0] = f.dataSizeBytes();
246 :
247 1 : f.setMetadata(oldMetadata);
248 :
249 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
250 : artdaq::FragmentPtr
251 : tmpFrag(artdaq::Fragment::dataFrag(1,
252 : 0,
253 : fakeData.begin(),
254 1 : fakeData.end()));
255 1 : tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
256 1 : memcpy(f.dataBegin(), tmpFrag->headerAddress(), tmpFrag->sizeBytes());
257 :
258 1 : artdaq::ContainerFragment cf(f);
259 1 : auto md = cf.metadata();
260 1 : BOOST_REQUIRE_EQUAL(md->version, 0);
261 :
262 1 : auto outfrag = cf.at(0);
263 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
264 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
265 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
266 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
267 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
268 1 : }
269 :
270 2 : BOOST_AUTO_TEST_CASE(AppendFragment)
271 : {
272 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
273 : artdaq::FragmentPtr
274 : tmpFrag(artdaq::Fragment::dataFrag(1,
275 : 0,
276 : fakeData.begin(),
277 1 : fakeData.end()));
278 1 : tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
279 :
280 1 : artdaq::Fragment f(0);
281 1 : f.setSequenceID(1);
282 1 : artdaq::ContainerFragmentLoader cfl(f);
283 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
284 1 : cfl.addFragment(tmpFrag);
285 :
286 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
287 1 : BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
288 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
289 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
290 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
291 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
292 :
293 1 : auto outfrag = cf->at(0);
294 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
295 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
296 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
297 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
298 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
299 :
300 1 : auto newHdr = cfl.appendFragment(4);
301 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
302 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
303 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
304 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
305 :
306 1 : memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
307 1 : newHdr->fragment_id = 1;
308 :
309 1 : outfrag = cf->at(1);
310 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
311 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
312 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
313 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
314 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
315 1 : }
316 :
317 2 : BOOST_AUTO_TEST_CASE(ResizeLastFragment)
318 : {
319 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
320 : artdaq::FragmentPtr
321 : tmpFrag(artdaq::Fragment::dataFrag(1,
322 : 0,
323 : fakeData.begin(),
324 1 : fakeData.end()));
325 1 : tmpFrag->setUserType(artdaq::Fragment::FirstUserFragmentType);
326 :
327 1 : artdaq::Fragment f(0);
328 1 : f.setSequenceID(1);
329 1 : artdaq::ContainerFragmentLoader cfl(f);
330 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
331 1 : cfl.addFragment(tmpFrag);
332 :
333 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
334 1 : BOOST_REQUIRE_EQUAL(f.sizeBytes(), 2 * sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)) + sizeof(artdaq::ContainerFragment::Metadata));
335 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
336 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
337 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
338 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
339 :
340 1 : auto outfrag = cf->at(0);
341 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
342 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
343 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
344 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
345 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
346 :
347 1 : auto newHdr = cfl.appendFragment(4);
348 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
349 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
350 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
351 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
352 :
353 1 : memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
354 1 : newHdr->fragment_id = 1;
355 :
356 1 : outfrag = cf->at(1);
357 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
358 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
359 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
360 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
361 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
362 :
363 1 : cfl.resizeLastFragment(5);
364 1 : newHdr = cfl.lastFragmentHeader();
365 1 : outfrag = cf->at(1);
366 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
367 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
368 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 5);
369 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
370 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
371 1 : }
372 :
373 : BOOST_AUTO_TEST_SUITE_END()
|