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