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_error_bit(TriggerRecordErrorBits::kMismatch, true);
59 1 : header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
60 :
61 2 : BOOST_REQUIRE_THROW(header->at(header->get_header().num_requested_components), std::range_error);
62 2 : BOOST_REQUIRE_THROW((*header)[header->get_header().num_requested_components], std::range_error);
63 :
64 1 : void* buff = malloc(header->get_total_size_bytes());
65 1 : memcpy(buff, header->get_storage_location(), header->get_total_size_bytes());
66 :
67 : // Constructor should copy header
68 1 : TriggerRecordHeader copy_header(const_cast<void*>(header->get_storage_location()), true);
69 1 : delete header; // NOLINT(build/raw_ownership)
70 :
71 1 : BOOST_REQUIRE_EQUAL(copy_header.get_run_number(), 9);
72 1 : BOOST_REQUIRE_EQUAL(copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
73 1 : BOOST_REQUIRE_EQUAL(copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
74 1 : BOOST_REQUIRE_EQUAL(copy_header.get_header().error_bits, 10);
75 1 : BOOST_REQUIRE_EQUAL(copy_header.at(0).window_begin, 3);
76 1 : BOOST_REQUIRE_EQUAL(copy_header[1].window_begin, 7);
77 :
78 1 : {
79 : // Test copy constructor
80 1 : TriggerRecordHeader copy_copy_header(copy_header);
81 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_run_number(), 9);
82 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
83 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
84 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.get_header().error_bits, 10);
85 1 : BOOST_REQUIRE_EQUAL(copy_copy_header.at(0).window_begin, 3);
86 1 : BOOST_REQUIRE_EQUAL(copy_copy_header[1].window_begin, 7);
87 1 : }
88 1 : {
89 : // Test copy assignment
90 1 : TriggerRecordHeader copy_assign_header = copy_header;
91 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_run_number(), 9);
92 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
93 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
94 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.get_header().error_bits, 10);
95 1 : BOOST_REQUIRE_EQUAL(copy_assign_header.at(0).window_begin, 3);
96 1 : BOOST_REQUIRE_EQUAL(copy_assign_header[1].window_begin, 7);
97 1 : }
98 :
99 1 : {
100 : // Test Buffer adoption constructor
101 1 : TriggerRecordHeader buffer_header(buff, false);
102 :
103 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_run_number(), 9);
104 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
105 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
106 1 : BOOST_REQUIRE_EQUAL(buffer_header.get_header().error_bits, 10);
107 1 : BOOST_REQUIRE_EQUAL(buffer_header.at(0).window_begin, 3);
108 1 : BOOST_REQUIRE_EQUAL(buffer_header[1].window_begin, 7);
109 1 : }
110 :
111 1 : BOOST_REQUIRE_EQUAL(*reinterpret_cast<uint32_t*>(buff), // NOLINT
112 : TriggerRecordHeaderData::s_trigger_record_header_magic);
113 :
114 1 : free(buff);
115 1 : }
116 :
117 : /**
118 : * @brief Test header field manipulation methods
119 : */
120 2 : BOOST_AUTO_TEST_CASE(HeaderFields)
121 : {
122 1 : std::vector<ComponentRequest> components;
123 1 : components.emplace_back();
124 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
125 1 : components.back().component.id = 2;
126 1 : components.back().window_begin = 3;
127 1 : components.back().window_end = 4;
128 1 : components.emplace_back();
129 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
130 1 : components.back().component.id = 6;
131 1 : components.back().window_begin = 7;
132 1 : components.back().window_end = 8;
133 :
134 1 : auto header = new TriggerRecordHeader(components);
135 1 : header->set_run_number(9);
136 1 : header->set_trigger_number(10);
137 1 : header->set_trigger_timestamp(11);
138 1 : header->set_trigger_type(12);
139 1 : header->set_error_bit(TriggerRecordErrorBits::kMismatch, true);
140 1 : header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
141 :
142 1 : auto header_data = header->get_header();
143 1 : BOOST_REQUIRE_EQUAL(header->get_run_number(), header_data.run_number);
144 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_number(), header_data.trigger_number);
145 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_timestamp(), header_data.trigger_timestamp);
146 1 : BOOST_REQUIRE_EQUAL(header->get_trigger_type(), header_data.trigger_type);
147 1 : BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), 2);
148 1 : BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), header_data.num_requested_components);
149 :
150 1 : auto header_ptr = static_cast<const TriggerRecordHeaderData*>(header->get_storage_location());
151 1 : BOOST_REQUIRE_EQUAL(header_ptr->run_number, header_data.run_number);
152 1 : header->set_run_number(10);
153 1 : BOOST_REQUIRE(header_ptr->run_number != header_data.run_number);
154 1 : BOOST_REQUIRE_EQUAL(header_ptr->run_number, 10);
155 1 : }
156 :
157 : /**
158 : * @brief Check that TriggerRecordHeader serialization via MsgPack works
159 : */
160 2 : BOOST_AUTO_TEST_CASE(Header_SerDes_MsgPack)
161 : {
162 1 : std::vector<ComponentRequest> components;
163 1 : components.emplace_back();
164 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
165 1 : components.back().component.id = 2;
166 1 : components.back().window_begin = 3;
167 1 : components.back().window_end = 4;
168 1 : components.emplace_back();
169 1 : components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
170 1 : components.back().component.id = 6;
171 1 : components.back().window_begin = 7;
172 1 : components.back().window_end = 8;
173 :
174 1 : auto header = new TriggerRecordHeader(components);
175 1 : header->set_run_number(9);
176 1 : header->set_trigger_number(10);
177 1 : header->set_trigger_timestamp(11);
178 1 : header->set_trigger_type(12);
179 1 : header->set_error_bit(TriggerRecordErrorBits::kMismatch, true);
180 1 : header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
181 :
182 1 : auto bytes = dunedaq::serialization::serialize(*header, dunedaq::serialization::kMsgPack);
183 1 : TriggerRecordHeader& header_orig = *header;
184 1 : TriggerRecordHeader header_deserialized = dunedaq::serialization::deserialize<TriggerRecordHeader>(bytes);
185 :
186 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_number(), header_deserialized.get_trigger_number());
187 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_timestamp(), header_deserialized.get_trigger_timestamp());
188 1 : BOOST_REQUIRE_EQUAL(header_orig.get_num_requested_components(), header_deserialized.get_num_requested_components());
189 1 : BOOST_REQUIRE_EQUAL(header_orig.get_run_number(), header_deserialized.get_run_number());
190 1 : BOOST_REQUIRE_EQUAL(header_orig.get_error_bits(), header_deserialized.get_error_bits());
191 1 : BOOST_REQUIRE_EQUAL(header_orig.get_trigger_type(), header_deserialized.get_trigger_type());
192 1 : BOOST_REQUIRE_EQUAL(header_orig.get_total_size_bytes(), header_deserialized.get_total_size_bytes());
193 1 : BOOST_REQUIRE_EQUAL(header_orig.at(0).window_begin, header_deserialized.at(0).window_begin);
194 1 : BOOST_REQUIRE_EQUAL(header_orig.at(1).window_begin, header_deserialized.at(1).window_begin);
195 1 : }
196 :
197 : BOOST_AUTO_TEST_SUITE_END()
|