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 : artdaq::Fragment::FirstUserFragmentType,
48 1 : fakeData.data(),
49 2 : fakeData.size()));
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 : artdaq::Fragment::FirstUserFragmentType,
79 1 : fakeData.data(),
80 2 : fakeData.size()));
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 : artdaq::Fragment::FirstUserFragmentType,
112 1 : fakeData1.data(),
113 2 : fakeData1.size()));
114 : artdaq::FragmentPtr
115 : tmpFrag2(artdaq::Fragment::dataFrag(1,
116 : 1,
117 : artdaq::Fragment::FirstUserFragmentType,
118 1 : fakeData2.data(),
119 2 : fakeData2.size()));
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 : artdaq::Fragment::FirstUserFragmentType,
161 1000 : fakeData1.data(),
162 2000 : fakeData1.size()));
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, artdaq::Fragment::EmptyFragmentType));
235 2 : BOOST_REQUIRE_EXCEPTION(cfl3.addFragments(ff1), cet::exception, [&](cet::exception e) { return e.category() == "WrongFragmentType"; });
236 1 : }
237 :
238 2 : BOOST_AUTO_TEST_CASE(Upgrade)
239 : {
240 1 : artdaq::Fragment f(4 + artdaq::detail::RawFragmentHeader::num_words());
241 : artdaq::ContainerFragment::MetadataV0 oldMetadata;
242 :
243 1 : oldMetadata.block_count = 1;
244 1 : oldMetadata.index[0] = f.dataSizeBytes();
245 :
246 1 : f.setMetadata(oldMetadata);
247 :
248 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
249 : artdaq::FragmentPtr
250 : tmpFrag(artdaq::Fragment::dataFrag(1,
251 : 0,
252 : artdaq::Fragment::FirstUserFragmentType,
253 1 : fakeData.data(),
254 2 : fakeData.size()));
255 1 : memcpy(f.dataBegin(), tmpFrag->headerAddress(), tmpFrag->sizeBytes());
256 :
257 1 : artdaq::ContainerFragment cf(f);
258 1 : auto md = cf.metadata();
259 1 : BOOST_REQUIRE_EQUAL(md->version, 0);
260 :
261 1 : auto outfrag = cf.at(0);
262 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
263 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
264 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
265 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
266 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
267 1 : }
268 :
269 2 : BOOST_AUTO_TEST_CASE(AppendFragment)
270 : {
271 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
272 : artdaq::FragmentPtr
273 : tmpFrag(artdaq::Fragment::dataFrag(1,
274 : 0,
275 : artdaq::Fragment::FirstUserFragmentType,
276 1 : fakeData.data(),
277 2 : fakeData.size()));
278 :
279 1 : artdaq::Fragment f(0);
280 1 : f.setSequenceID(1);
281 1 : artdaq::ContainerFragmentLoader cfl(f);
282 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
283 1 : cfl.addFragment(tmpFrag);
284 :
285 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
286 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));
287 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
288 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
289 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
290 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
291 :
292 1 : auto outfrag = cf->at(0);
293 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
294 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
295 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
296 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
297 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
298 :
299 1 : auto newHdr = cfl.appendFragment(4);
300 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
301 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
302 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
303 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
304 :
305 1 : memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
306 1 : newHdr->fragment_id = 1;
307 :
308 1 : outfrag = cf->at(1);
309 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
310 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
311 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
312 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
313 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
314 1 : }
315 :
316 2 : BOOST_AUTO_TEST_CASE(ResizeLastFragment)
317 : {
318 2 : std::vector<artdaq::Fragment::value_type> fakeData{1, 2, 3, 4};
319 : artdaq::FragmentPtr
320 : tmpFrag(artdaq::Fragment::dataFrag(1,
321 : 0,
322 : artdaq::Fragment::FirstUserFragmentType,
323 1 : fakeData.data(),
324 2 : fakeData.size()));
325 :
326 1 : artdaq::Fragment f(0);
327 1 : f.setSequenceID(1);
328 1 : artdaq::ContainerFragmentLoader cfl(f);
329 1 : auto cf = reinterpret_cast<artdaq::ContainerFragment*>(&cfl);
330 1 : cfl.addFragment(tmpFrag);
331 :
332 1 : BOOST_REQUIRE_EQUAL(f.dataSizeBytes(), sizeof(artdaq::detail::RawFragmentHeader) + 4 * sizeof(artdaq::Fragment::value_type) + (2 * sizeof(size_t)));
333 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));
334 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 1);
335 1 : auto type = artdaq::Fragment::FirstUserFragmentType;
336 1 : BOOST_REQUIRE_EQUAL(cf->fragment_type(), type);
337 1 : BOOST_REQUIRE_EQUAL(cf->fragSize(0), tmpFrag->sizeBytes());
338 :
339 1 : auto outfrag = cf->at(0);
340 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
341 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 0);
342 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
343 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
344 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
345 :
346 1 : auto newHdr = cfl.appendFragment(4);
347 1 : BOOST_REQUIRE_EQUAL(cf->block_count(), 2);
348 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->word_count), 4 + artdaq::detail::RawFragmentHeader::num_words());
349 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->type), type);
350 1 : BOOST_REQUIRE_EQUAL(static_cast<artdaq::detail::RawFragmentHeader::RawDataType>(newHdr->sequence_id), 1);
351 :
352 1 : memcpy(newHdr + 1, &fakeData[0], fakeData.size() * sizeof(artdaq::Fragment::value_type));
353 1 : newHdr->fragment_id = 1;
354 :
355 1 : outfrag = cf->at(1);
356 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
357 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
358 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 4);
359 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
360 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
361 :
362 1 : cfl.resizeLastFragment(5);
363 1 : newHdr = cfl.lastFragmentHeader();
364 1 : outfrag = cf->at(1);
365 1 : BOOST_REQUIRE_EQUAL(outfrag->sequenceID(), 1);
366 1 : BOOST_REQUIRE_EQUAL(outfrag->fragmentID(), 1);
367 1 : BOOST_REQUIRE_EQUAL(outfrag->dataSize(), 5);
368 1 : BOOST_REQUIRE_EQUAL(*outfrag->dataBegin(), 1);
369 1 : BOOST_REQUIRE_EQUAL(*(outfrag->dataBegin() + 1), 2);
370 1 : }
371 :
372 : BOOST_AUTO_TEST_SUITE_END()
|