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