Line data Source code
1 : /**
2 : * @file TriggerRecordHeader_test.cxx TriggerRecordHeader class Unit Tests
3 : *
4 : * This is part of the DUNE DAQ Application Framework, copyright 2020.
5 : * Licensing/copyright details are in the COPYING file that you should have
6 : * received with this code.
7 : */
8 :
9 : #include "dfmessages/TriggerRecordHeader_serialization.hpp"
10 :
11 : /**
12 : * @brief Name of this test module
13 : */
14 : #define BOOST_TEST_MODULE TriggerRecordHeader_test // NOLINT
15 :
16 : #include "boost/test/unit_test.hpp"
17 :
18 : #include <string>
19 : #include <vector>
20 :
21 : using namespace dunedaq::daqdataformats;
22 :
23 : BOOST_AUTO_TEST_SUITE(TriggerRecordHeader_test)
24 :
25 : /**
26 : * @brief Check that TriggerRecords have appropriate Copy/Move semantics
27 : */
28 2 : BOOST_AUTO_TEST_CASE(CopyAndMoveSemantics)
29 : {
30 1 : BOOST_REQUIRE(std::is_copy_constructible_v<TriggerRecordHeader>);
31 1 : BOOST_REQUIRE(std::is_copy_assignable_v<TriggerRecordHeader>);
32 1 : BOOST_REQUIRE(std::is_move_constructible_v<TriggerRecordHeader>);
33 1 : BOOST_REQUIRE(std::is_move_assignable_v<TriggerRecordHeader>);
34 1 : }
35 :
36 : /**
37 : * @brief Check that TriggerRecordHeader constructors function correctly
38 : */
39 2 : BOOST_AUTO_TEST_CASE(ExistingHeader)
40 : {
41 1 : std::vector<ComponentRequest> components;
42 1 : components.emplace_back();
43 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
44 1 : components.back().component.id = 2;
45 1 : components.back().window_begin = 3;
46 1 : components.back().window_end = 4;
47 1 : components.emplace_back();
48 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
49 1 : components.back().component.id = 6;
50 1 : components.back().window_begin = 7;
51 1 : components.back().window_end = 8;
52 :
53 1 : auto header = new TriggerRecordHeader(components);
54 1 : header->set_run_number(9);
55 1 : header->set_trigger_number(10);
56 1 : header->set_trigger_timestamp(11);
57 1 : header->set_trigger_type(12);
58 1 : header->set_status_bit(TriggerRecordStatusBits::kMismatch, true);
59 1 : header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
60 :
61 1 : BOOST_REQUIRE_THROW(header->at(header->get_header().num_requested_components), std::range_error);
62 :
63 1 : void* buff = malloc(header->get_total_size_bytes());
64 1 : memcpy(buff, header->get_storage_location(), header->get_total_size_bytes());
65 :
66 : // Constructor should copy header
67 1 : TriggerRecordHeader copy_header(const_cast<void*>(header->get_storage_location()), true);
68 1 : delete header; // NOLINT(build/raw_ownership)
69 :
70 1 : BOOST_REQUIRE_EQUAL(copy_header.get_run_number(), 9);
71 1 : BOOST_REQUIRE_EQUAL(copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
72 1 : BOOST_REQUIRE_EQUAL(copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
73 1 : BOOST_REQUIRE_EQUAL(copy_header.get_header().status_bits, 10);
74 1 : BOOST_REQUIRE_EQUAL(copy_header.at(0).window_begin, 3);
75 :
76 1 : {
77 : // Test copy constructor
78 1 : TriggerRecordHeader copy_copy_header(copy_header); // NOLINT // performance-unnecessary-copy-initialization
79 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_run_number(), 9);
80 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
81 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
82 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_header().status_bits, 10);
83 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.at(0).window_begin, 3);
84 1 : }
85 1 : {
86 : // Test copy assignment
87 1 : TriggerRecordHeader copy_assign_header = copy_header; // NOLINT // performance-unnecessary-copy-initialization
88 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_run_number(), 9);
89 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
90 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
91 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_header().status_bits, 10);
92 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.at(0).window_begin, 3);
93 1 : }
94 :
95 1 : {
96 : // Test Buffer adoption constructor
97 1 : TriggerRecordHeader buffer_header(buff, false);
98 :
99 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_run_number(), 9);
100 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
101 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
102 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_header().status_bits, 10);
103 1 : BOOST_REQUIRE_EQUAL(buffer_header.at(0).window_begin, 3);
104 1 : }
105 :
106 1 : BOOST_REQUIRE_EQUAL(*reinterpret_cast<uint32_t*>(buff), // NOLINT
107 : TriggerRecordHeaderData::s_trigger_record_header_magic);
108 :
109 1 : free(buff);
110 1 : }
111 :
112 : /**
113 : * @brief Test header field manipulation methods
114 : */
115 2 : BOOST_AUTO_TEST_CASE(HeaderFields)
116 : {
117 1 : std::vector<ComponentRequest> components;
118 1 : components.emplace_back();
119 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
120 1 : components.back().component.id = 2;
121 1 : components.back().window_begin = 3;
122 1 : components.back().window_end = 4;
123 1 : components.emplace_back();
124 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
125 1 : components.back().component.id = 6;
126 1 : components.back().window_begin = 7;
127 1 : components.back().window_end = 8;
128 :
129 1 : auto header = new TriggerRecordHeader(components);
130 1 : header->set_run_number(9);
131 1 : header->set_trigger_number(10);
132 1 : header->set_trigger_timestamp(11);
133 1 : header->set_trigger_type(12);
134 1 : header->set_status_bit(TriggerRecordStatusBits::kMismatch, true);
135 1 : header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
136 :
137 1 : auto header_data = header->get_header();
138 1 : BOOST_REQUIRE_EQUAL(header->get_run_number(), header_data.run_number);
139 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_number(), header_data.trigger_number);
140 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_timestamp(), header_data.trigger_timestamp);
141 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_type(), header_data.trigger_type);
142 1 : BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), 2);
143 1 : BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), header_data.num_requested_components);
144 :
145 1 : auto header_ptr = static_cast<const TriggerRecordHeaderData*>(header->get_storage_location());
146 1 : BOOST_REQUIRE_EQUAL(header_ptr->run_number, header_data.run_number);
147 1 : header->set_run_number(10);
148 1 : BOOST_REQUIRE(header_ptr->run_number != header_data.run_number);
149 1 : BOOST_REQUIRE_EQUAL(header_ptr->run_number, 10);
150 1 : }
151 :
152 : /**
153 : * @brief Check that TriggerRecordHeader serialization via MsgPack works
154 : */
155 2 : BOOST_AUTO_TEST_CASE(Header_SerDes_MsgPack)
156 : {
157 1 : std::vector<ComponentRequest> components;
158 1 : components.emplace_back();
159 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
160 1 : components.back().component.id = 2;
161 1 : components.back().window_begin = 3;
162 1 : components.back().window_end = 4;
163 1 : components.emplace_back();
164 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
165 1 : components.back().component.id = 6;
166 1 : components.back().window_begin = 7;
167 1 : components.back().window_end = 8;
168 :
169 1 : auto header = new TriggerRecordHeader(components);
170 1 : header->set_run_number(9);
171 1 : header->set_trigger_number(10);
172 1 : header->set_trigger_timestamp(11);
173 1 : header->set_trigger_type(12);
174 1 : header->set_status_bit(TriggerRecordStatusBits::kMismatch, true);
175 1 : header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
176 :
177 1 : auto bytes = dunedaq::serialization::serialize(*header, dunedaq::serialization::kMsgPack);
178 1 : TriggerRecordHeader& header_orig = *header;
179 1 : TriggerRecordHeader header_deserialized = dunedaq::serialization::deserialize<TriggerRecordHeader>(bytes);
180 :
181 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_number(), header_deserialized.get_trigger_number());
182 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_timestamp(), header_deserialized.get_trigger_timestamp());
183 1 : BOOST_REQUIRE_EQUAL(header_orig.get_num_requested_components(), header_deserialized.get_num_requested_components());
184 1 : BOOST_REQUIRE_EQUAL(header_orig.get_run_number(), header_deserialized.get_run_number());
185 1 : BOOST_REQUIRE_EQUAL(header_orig.get_status_bits(), header_deserialized.get_status_bits());
186 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_type(), header_deserialized.get_trigger_type());
187 1 : BOOST_REQUIRE_EQUAL(header_orig.get_total_size_bytes(), header_deserialized.get_total_size_bytes());
188 1 : BOOST_REQUIRE_EQUAL(header_orig.at(0).window_begin, header_deserialized.at(0).window_begin);
189 1 : BOOST_REQUIRE_EQUAL(header_orig.at(1).window_begin, header_deserialized.at(1).window_begin);
190 1 : }
191 :
192 : BOOST_AUTO_TEST_SUITE_END()
|