78 TypeAdapter test_element;
79 uint64_t ticks_between = TypeAdapter::expected_tick_difference * test_element.get_num_frames();
81 auto test_lower_bound = [&](std::shared_ptr<BufferType<TypeAdapter>> buffer,
83 uint32_t expected_idx,
84 bool with_errors =
false) {
85 BOOST_TEST_MESSAGE(
"\ttesting ts=" << test_ts);
87 TypeAdapter test_element;
88 test_element.set_timestamp(test_ts);
89 typename BufferType<TypeAdapter>::Iterator expected_el = buffer->begin();
90 for (
size_t i = 0; i < expected_idx; ++i) {
95 auto return_el = buffer->lower_bound(test_element, with_errors);
98 typename BufferType<TypeAdapter>::Iterator scan_el = buffer->begin();
99 typename BufferType<TypeAdapter>::Iterator prev_el = buffer->begin();
100 while (scan_el != return_el) {
102 if (scan_el == return_el)
108 BOOST_CHECK_MESSAGE(expected_el->get_timestamp() == return_el->get_timestamp(),
109 "Expected ts{" << expected_el->get_timestamp() <<
"} == return ts{"
110 << return_el->get_timestamp() <<
"} for test_ts=" << test_ts);
113 BOOST_CHECK_MESSAGE(return_el->get_timestamp() >= test_ts,
114 "Returned ts{" << return_el->get_timestamp() <<
"} is >= test_ts{" << test_ts <<
"}");
115 BOOST_CHECK_MESSAGE((prev_el->get_timestamp() < test_ts || return_el == buffer->begin()),
116 "Prev ts{" << prev_el->get_timestamp() <<
"} is < test_ts{" << test_ts
117 <<
"} (or lower bound is begin of buffer)");
125 BOOST_TEST_MESSAGE(
"Testing buffer without skips...");
126 auto buffer_noskip = std::make_shared<BufferType<TypeAdapter>>();
132 test_lower_bound(buffer_noskip, ticks_between * 2, 2);
134 if (ticks_between > 1)
138 test_lower_bound(buffer_noskip, ticks_between * 5 / 2, 3);
141 test_lower_bound(buffer_noskip, ticks_between + 1, 2);
149 BOOST_TEST_MESSAGE(
"Testing buffer with skips...");
150 std::set<size_t> obj_to_skip = { 2, 3 };
151 auto buffer_skip = std::make_shared<BufferType<TypeAdapter>>();
157 test_lower_bound(buffer_skip, ticks_between * 2, 2,
true);
158 test_lower_bound(buffer_skip, ticks_between * 3, 2,
true);
160 test_lower_bound(buffer_skip, ticks_between, 1,
true);
161 test_lower_bound(buffer_skip, ticks_between * 4, 2,
true);
163 if (ticks_between > 1)
166 test_lower_bound(buffer_skip, ticks_between * 3 / 2, 2,
true);
167 test_lower_bound(buffer_skip, ticks_between * 5 / 2, 2,
true);
168 test_lower_bound(buffer_skip, ticks_between * 7 / 2, 2,
true);
170 test_lower_bound(buffer_skip, ticks_between * 1 / 2, 1,
true);
171 test_lower_bound(buffer_skip, ticks_between * 9 / 2, 3,
true);
172 test_lower_bound(buffer_skip, ticks_between * 11 / 2, 4,
true);
175 test_lower_bound(buffer_skip, ticks_between + 1, 2,
true);
176 test_lower_bound(buffer_skip, ticks_between * 2 + 1, 2,
true);
178 test_lower_bound(buffer_skip, 1, 1,
true);
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;
211 auto test_req_bounds = [&](std::shared_ptr<BufferType<TypeAdapter>> buffer,
214 std::set<size_t> objects_skipped = {}) {
215 BOOST_TEST_MESSAGE(
"\ttesting [start_win{" << start_win <<
"}, end_win{" << end_win <<
"})");
218 auto errorRegistry = std::make_unique<dunedaq::datahandlinglibs::FrameErrorRegistry>();
221 DefaultRequestHandler requestHandler(buffer, errorRegistry);
226 typename DefaultRequestHandler::RequestResult(DefaultRequestHandler::ResultCode::kUnknown, dfmessage);
227 auto ret = requestHandler.get_fragment_pieces(start_win, end_win, req_res);
230 BOOST_CHECK_EQUAL(req_res.result_code, DefaultRequestHandler::ResultCode::kFound);
233 BOOST_REQUIRE_GT(ret.front().second, 0);
234 BOOST_REQUIRE_GT(ret.back().second, 0);
237 uint64_t first_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>(ret.front().first)->get_timestamp();
242 uint64_t last_ts = 0;
244 last_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>(ret.back().first)->get_timestamp();
246 last_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>((
char*)(ret.back().first) + (ret.back().second) -
247 sizeof(
typename TypeAdapter::FrameType))
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
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
266 auto expected_start =
267 TypeAdapter::expected_tick_difference * (uint64_t)std::floor((
float)(start_win) / (
float)(ticks_per_frame));
269 TypeAdapter::expected_tick_difference * (uint64_t)std::ceil((
float)(end_win) / (
float)(ticks_per_frame));
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;
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;
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 <<
"}");
298 BOOST_TEST_MESSAGE(
"Testing buffer without skips...");
299 auto buffer_noskip = std::make_shared<BufferType<TypeAdapter>>();
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);
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>>();
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);