00001 #define TRACE_NAME "SharedMemoryEventManager_t" 00002 00003 #include "artdaq/DAQrate/SharedMemoryEventManager.hh" 00004 #include "artdaq-core/Data/Fragment.hh" 00005 #include "artdaq-core/Core/SharedMemoryEventReceiver.hh" 00006 00007 #define BOOST_TEST_MODULE SharedMemoryEventManager_t 00008 #include "cetlib/quiet_unit_test.hpp" 00009 #include "cetlib_except/exception.h" 00010 00011 00012 BOOST_AUTO_TEST_SUITE(SharedMemoryEventManager_test) 00013 00014 BOOST_AUTO_TEST_CASE(Construct) 00015 { 00016 TLOG(TLVL_INFO) << "Test Construct BEGIN" ; 00017 fhicl::ParameterSet pset; 00018 pset.put("use_art", false); 00019 pset.put("buffer_count", 2); 00020 pset.put("max_event_size_bytes", 1000); 00021 pset.put("expected_fragments_per_event", 2); 00022 artdaq::SharedMemoryEventManager t(pset, pset); 00023 00024 BOOST_REQUIRE_EQUAL(t.runID(), 0); 00025 BOOST_REQUIRE_EQUAL(t.subrunID(), 0); 00026 BOOST_REQUIRE_EQUAL(t.GetLockedBufferCount(), 0); 00027 TLOG(TLVL_INFO) << "Test Construct END" ; 00028 } 00029 00030 BOOST_AUTO_TEST_CASE(AddFragment) 00031 { 00032 TLOG(TLVL_INFO) << "Test AddFragment BEGIN" ; 00033 00034 fhicl::ParameterSet pset; 00035 pset.put("use_art", false); 00036 pset.put("buffer_count", 2); 00037 pset.put("max_event_size_bytes", 1000); 00038 pset.put("expected_fragments_per_event", 2); 00039 artdaq::SharedMemoryEventManager t(pset, pset); 00040 00041 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00042 frag->resize(4); 00043 for (auto ii = 0; ii < 4; ++ii) 00044 { 00045 *(frag->dataBegin() + ii) = ii; 00046 } 00047 00048 bool sts = t.AddFragment(std::move(frag), 1000000, tmpFrag); 00049 BOOST_REQUIRE_EQUAL(sts, true); 00050 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00051 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00052 TLOG(TLVL_INFO) << "Test AddFragment END" ; 00053 } 00054 00055 BOOST_AUTO_TEST_CASE(DataFlow) 00056 { 00057 TLOG(TLVL_INFO) << "Test DataFlow BEGIN" ; 00058 fhicl::ParameterSet pset; 00059 pset.put("use_art", false); 00060 pset.put("buffer_count", 2); 00061 pset.put("max_event_size_bytes", 1000); 00062 pset.put("expected_fragments_per_event", 3); 00063 artdaq::SharedMemoryEventManager t(pset, pset); 00064 00065 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00066 frag->resize(4); 00067 for (auto ii = 0; ii < 4; ++ii) 00068 { 00069 *(frag->dataBegin() + ii) = ii; 00070 } 00071 00072 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00073 auto fragLoc = t.WriteFragmentHeader(hdr); 00074 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00075 t.DoneWritingFragment(hdr); 00076 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00077 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00078 00079 frag->setFragmentID(1); 00080 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00081 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00082 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00083 t.DoneWritingFragment(hdr); 00084 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00085 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 2); 00086 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00087 00088 frag->setFragmentID(2); 00089 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00090 auto fragLoc3 = t.WriteFragmentHeader(hdr); 00091 memcpy(fragLoc3, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00092 t.DoneWritingFragment(hdr); 00093 BOOST_REQUIRE_EQUAL(fragLoc2 + frag->size(), fragLoc3); 00094 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00095 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 1); 00096 00097 TLOG(TLVL_INFO) << "Test DataFlow END" ; 00098 } 00099 00100 /* 00101 // Need to check the following scenarios: 00102 // 1. Active buffer with lower sequence id than a completed buffer (b. timeout case) 00103 // 2a. Inactive buffer with lower sequence id than a completed buffer (b. timeout case) 00104 // 2c. Inactive buffer times out and then data arrives (Error case) 00105 BOOST_AUTO_TEST_CASE(Ordering_IncompleteActiveBuffer) 00106 { 00107 TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer BEGIN" ; 00108 fhicl::ParameterSet pset; 00109 pset.put("use_art", false); 00110 pset.put("buffer_count", 20); 00111 pset.put("max_event_size_bytes", 1000); 00112 pset.put("expected_fragments_per_event", 2); 00113 00114 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00115 frag->resize(4); 00116 for (auto ii = 0; ii < 4; ++ii) 00117 { 00118 *(frag->dataBegin() + ii) = ii; 00119 } 00120 00121 artdaq::SharedMemoryEventManager t(pset, pset); 00122 { 00123 00124 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00125 auto fragLoc = t.WriteFragmentHeader(hdr); 00126 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00127 t.DoneWritingFragment(hdr); 00128 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00129 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00130 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00131 } 00132 { 00133 frag->setSequenceID(2); 00134 frag->setFragmentID(0); 00135 00136 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00137 auto fragLoc = t.WriteFragmentHeader(hdr); 00138 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00139 t.DoneWritingFragment(hdr); 00140 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00141 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00142 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00143 00144 frag->setFragmentID(1); 00145 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00146 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00147 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00148 t.DoneWritingFragment(hdr); 00149 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00150 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00151 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00152 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00153 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00154 00155 } 00156 { 00157 frag->setSequenceID(3); 00158 frag->setFragmentID(0); 00159 00160 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00161 auto fragLoc = t.WriteFragmentHeader(hdr); 00162 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00163 t.DoneWritingFragment(hdr); 00164 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00165 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00166 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00167 00168 frag->setFragmentID(1); 00169 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00170 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00171 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00172 t.DoneWritingFragment(hdr); 00173 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00174 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00175 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00176 } 00177 00178 { 00179 frag->setSequenceID(1); 00180 frag->setFragmentID(1); 00181 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00182 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00183 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00184 t.DoneWritingFragment(hdr); 00185 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00186 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00187 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00188 } 00189 TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer END" ; 00190 } 00191 00192 BOOST_AUTO_TEST_CASE(Ordering_IncompleteActiveBuffer_Timeout) 00193 { 00194 TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer_Timeout BEGIN" ; 00195 fhicl::ParameterSet pset; 00196 pset.put("use_art", false); 00197 pset.put("buffer_count", 20); 00198 pset.put("max_event_size_bytes", 1000); 00199 pset.put("expected_fragments_per_event", 2); 00200 pset.put("stale_buffer_timeout_usec", 100000); 00201 00202 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00203 frag->resize(4); 00204 for (auto ii = 0; ii < 4; ++ii) 00205 { 00206 *(frag->dataBegin() + ii) = ii; 00207 } 00208 00209 artdaq::SharedMemoryEventManager t(pset, pset); 00210 { 00211 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00212 auto fragLoc = t.WriteFragmentHeader(hdr); 00213 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00214 t.DoneWritingFragment(hdr); 00215 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00216 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00217 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00218 } 00219 { 00220 frag->setSequenceID(2); 00221 frag->setFragmentID(0); 00222 00223 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00224 auto fragLoc = t.WriteFragmentHeader(hdr); 00225 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00226 t.DoneWritingFragment(hdr); 00227 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00228 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00229 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00230 00231 frag->setFragmentID(1); 00232 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00233 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00234 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00235 t.DoneWritingFragment(hdr); 00236 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00237 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00238 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00239 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00240 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00241 00242 } 00243 { 00244 frag->setSequenceID(3); 00245 frag->setFragmentID(0); 00246 00247 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00248 auto fragLoc = t.WriteFragmentHeader(hdr); 00249 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00250 t.DoneWritingFragment(hdr); 00251 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00252 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00253 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00254 00255 frag->setFragmentID(1); 00256 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00257 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00258 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00259 t.DoneWritingFragment(hdr); 00260 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00261 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00262 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00263 } 00264 00265 sleep(1); 00266 00267 { 00268 frag->setSequenceID(4); 00269 frag->setFragmentID(0); 00270 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00271 auto fragLoc = t.WriteFragmentHeader(hdr); 00272 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00273 t.DoneWritingFragment(hdr); 00274 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00275 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00276 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00277 00278 frag->setFragmentID(1); 00279 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00280 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00281 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00282 t.DoneWritingFragment(hdr); 00283 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00284 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00285 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4); 00286 } 00287 TLOG(TLVL_INFO) << "Test Ordering_IncompleteActiveBuffer_Timeout END" ; 00288 } 00289 00290 BOOST_AUTO_TEST_CASE(Ordering_InactiveBuffer) 00291 { 00292 TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer BEGIN" ; 00293 fhicl::ParameterSet pset; 00294 pset.put("use_art", false); 00295 pset.put("buffer_count", 20); 00296 pset.put("max_event_size_bytes", 1000); 00297 pset.put("expected_fragments_per_event", 2); 00298 00299 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00300 frag->resize(4); 00301 for (auto ii = 0; ii < 4; ++ii) 00302 { 00303 *(frag->dataBegin() + ii) = ii; 00304 } 00305 00306 artdaq::SharedMemoryEventManager t(pset, pset); 00307 { 00308 frag->setSequenceID(2); 00309 frag->setFragmentID(0); 00310 00311 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00312 auto fragLoc = t.WriteFragmentHeader(hdr); 00313 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00314 t.DoneWritingFragment(hdr); 00315 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00316 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00317 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00318 00319 frag->setFragmentID(1); 00320 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00321 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00322 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00323 t.DoneWritingFragment(hdr); 00324 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00325 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00326 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00327 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00328 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00329 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00330 00331 } 00332 { 00333 frag->setSequenceID(3); 00334 frag->setFragmentID(0); 00335 00336 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00337 auto fragLoc = t.WriteFragmentHeader(hdr); 00338 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00339 t.DoneWritingFragment(hdr); 00340 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00341 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00342 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00343 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1); 00344 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00345 00346 frag->setFragmentID(1); 00347 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00348 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00349 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00350 t.DoneWritingFragment(hdr); 00351 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00352 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00353 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00354 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00355 } 00356 00357 { 00358 frag->setSequenceID(1); 00359 frag->setFragmentID(0); 00360 00361 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00362 auto fragLoc = t.WriteFragmentHeader(hdr); 00363 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00364 t.DoneWritingFragment(hdr); 00365 frag->setFragmentID(1); 00366 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00367 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00368 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00369 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00370 00371 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00372 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00373 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00374 t.DoneWritingFragment(hdr); 00375 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00376 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00377 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00378 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00379 } 00380 TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer END" ; 00381 } 00382 00383 BOOST_AUTO_TEST_CASE(Ordering_InactiveBuffer_Timeout) 00384 { 00385 TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer_Timeout BEGIN" ; 00386 fhicl::ParameterSet pset; 00387 pset.put("use_art", false); 00388 pset.put("buffer_count", 20); 00389 pset.put("max_event_size_bytes", 1000); 00390 pset.put("expected_fragments_per_event", 2); 00391 pset.put("stale_buffer_timeout_usec", 100000); 00392 00393 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00394 frag->resize(4); 00395 for (auto ii = 0; ii < 4; ++ii) 00396 { 00397 *(frag->dataBegin() + ii) = ii; 00398 } 00399 00400 artdaq::SharedMemoryEventManager t(pset, pset); 00401 { 00402 frag->setSequenceID(2); 00403 frag->setFragmentID(0); 00404 00405 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00406 auto fragLoc = t.WriteFragmentHeader(hdr); 00407 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00408 t.DoneWritingFragment(hdr); 00409 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00410 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00411 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00412 00413 frag->setFragmentID(1); 00414 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00415 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00416 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00417 t.DoneWritingFragment(hdr); 00418 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00419 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00420 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00421 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00422 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00423 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00424 00425 } 00426 { 00427 frag->setSequenceID(3); 00428 frag->setFragmentID(0); 00429 00430 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00431 auto fragLoc = t.WriteFragmentHeader(hdr); 00432 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00433 t.DoneWritingFragment(hdr); 00434 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00435 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00436 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00437 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1); 00438 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00439 00440 frag->setFragmentID(1); 00441 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00442 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00443 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00444 t.DoneWritingFragment(hdr); 00445 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00446 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00447 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00448 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00449 } 00450 00451 sleep(1); 00452 00453 { 00454 frag->setSequenceID(4); 00455 frag->setFragmentID(1); 00456 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00457 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00458 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00459 t.DoneWritingFragment(hdr); 00460 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00461 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00462 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00463 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2); 00464 } 00465 TLOG(TLVL_INFO) << "Test Ordering_InactiveBuffer_Timeout END" ; 00466 } 00467 */ 00468 //SharedMemoryEventManager should print error messages, but consume data for buffers which have timed out 00469 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Active) 00470 { 00471 TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Active BEGIN" ; 00472 fhicl::ParameterSet pset; 00473 pset.put("use_art", false); 00474 pset.put("buffer_count", 20); 00475 pset.put("max_event_size_bytes", 1000); 00476 pset.put("expected_fragments_per_event", 2); 00477 pset.put("stale_buffer_timeout_usec", 100000); 00478 00479 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00480 frag->resize(4); 00481 for (auto ii = 0; ii < 4; ++ii) 00482 { 00483 *(frag->dataBegin() + ii) = ii; 00484 } 00485 00486 artdaq::SharedMemoryEventManager t(pset, pset); 00487 { 00488 00489 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00490 auto fragLoc = t.WriteFragmentHeader(hdr); 00491 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00492 t.DoneWritingFragment(hdr); 00493 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00494 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00495 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(1), 1); 00496 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00497 } 00498 { 00499 frag->setSequenceID(2); 00500 frag->setFragmentID(0); 00501 00502 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00503 auto fragLoc = t.WriteFragmentHeader(hdr); 00504 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00505 t.DoneWritingFragment(hdr); 00506 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00507 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00508 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00509 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00510 00511 frag->setFragmentID(1); 00512 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00513 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00514 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00515 t.DoneWritingFragment(hdr); 00516 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00517 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00518 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00519 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00520 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00521 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00522 00523 } 00524 { 00525 frag->setSequenceID(3); 00526 frag->setFragmentID(0); 00527 00528 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00529 auto fragLoc = t.WriteFragmentHeader(hdr); 00530 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00531 t.DoneWritingFragment(hdr); 00532 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 2); 00533 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00534 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1); 00535 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00536 00537 frag->setFragmentID(1); 00538 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00539 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00540 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00541 t.DoneWritingFragment(hdr); 00542 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00543 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00544 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00545 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00546 } 00547 00548 sleep(1); 00549 00550 { 00551 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00552 frag->setSequenceID(4); 00553 frag->setFragmentID(1); 00554 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00555 auto fragLoc = t.WriteFragmentHeader(hdr); 00556 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00557 t.DoneWritingFragment(hdr); 00558 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00559 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00560 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00561 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00562 00563 frag->setFragmentID(1); 00564 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00565 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00566 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00567 t.DoneWritingFragment(hdr); 00568 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00569 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00570 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4); 00571 } 00572 { 00573 frag->setSequenceID(1); 00574 frag->setFragmentID(1); 00575 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00576 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00577 #if !ART_SUPPORTS_DUPLICATE_EVENTS 00578 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1)); 00579 #endif 00580 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00581 t.DoneWritingFragment(hdr); 00582 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00583 //BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00584 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00585 #if ART_SUPPORTS_DUPLICATE_EVENTS 00586 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 5); 00587 #else 00588 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 4); 00589 #endif 00590 } 00591 00592 TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Active END" ; 00593 } 00594 /* 00595 //SharedMemoryEventManager should print error messages, but consume data for buffers which have timed out 00596 BOOST_AUTO_TEST_CASE(ConsumeDroppedData_Inactive) 00597 { 00598 TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Inactive BEGIN" ; 00599 fhicl::ParameterSet pset; 00600 pset.put("use_art", false); 00601 pset.put("buffer_count", 20); 00602 pset.put("max_event_size_bytes", 1000); 00603 pset.put("expected_fragments_per_event", 2); 00604 pset.put("stale_buffer_timeout_usec", 100000); 00605 00606 artdaq::FragmentPtr frag(new artdaq::Fragment(1, 0, artdaq::Fragment::FirstUserFragmentType, 0UL)), tmpFrag; 00607 frag->resize(4); 00608 for (auto ii = 0; ii < 4; ++ii) 00609 { 00610 *(frag->dataBegin() + ii) = ii; 00611 } 00612 00613 artdaq::SharedMemoryEventManager t(pset, pset); 00614 { 00615 frag->setSequenceID(2); 00616 frag->setFragmentID(0); 00617 00618 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00619 auto fragLoc = t.WriteFragmentHeader(hdr); 00620 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00621 t.DoneWritingFragment(hdr); 00622 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00623 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00624 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 1); 00625 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00626 00627 frag->setFragmentID(1); 00628 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00629 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00630 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00631 t.DoneWritingFragment(hdr); 00632 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 1); 00633 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00634 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00635 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(2), 2); 00636 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00637 BOOST_REQUIRE_EQUAL(fragLoc + frag->size(), fragLoc2); 00638 00639 } 00640 { 00641 frag->setSequenceID(3); 00642 frag->setFragmentID(0); 00643 00644 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00645 auto fragLoc = t.WriteFragmentHeader(hdr); 00646 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00647 t.DoneWritingFragment(hdr); 00648 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00649 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00650 BOOST_REQUIRE_EQUAL(t.GetFragmentCount(3), 1); 00651 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(),1); 00652 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00653 00654 frag->setFragmentID(1); 00655 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00656 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00657 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00658 t.DoneWritingFragment(hdr); 00659 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 2); 00660 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 1); 00661 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00662 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00663 } 00664 00665 sleep(1); 00666 00667 { 00668 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 0); 00669 frag->setSequenceID(4); 00670 frag->setFragmentID(1); 00671 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00672 auto fragLoc = t.WriteFragmentHeader(hdr); 00673 memcpy(fragLoc, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00674 t.DoneWritingFragment(hdr); 00675 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00676 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00677 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 1); 00678 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 2); 00679 00680 frag->setFragmentID(1); 00681 hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00682 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00683 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00684 t.DoneWritingFragment(hdr); 00685 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00686 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00687 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00688 } 00689 { 00690 frag->setSequenceID(1); 00691 frag->setFragmentID(1); 00692 auto hdr = *reinterpret_cast<artdaq::detail::RawFragmentHeader*>(frag->headerAddress()); 00693 auto fragLoc2 = t.WriteFragmentHeader(hdr); 00694 BOOST_REQUIRE_EQUAL(fragLoc2, t.GetDroppedDataAddress(1)); 00695 memcpy(fragLoc2, frag->dataBegin(), 4 * sizeof(artdaq::RawDataType)); 00696 t.DoneWritingFragment(hdr); 00697 BOOST_REQUIRE_EQUAL(t.GetPendingEventCount(), 0); 00698 BOOST_REQUIRE_EQUAL(t.GetInactiveEventCount(), 0); 00699 BOOST_REQUIRE_EQUAL(t.GetIncompleteEventCount(), 0); 00700 BOOST_REQUIRE_EQUAL(t.GetArtEventCount(), 3); 00701 } 00702 TLOG(TLVL_INFO) << "Test ConsumeDroppedData_Inactive END" ; 00703 } 00704 */ 00705 00706 BOOST_AUTO_TEST_CASE(RunNumbers) 00707 { 00708 TLOG(TLVL_INFO) << "Test RunNumbers BEGIN" ; 00709 fhicl::ParameterSet pset; 00710 pset.put("use_art", false); 00711 pset.put("buffer_count", 2); 00712 pset.put("max_event_size_bytes", 1000); 00713 pset.put("expected_fragments_per_event", 2); 00714 artdaq::SharedMemoryEventManager t(pset, pset); 00715 00716 t.startRun(1); 00717 BOOST_REQUIRE_EQUAL(t.runID(), 1); 00718 BOOST_REQUIRE_EQUAL(t.subrunID(), 1); 00719 t.startSubrun(); 00720 BOOST_REQUIRE_EQUAL(t.runID(), 1); 00721 BOOST_REQUIRE_EQUAL(t.subrunID(), 2); 00722 t.startSubrun(); 00723 BOOST_REQUIRE_EQUAL(t.runID(), 1); 00724 BOOST_REQUIRE_EQUAL(t.subrunID(), 3); 00725 t.startRun(3); 00726 BOOST_REQUIRE_EQUAL(t.runID(), 3); 00727 BOOST_REQUIRE_EQUAL(t.subrunID(), 1); 00728 00729 00730 artdaq::SharedMemoryEventReceiver r(t.GetKey(), t.GetBroadcastKey()); 00731 t.endSubrun(); 00732 bool errflag = false; 00733 bool sts = r.ReadyForRead(); 00734 BOOST_REQUIRE_EQUAL(sts, true); 00735 auto hdr = r.ReadHeader(errflag); 00736 BOOST_REQUIRE_EQUAL(errflag, false); 00737 BOOST_REQUIRE(hdr != nullptr); 00738 if (hdr != nullptr) { // Make static analyzer happy 00739 BOOST_REQUIRE_EQUAL(hdr->is_complete, true); 00740 BOOST_REQUIRE_EQUAL(hdr->run_id, 3); 00741 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1); 00742 } 00743 auto frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfSubrunFragmentType); 00744 BOOST_REQUIRE_EQUAL(errflag, false); 00745 BOOST_REQUIRE_EQUAL(frags->size(), 1); 00746 r.ReleaseBuffer(); 00747 00748 t.endRun(); 00749 sts = r.ReadyForRead(); 00750 BOOST_REQUIRE_EQUAL(sts, true); 00751 hdr = r.ReadHeader(errflag); 00752 BOOST_REQUIRE_EQUAL(errflag, false); 00753 BOOST_REQUIRE(hdr != nullptr); 00754 if (hdr != nullptr) { // Make static analyzer happy 00755 BOOST_REQUIRE_EQUAL(hdr->is_complete, true); 00756 BOOST_REQUIRE_EQUAL(hdr->run_id, 3); 00757 BOOST_REQUIRE_EQUAL(hdr->subrun_id, 1); 00758 } 00759 frags = r.GetFragmentsByType(errflag, artdaq::Fragment::EndOfRunFragmentType); 00760 BOOST_REQUIRE_EQUAL(errflag, false); 00761 BOOST_REQUIRE_EQUAL(frags->size(), 1); 00762 r.ReleaseBuffer(); 00763 00764 TLOG(TLVL_INFO) << "Test RunNumbers END" ; 00765 } 00766 00767 BOOST_AUTO_TEST_SUITE_END()