artdaq  v3_12_02
DataReceiverManager_t.cc
1 #include "artdaq/DAQrate/DataReceiverManager.hh"
2 
3 #define BOOST_TEST_MODULE DataReceiverManager_t
4 #include "artdaq/TransferPlugins/ShmemTransfer.hh"
5 #include "cetlib/quiet_unit_test.hpp"
6 #include "cetlib_except/exception.h"
7 
8 #define TRACE_REQUIRE_EQUAL(l, r) \
9  do \
10  { \
11  if (l == r) \
12  { \
13  TLOG(TLVL_DEBUG) << __LINE__ << ": Checking if " << #l << " (" << l << ") equals " << #r << " (" << r << ")...YES!"; \
14  } \
15  else \
16  { \
17  TLOG(TLVL_ERROR) << __LINE__ << ": Checking if " << #l << " (" << l << ") equals " << #r << " (" << r << ")...NO!"; \
18  } \
19  BOOST_REQUIRE_EQUAL(l, r); \
20  } while (0)
21 
22 BOOST_AUTO_TEST_SUITE(DataReceiverManager_test)
23 
24 BOOST_AUTO_TEST_CASE(Construct)
25 {
26  artdaq::configureMessageFacility("DataReceiverManager_t", true, true);
27 
28  TLOG(TLVL_DEBUG) << "Test Case Construct BEGIN";
29  fhicl::ParameterSet pset;
30  pset.put("use_art", false);
31  pset.put("buffer_count", 2);
32  pset.put("max_event_size_bytes", 1000);
33  pset.put("expected_fragments_per_event", 2);
34 
35  fhicl::ParameterSet source_fhicl;
36  source_fhicl.put("transferPluginType", "Shmem");
37  source_fhicl.put("destination_rank", 1);
38  source_fhicl.put("source_rank", 0);
39 
40  fhicl::ParameterSet sources_fhicl;
41  sources_fhicl.put("shmem", source_fhicl);
42  pset.put("sources", sources_fhicl);
43  auto shm = std::make_shared<artdaq::SharedMemoryEventManager>(pset, pset);
44  artdaq::DataReceiverManager t(pset, shm);
45  TLOG(TLVL_DEBUG) << "Test Case Construct END";
46 }
47 
48 BOOST_AUTO_TEST_CASE(ReceiveData)
49 {
50  artdaq::configureMessageFacility("DataReceiverManager_t", true, true);
51  TLOG(TLVL_DEBUG) << "Test Case ReceiveData BEGIN";
52  fhicl::ParameterSet pset;
53  pset.put("use_art", false);
54  pset.put("buffer_count", 2);
55  pset.put("max_event_size_bytes", 1000);
56  pset.put("expected_fragments_per_event", 2);
57 
58  fhicl::ParameterSet source_fhicl;
59  source_fhicl.put("transferPluginType", "Shmem");
60  source_fhicl.put("destination_rank", 1);
61  source_fhicl.put("source_rank", 0);
62  source_fhicl.put("shm_key", 0xFEEE0000 + getpid());
63 
64  fhicl::ParameterSet sources_fhicl;
65  sources_fhicl.put("shmem", source_fhicl);
66  pset.put("sources", sources_fhicl);
67  auto shm = std::make_shared<artdaq::SharedMemoryEventManager>(pset, pset);
68  shm->startRun(1);
69  artdaq::DataReceiverManager t(pset, shm);
70  {
72  TRACE_REQUIRE_EQUAL(t.getSharedMemoryEventManager().get(), shm.get());
73  TRACE_REQUIRE_EQUAL(t.enabled_sources().size(), 1);
74  TRACE_REQUIRE_EQUAL(t.running_sources().size(), 0);
75  t.start_threads();
76  TRACE_REQUIRE_EQUAL(t.enabled_sources().size(), 1);
77  TRACE_REQUIRE_EQUAL(t.running_sources().size(), 1);
78 
79  artdaq::Fragment testFrag(10);
80  testFrag.setSequenceID(1);
81  testFrag.setFragmentID(0);
82  testFrag.setTimestamp(0x100);
83  testFrag.setSystemType(artdaq::Fragment::DataFragmentType);
84 
85  transfer.transfer_fragment_reliable_mode(std::move(testFrag));
86 
87  sleep(1);
88  TRACE_REQUIRE_EQUAL(t.count(), 1);
89  TRACE_REQUIRE_EQUAL(t.slotCount(0), 1);
90  TRACE_REQUIRE_EQUAL(t.byteCount(), (10 + artdaq::detail::RawFragmentHeader::num_words()) * sizeof(artdaq::RawDataType));
91 
92  artdaq::FragmentPtr eodFrag = artdaq::Fragment::eodFrag(1);
93 
94  transfer.transfer_fragment_reliable_mode(std::move(*(eodFrag.get())));
95  }
96  sleep(2);
97  TRACE_REQUIRE_EQUAL(t.count(), 1);
98  TRACE_REQUIRE_EQUAL(t.slotCount(0), 1);
99  TRACE_REQUIRE_EQUAL(t.enabled_sources().size(), 1);
100  TRACE_REQUIRE_EQUAL(t.running_sources().size(), 0);
101  TLOG(TLVL_DEBUG) << "Test Case ReceiveData END";
102 }
103 
104 BOOST_AUTO_TEST_SUITE_END()
This TransferInterface is a Sender.
Receives Fragment objects from one or more DataSenderManager instances using TransferInterface plugin...
A TransferInterface implementation plugin that transfers data using Shared Memory.