1 #include "artdaq-core/Core/SharedMemoryFragmentManager.hh"
2 #include "artdaq-core/Utilities/configureMessageFacility.hh"
5 #define BOOST_TEST_MODULE(SharedMemoryFragmentManager_t)
6 #include "cetlib/quiet_unit_test.hpp"
7 #include "cetlib_except/exception.h"
10 BOOST_AUTO_TEST_SUITE(SharedMemoryFragmentManager_test)
12 BOOST_AUTO_TEST_CASE(Construct)
15 TLOG_DEBUG(
"SharedMemoryManager_t") <<
"BEGIN TEST Construct" << TLOG_ENDL;
18 BOOST_REQUIRE_EQUAL(man.IsValid(),
true);
19 BOOST_REQUIRE_EQUAL(man.GetMyId(), 0);
20 BOOST_REQUIRE_EQUAL(man.size(), 10);
21 BOOST_REQUIRE_EQUAL(man.GetAttachedCount(), 0);
24 BOOST_AUTO_TEST_CASE(Attach)
27 uint32_t key = 0x7357 + rand() % 0x10000000;
31 BOOST_REQUIRE_EQUAL(man.IsValid(),
true);
32 BOOST_REQUIRE_EQUAL(man.GetMyId(), 0);
33 BOOST_REQUIRE_EQUAL(man.size(), 10);
34 BOOST_REQUIRE_EQUAL(man.GetAttachedCount(), 1);
36 BOOST_REQUIRE_EQUAL(man2.IsValid(),
true);
37 BOOST_REQUIRE_EQUAL(man2.GetMyId(), 1);
38 BOOST_REQUIRE_EQUAL(man2.size(), 10);
39 BOOST_REQUIRE_EQUAL(man2.GetAttachedCount(), 1);
43 BOOST_AUTO_TEST_CASE(DataFlow)
46 std::cout <<
"Initializing SharedMemoryFragmentManagers for DataFlow test" << std::endl;
47 uint32_t key = 0x7357 + rand() % 0x10000000;
53 std::cout <<
"Creating test Fragment" << std::endl;
55 frag.setSequenceID(0x10);
56 frag.setFragmentID(0x20);
58 frag.setSystemType(type);
59 frag.setTimestamp(0x30);
60 for (
size_t ii = 0; ii < fragSizeWords; ++ii)
62 *(frag.dataBegin() + ii) = ii;
65 std::cout <<
"Writing Test Fragment to Shared Memory" << std::endl;
66 man.WriteFragment(std::move(frag),
false);
68 std::cout <<
"Reading Test Fragment Header" << std::endl;
70 auto sts = man2.ReadFragmentHeader(header);
72 std::cout <<
"Checking Test Fragment Header Contents" << std::endl;
73 BOOST_REQUIRE_EQUAL(sts, 0);
74 BOOST_REQUIRE_EQUAL(header.
word_count, frag.size());
77 BOOST_REQUIRE_EQUAL(header.
type, type);
78 BOOST_REQUIRE_EQUAL(header.
timestamp, 0x30);
80 std::cout <<
"Reading Test Fragment data" << std::endl;
84 std::cout <<
"Checking Test Fragment contents" << std::endl;
85 BOOST_REQUIRE_EQUAL(sts, 0);
86 for(
size_t ii = 0; ii < fragSizeWords; ++ii)
88 BOOST_REQUIRE_EQUAL(*(frag.dataBegin() + ii), *(frag2.dataBegin() + ii));
90 std::cout <<
"SharedMemoryFragmentManager test complete" << std::endl;
93 BOOST_AUTO_TEST_CASE(WholeFragment)
95 std::cout <<
"Initializing SharedMemoryFragmentManagers for WholeFragment Test" << std::endl;
97 uint32_t key = 0x7357 + rand() % 0x10000000;
103 std::cout <<
"Creating test Fragment" << std::endl;
105 frag.setSequenceID(0x10);
106 frag.setFragmentID(0x20);
108 frag.setSystemType(type);
109 frag.setTimestamp(0x30);
110 for (
size_t ii = 0; ii < fragSizeWords; ++ii)
112 *(frag.dataBegin() + ii) = ii;
115 std::cout <<
"Writing Test Fragment to Shared Memory" << std::endl;
116 man.WriteFragment(std::move(frag),
false);
118 std::cout <<
"Reading Test Fragment Header" << std::endl;
120 auto sts = man2.ReadFragment(recvdFrag);
122 std::cout <<
"Checking Test Fragment Header Contents" << std::endl;
123 BOOST_REQUIRE_EQUAL(sts, 0);
124 BOOST_REQUIRE_EQUAL(recvdFrag.
size(), frag.size());
125 BOOST_REQUIRE_EQUAL(recvdFrag.
sequenceID(), 0x10);
126 BOOST_REQUIRE_EQUAL(recvdFrag.
fragmentID(), 0x20);
127 BOOST_REQUIRE_EQUAL(recvdFrag.
type(), type);
128 BOOST_REQUIRE_EQUAL(recvdFrag.
timestamp(), 0x30);
130 std::cout <<
"Checking Test Fragment Data Contents" << std::endl;
131 for (
size_t ii = 0; ii < fragSizeWords; ++ii)
134 BOOST_REQUIRE_EQUAL(*(frag.dataBegin() + ii), *(recvdFrag.
dataBegin() + ii));
136 std::cout <<
"SharedMemoryFragmentManager test complete" << std::endl;
139 BOOST_AUTO_TEST_SUITE_END()
std::size_t size() const
Gets the size of the Fragment, from the Fragment header.
The SharedMemoryFragmentManager is a SharedMemoryManager that deals with Fragment transfers using a S...
sequence_id_t sequenceID() const
Sequence ID of the Fragment, from the Fragment header.
timestamp_t timestamp() const
Timestamp of the Fragment, from the Fragment header.
static constexpr type_t DataFragmentType
Copy DataFragmentType from RawFragmentHeader.
iterator dataBegin()
Return an iterator to the beginning of the data payload (after header and metadata) ...
type_t type() const
Type of the Fragment, from the Fragment header.
void configureMessageFacility(char const *progname, bool useConsole=true, bool printDebug=false)
Configure and start the message facility. Provide the program name so that messages will be appropria...
detail::RawFragmentHeader::RawDataType RawDataType
The RawDataType (currently a 64-bit integer) is the basic unit of data representation within artdaq ...
A Fragment contains the data from one piece of the DAQ system for one event The artdaq::Fragment is t...
fragment_id_t fragmentID() const
Fragment ID of the Fragment, from the Fragment header.