00001 #include "artdaq-core/Core/SharedMemoryFragmentManager.hh"
00002 #include "artdaq-core/Utilities/configureMessageFacility.hh"
00003 #include "tracemf.h"
00004
00005 #define BOOST_TEST_MODULE(SharedMemoryFragmentManager_t)
00006 #include "cetlib/quiet_unit_test.hpp"
00007 #include "cetlib_except/exception.h"
00008
00009
00010 BOOST_AUTO_TEST_SUITE(SharedMemoryFragmentManager_test)
00011
00012 BOOST_AUTO_TEST_CASE(Construct)
00013 {
00014 artdaq::configureMessageFacility("SharedMemoryFragmentManager_t", true, true);
00015 TLOG_DEBUG("SharedMemoryManager_t") << "BEGIN TEST Construct" << TLOG_ENDL;
00016 srand(time(0));
00017 artdaq::SharedMemoryFragmentManager man(0x7357 + rand() % 0x10000000, 10, 0x1000);
00018 BOOST_REQUIRE_EQUAL(man.IsValid(), true);
00019 BOOST_REQUIRE_EQUAL(man.GetMyId(), 0);
00020 BOOST_REQUIRE_EQUAL(man.size(), 10);
00021 BOOST_REQUIRE_EQUAL(man.GetAttachedCount(), 0);
00022 }
00023
00024 BOOST_AUTO_TEST_CASE(Attach)
00025 {
00026 srand(time(0));
00027 uint32_t key = 0x7357 + rand() % 0x10000000;
00028 artdaq::SharedMemoryFragmentManager man(key, 10, 0x1000);
00029 artdaq::SharedMemoryFragmentManager man2(key, 10, 0x1000);
00030
00031 BOOST_REQUIRE_EQUAL(man.IsValid(), true);
00032 BOOST_REQUIRE_EQUAL(man.GetMyId(), 0);
00033 BOOST_REQUIRE_EQUAL(man.size(), 10);
00034 BOOST_REQUIRE_EQUAL(man.GetAttachedCount(), 1);
00035
00036 BOOST_REQUIRE_EQUAL(man2.IsValid(), true);
00037 BOOST_REQUIRE_EQUAL(man2.GetMyId(), 1);
00038 BOOST_REQUIRE_EQUAL(man2.size(), 10);
00039 BOOST_REQUIRE_EQUAL(man2.GetAttachedCount(), 1);
00040
00041 }
00042
00043 BOOST_AUTO_TEST_CASE(DataFlow)
00044 {
00045 srand(time(0));
00046 std::cout << "Initializing SharedMemoryFragmentManagers for DataFlow test" << std::endl;
00047 uint32_t key = 0x7357 + rand() % 0x10000000;
00048 artdaq::SharedMemoryFragmentManager man(key, 10, 0x1000);
00049 artdaq::SharedMemoryFragmentManager man2(key, 10, 0x1000);
00050
00051 auto fragSizeWords = 0x1000 / sizeof(artdaq::RawDataType) - artdaq::detail::RawFragmentHeader::num_words() - 1;
00052
00053 std::cout << "Creating test Fragment" << std::endl;
00054 artdaq::Fragment frag(fragSizeWords);
00055 frag.setSequenceID(0x10);
00056 frag.setFragmentID(0x20);
00057 auto type = artdaq::Fragment::DataFragmentType;
00058 frag.setSystemType(type);
00059 frag.setTimestamp(0x30);
00060 for (size_t ii = 0; ii < fragSizeWords; ++ii)
00061 {
00062 *(frag.dataBegin() + ii) = ii;
00063 }
00064
00065 std::cout << "Writing Test Fragment to Shared Memory" << std::endl;
00066 man.WriteFragment(std::move(frag), false);
00067
00068 std::cout << "Reading Test Fragment Header" << std::endl;
00069 artdaq::detail::RawFragmentHeader header;
00070 auto sts = man2.ReadFragmentHeader(header);
00071
00072 std::cout << "Checking Test Fragment Header Contents" << std::endl;
00073 BOOST_REQUIRE_EQUAL(sts, 0);
00074 BOOST_REQUIRE_EQUAL(header.word_count, frag.size());
00075 BOOST_REQUIRE_EQUAL(header.sequence_id, 0x10);
00076 BOOST_REQUIRE_EQUAL(header.fragment_id, 0x20);
00077 BOOST_REQUIRE_EQUAL(header.type, type);
00078 BOOST_REQUIRE_EQUAL(header.timestamp, 0x30);
00079
00080 std::cout << "Reading Test Fragment data" << std::endl;
00081 artdaq::Fragment frag2(header.word_count);
00082 sts = man2.ReadFragmentData(frag2.dataBegin(), header.word_count - header.num_words());
00083
00084 std::cout << "Checking Test Fragment contents" << std::endl;
00085 BOOST_REQUIRE_EQUAL(sts, 0);
00086 for(size_t ii = 0; ii < fragSizeWords; ++ii)
00087 {
00088 BOOST_REQUIRE_EQUAL(*(frag.dataBegin() + ii), *(frag2.dataBegin() + ii));
00089 }
00090 std::cout << "SharedMemoryFragmentManager test complete" << std::endl;
00091 }
00092
00093 BOOST_AUTO_TEST_CASE(WholeFragment)
00094 {
00095 std::cout << "Initializing SharedMemoryFragmentManagers for WholeFragment Test" << std::endl;
00096 srand(time(0));
00097 uint32_t key = 0x7357 + rand() % 0x10000000;
00098 artdaq::SharedMemoryFragmentManager man(key, 10, 0x1000);
00099 artdaq::SharedMemoryFragmentManager man2(key, 10, 0x1000);
00100
00101 auto fragSizeWords = 0x1000 / sizeof(artdaq::RawDataType) - artdaq::detail::RawFragmentHeader::num_words() - 1;
00102
00103 std::cout << "Creating test Fragment" << std::endl;
00104 artdaq::Fragment frag(fragSizeWords);
00105 frag.setSequenceID(0x10);
00106 frag.setFragmentID(0x20);
00107 auto type = artdaq::Fragment::DataFragmentType;
00108 frag.setSystemType(type);
00109 frag.setTimestamp(0x30);
00110 for (size_t ii = 0; ii < fragSizeWords; ++ii)
00111 {
00112 *(frag.dataBegin() + ii) = ii;
00113 }
00114
00115 std::cout << "Writing Test Fragment to Shared Memory" << std::endl;
00116 man.WriteFragment(std::move(frag), false);
00117
00118 std::cout << "Reading Test Fragment Header" << std::endl;
00119 artdaq::Fragment recvdFrag;
00120 auto sts = man2.ReadFragment(recvdFrag);
00121
00122 std::cout << "Checking Test Fragment Header Contents" << std::endl;
00123 BOOST_REQUIRE_EQUAL(sts, 0);
00124 BOOST_REQUIRE_EQUAL(recvdFrag.size(), frag.size());
00125 BOOST_REQUIRE_EQUAL(recvdFrag.sequenceID(), 0x10);
00126 BOOST_REQUIRE_EQUAL(recvdFrag.fragmentID(), 0x20);
00127 BOOST_REQUIRE_EQUAL(recvdFrag.type(), type);
00128 BOOST_REQUIRE_EQUAL(recvdFrag.timestamp(), 0x30);
00129
00130 std::cout << "Checking Test Fragment Data Contents" << std::endl;
00131 for (size_t ii = 0; ii < fragSizeWords; ++ii)
00132 {
00133
00134 BOOST_REQUIRE_EQUAL(*(frag.dataBegin() + ii), *(recvdFrag.dataBegin() + ii));
00135 }
00136 std::cout << "SharedMemoryFragmentManager test complete" << std::endl;
00137 }
00138
00139 BOOST_AUTO_TEST_SUITE_END()