200{
201
203
204
205 TypeAdapter test_element;
206 uint64_t n_frames = test_element.get_num_frames();
207 uint64_t ticks_per_frame = TypeAdapter::expected_tick_difference;
208 uint64_t ticks_between = ticks_per_frame * n_frames;
209
210
211 auto test_req_bounds = [&](std::shared_ptr<BufferType<TypeAdapter>> buffer,
212 uint64_t start_win,
213 uint64_t end_win,
214 std::set<size_t> objects_skipped = {}) {
215 BOOST_TEST_MESSAGE("\ttesting [start_win{" << start_win << "}, end_win{" << end_win << "})");
216
217
218 auto errorRegistry = std::make_unique<dunedaq::datahandlinglibs::FrameErrorRegistry>();
219
220
221 DefaultRequestHandler requestHandler(buffer, errorRegistry);
222
223
225 auto req_res =
226 typename DefaultRequestHandler::RequestResult(DefaultRequestHandler::ResultCode::kUnknown, dfmessage);
227 auto ret = requestHandler.get_fragment_pieces(start_win, end_win, req_res);
228
229
230 BOOST_CHECK_EQUAL(req_res.result_code, DefaultRequestHandler::ResultCode::kFound);
231
232
233 BOOST_REQUIRE_GT(ret.front().second, 0);
234 BOOST_REQUIRE_GT(ret.back().second, 0);
235
236
237 uint64_t first_ts = reinterpret_cast<const TypeAdapter::FrameType*>(ret.front().first)->get_timestamp();
238
239
240
241
242 uint64_t last_ts = 0;
243 if (n_frames == 1)
244 last_ts = reinterpret_cast<const TypeAdapter::FrameType*>(ret.back().first)->get_timestamp();
245 else
246 last_ts = reinterpret_cast<const TypeAdapter::FrameType*>((char*)(ret.back().first) + (ret.back().second) -
247 sizeof(typename TypeAdapter::FrameType))
248 ->get_timestamp();
249
250
251
252
253 if (objects_skipped.size() == 0)
254 BOOST_CHECK_MESSAGE(first_ts <= start_win,
255 "first_frame_ts{" << first_ts << "} <= start_win{" << start_win << "}");
256 BOOST_CHECK_MESSAGE(start_win < first_ts + ticks_per_frame,
257 "start_win{" << start_win << "} < first_frame_ts+ticks_per_frame{" << first_ts + ticks_per_frame
258 << "}");
259 BOOST_CHECK_MESSAGE(last_ts < end_win, "Check last_frame_ts{" << last_ts << "} < end_win{" << end_win << "}");
260 if (objects_skipped.size() == 0)
261 BOOST_CHECK_MESSAGE(end_win <= last_ts + ticks_per_frame,
262 "end_win{" << end_win << "} <= last_frame_ts+ticks_per_frame{" << last_ts + ticks_per_frame
263 << "}");
264
265
266 auto expected_start =
267 TypeAdapter::expected_tick_difference * (uint64_t)std::floor((float)(start_win) / (float)(ticks_per_frame));
268 auto expected_end =
269 TypeAdapter::expected_tick_difference * (uint64_t)std::ceil((float)(end_win) / (float)(ticks_per_frame));
270
271
272 auto expected_start_obj = expected_start - expected_start % ticks_between;
273 while (objects_skipped.count(expected_start_obj / ticks_between) > 0 && expected_start < expected_end) {
274 expected_start += ticks_per_frame;
275 expected_start_obj = expected_start - expected_start % ticks_between;
276 }
277
278 auto expected_end_obj = expected_end - ticks_per_frame - (expected_end - ticks_per_frame) % ticks_between;
279 while (objects_skipped.count(expected_end_obj / ticks_between) > 0 &&
280 expected_end > (expected_start + ticks_per_frame)) {
281 expected_end -= ticks_per_frame;
282 expected_start_obj = expected_end - ticks_per_frame - (expected_end - ticks_per_frame) % ticks_between;
283 }
284
285
286 BOOST_CHECK_MESSAGE(first_ts == expected_start,
287 "Fragment start ts {" << first_ts << "} is expected value {" << expected_start << "}");
288 BOOST_CHECK_MESSAGE((last_ts + TypeAdapter::expected_tick_difference) == expected_end,
289 "Fragment 'end' ts {" << last_ts + TypeAdapter::expected_tick_difference
290 << "} is expected value {" << expected_end << "}");
291 };
292
293
294
295
296
297
298 BOOST_TEST_MESSAGE("Testing buffer without skips...");
299 auto buffer_noskip = std::make_shared<BufferType<TypeAdapter>>();
302
303 test_req_bounds(buffer_noskip, ticks_between * 2, ticks_between * 5);
304 test_req_bounds(buffer_noskip, ticks_between * 3 / 2, ticks_between * 9 / 2);
305 test_req_bounds(buffer_noskip, ticks_between * 11 / 5, ticks_between * 21 / 5);
306 test_req_bounds(buffer_noskip, ticks_between * 2 + 1, ticks_between * 5 + 1);
307
308
309
310
311
312
313 BOOST_TEST_MESSAGE("Testing buffer with skips...");
314 std::set<size_t> obj_to_skip = { 2, 3 };
315 auto buffer_skip = std::make_shared<BufferType<TypeAdapter>>();
318
319 test_req_bounds(buffer_skip, ticks_between * 2, ticks_between * 5, obj_to_skip);
320 test_req_bounds(buffer_skip, ticks_between * 3 / 2, ticks_between * 9 / 2, obj_to_skip);
321 if ((ticks_between * 21 / 5) > 4 * ticks_between)
322 test_req_bounds(buffer_skip, ticks_between * 11 / 5, ticks_between * 21 / 5, obj_to_skip);
323 test_req_bounds(buffer_skip, ticks_between * 2 + 1, ticks_between * 5 + 1, obj_to_skip);
324
325}
This message represents a request for data sent to a single component of the DAQ.