74 TypeAdapter test_element;
75 uint64_t ticks_between = TypeAdapter::expected_tick_difference*test_element.get_num_frames();
77 auto test_lower_bound = [&]( std::shared_ptr<BufferType<TypeAdapter>> buffer,
79 uint32_t expected_idx,
80 bool with_errors=
false){
82 BOOST_TEST_MESSAGE(
"\ttesting ts=" << test_ts);
84 TypeAdapter test_element; test_element.set_timestamp(test_ts);
85 typename BufferType<TypeAdapter>::Iterator expected_el = buffer->begin();
86 for(
size_t i=0; i<expected_idx; ++i){
91 auto return_el = buffer->lower_bound(test_element,with_errors);
94 typename BufferType<TypeAdapter>::Iterator scan_el = buffer->begin();
95 typename BufferType<TypeAdapter>::Iterator prev_el = buffer->begin();
96 while(scan_el!=return_el){
98 if(scan_el==return_el)
break;
103 BOOST_CHECK_MESSAGE(expected_el->get_timestamp()==return_el->get_timestamp(),
104 "Expected ts{" << expected_el->get_timestamp() <<
"} == return ts{" << return_el->get_timestamp() <<
"} for test_ts=" << test_ts);
107 BOOST_CHECK_MESSAGE(return_el->get_timestamp()>=test_ts,
108 "Returned ts{" << return_el->get_timestamp() <<
"} is >= test_ts{" << test_ts <<
"}");
109 BOOST_CHECK_MESSAGE((prev_el->get_timestamp()<test_ts || return_el==buffer->begin()),
110 "Prev ts{" << prev_el->get_timestamp() <<
"} is < test_ts{" << test_ts <<
"} (or lower bound is begin of buffer)");
120 BOOST_TEST_MESSAGE(
"Testing buffer without skips...");
121 auto buffer_noskip = std::make_shared< BufferType<TypeAdapter> >();
127 test_lower_bound(buffer_noskip,ticks_between*2,2);
133 test_lower_bound(buffer_noskip, ticks_between * 5 / 2, 3);
136 test_lower_bound(buffer_noskip, ticks_between + 1, 2);
144 BOOST_TEST_MESSAGE(
"Testing buffer with skips...");
145 std::set<size_t> obj_to_skip = {2,3};
146 auto buffer_skip = std::make_shared< BufferType<TypeAdapter> >();
152 test_lower_bound(buffer_skip,ticks_between*2,2,
true);
153 test_lower_bound(buffer_skip,ticks_between*3,2,
true);
155 test_lower_bound(buffer_skip,ticks_between,1,
true);
156 test_lower_bound(buffer_skip,ticks_between*4,2,
true);
161 test_lower_bound(buffer_skip, ticks_between * 3 / 2, 2,
true);
162 test_lower_bound(buffer_skip, ticks_between * 5 / 2, 2,
true);
163 test_lower_bound(buffer_skip, ticks_between * 7 / 2, 2,
true);
165 test_lower_bound(buffer_skip, ticks_between * 1 / 2, 1,
true);
166 test_lower_bound(buffer_skip, ticks_between * 9 / 2, 3,
true);
167 test_lower_bound(buffer_skip, ticks_between * 11 / 2, 4,
true);
170 test_lower_bound(buffer_skip, ticks_between + 1, 2,
true);
171 test_lower_bound(buffer_skip, ticks_between * 2 + 1, 2,
true);
173 test_lower_bound(buffer_skip, 1, 1,
true);
195 TypeAdapter test_element;
196 uint64_t n_frames = test_element.get_num_frames();
197 uint64_t ticks_per_frame = TypeAdapter::expected_tick_difference;
198 uint64_t ticks_between = ticks_per_frame*n_frames;
202 auto test_req_bounds = [&](std::shared_ptr<BufferType<TypeAdapter>> buffer,
203 uint64_t start_win, uint64_t end_win,
204 std::set<size_t> objects_skipped={}){
206 BOOST_TEST_MESSAGE(
"\ttesting [start_win{" << start_win <<
"}, end_win{" << end_win <<
"})");
209 auto errorRegistry = std::make_unique<dunedaq::datahandlinglibs::FrameErrorRegistry>();
212 DefaultRequestHandler requestHandler(buffer,errorRegistry);
216 auto req_res =
typename DefaultRequestHandler::RequestResult(DefaultRequestHandler::ResultCode::kUnknown,dfmessage);
217 auto ret = requestHandler.get_fragment_pieces(start_win,end_win,req_res);
220 BOOST_CHECK_EQUAL(req_res.result_code,DefaultRequestHandler::ResultCode::kFound);
225 BOOST_REQUIRE_GT(ret.front().second,0);
226 BOOST_REQUIRE_GT(ret.back().second,0);
229 uint64_t first_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>(ret.front().first)->get_timestamp();
236 last_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>(ret.back().first)->get_timestamp();
238 last_ts =
reinterpret_cast<const TypeAdapter::FrameType*
>((
char*)(ret.back().first)+(ret.back().second)-
sizeof(
typename TypeAdapter::FrameType))->get_timestamp();
243 if(objects_skipped.size()==0)
244 BOOST_CHECK_MESSAGE(first_ts<=start_win,
245 "first_frame_ts{" << first_ts <<
"} <= start_win{" << start_win <<
"}");
246 BOOST_CHECK_MESSAGE(start_win<first_ts+ticks_per_frame,
247 "start_win{" << start_win <<
"} < first_frame_ts+ticks_per_frame{" << first_ts+ticks_per_frame <<
"}");
248 BOOST_CHECK_MESSAGE(last_ts<end_win,
249 "Check last_frame_ts{" << last_ts <<
"} < end_win{" << end_win <<
"}");
250 if(objects_skipped.size()==0)
251 BOOST_CHECK_MESSAGE(end_win<=last_ts+ticks_per_frame,
252 "end_win{" << end_win <<
"} <= last_frame_ts+ticks_per_frame{" << last_ts+ticks_per_frame <<
"}");
255 auto expected_start = TypeAdapter::expected_tick_difference *
256 (uint64_t) std::floor((
float) (start_win) / (
float) (ticks_per_frame));
257 auto expected_end = TypeAdapter::expected_tick_difference *
258 (uint64_t) std::ceil((
float) (end_win) / (
float) (ticks_per_frame));
261 auto expected_start_obj = expected_start - expected_start%ticks_between;
262 while(objects_skipped.count(expected_start_obj/ticks_between)>0 && expected_start<expected_end) {
263 expected_start += ticks_per_frame;
264 expected_start_obj = expected_start - expected_start%ticks_between;
267 auto expected_end_obj = expected_end - ticks_per_frame - (expected_end-ticks_per_frame)%ticks_between;
268 while(objects_skipped.count(expected_end_obj/ticks_between)>0 && expected_end>(expected_start+ticks_per_frame) ) {
269 expected_end -= ticks_per_frame;
270 expected_start_obj = expected_end - ticks_per_frame - (expected_end-ticks_per_frame)%ticks_between;
274 BOOST_CHECK_MESSAGE(first_ts == expected_start,
275 "Fragment start ts {" << first_ts <<
"} is expected value {" << expected_start <<
"}");
276 BOOST_CHECK_MESSAGE((last_ts + TypeAdapter::expected_tick_difference) == expected_end,
277 "Fragment 'end' ts {" << last_ts + TypeAdapter::expected_tick_difference
278 <<
"} is expected value {" << expected_end <<
"}");
286 BOOST_TEST_MESSAGE(
"Testing buffer without skips...");
287 auto buffer_noskip = std::make_shared< BufferType<TypeAdapter> >();
291 test_req_bounds(buffer_noskip,ticks_between*2,ticks_between*5);
292 test_req_bounds(buffer_noskip,ticks_between*3/2,ticks_between*9/2);
293 test_req_bounds(buffer_noskip,ticks_between*11/5,ticks_between*21/5);
294 test_req_bounds(buffer_noskip,ticks_between*2+1,ticks_between*5+1);
301 BOOST_TEST_MESSAGE(
"Testing buffer with skips...");
302 std::set<size_t> obj_to_skip = {2,3};
303 auto buffer_skip = std::make_shared< BufferType<TypeAdapter> >();
307 test_req_bounds(buffer_skip,ticks_between*2,ticks_between*5,obj_to_skip);
308 test_req_bounds(buffer_skip,ticks_between*3/2,ticks_between*9/2,obj_to_skip);
309 if((ticks_between*21/5)>4*ticks_between)
310 test_req_bounds(buffer_skip,ticks_between*11/5,ticks_between*21/5,obj_to_skip);
311 test_req_bounds(buffer_skip,ticks_between*2+1,ticks_between*5+1,obj_to_skip);