190 {
191
193
194
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;
199
200
201
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={}){
205
206 BOOST_TEST_MESSAGE("\ttesting [start_win{" << start_win << "}, end_win{" << end_win << "})");
207
208
209 auto errorRegistry = std::make_unique<dunedaq::datahandlinglibs::FrameErrorRegistry>();
210
211
212 DefaultRequestHandler requestHandler(buffer,errorRegistry);
213
214
216 auto req_res = typename DefaultRequestHandler::RequestResult(DefaultRequestHandler::ResultCode::kUnknown,dfmessage);
217 auto ret = requestHandler.get_fragment_pieces(start_win,end_win,req_res);
218
219
220 BOOST_CHECK_EQUAL(req_res.result_code,DefaultRequestHandler::ResultCode::kFound);
221
222
223
224
225 BOOST_REQUIRE_GT(ret.front().second,0);
226 BOOST_REQUIRE_GT(ret.back().second,0);
227
228
229 uint64_t first_ts = reinterpret_cast<const TypeAdapter::FrameType*>(ret.front().first)->get_timestamp();
230
231
232
233
234 uint64_t last_ts=0;
235 if(n_frames==1)
236 last_ts = reinterpret_cast<const TypeAdapter::FrameType*>(ret.back().first)->get_timestamp();
237 else
238 last_ts = reinterpret_cast<const TypeAdapter::FrameType*>((char*)(ret.back().first)+(ret.back().second)-sizeof(typename TypeAdapter::FrameType))->get_timestamp();
239
240
241
242
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 << "}");
253
254
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));
259
260
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;
265 }
266
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;
271 }
272
273
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 << "}");
279 };
280
281
282
283
284
285
286 BOOST_TEST_MESSAGE("Testing buffer without skips...");
287 auto buffer_noskip = std::make_shared< BufferType<TypeAdapter> >();
288 fill_buffer<BufferType,TypeAdapter>(buffer_noskip,0,10);
289 print_buffer<BufferType,TypeAdapter>(buffer_noskip,"noskip");
290
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);
295
296
297
298
299
300
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> >();
304 fill_buffer<BufferType,TypeAdapter>(buffer_skip,0,10,obj_to_skip);
305 print_buffer<BufferType,TypeAdapter>(buffer_skip,"skip");
306
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);
312
313}
This message represents a request for data sent to a single component of the DAQ.