Project
Loading...
Searching...
No Matches
testSampaHeader.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#define BOOST_TEST_MODULE Test MCHRaw SampaHeader
16#define BOOST_TEST_MAIN
17#define BOOST_TEST_DYN_LINK
18
19#include <boost/test/unit_test.hpp>
21
22using namespace o2::mch::raw;
23
24uint64_t allones = 0x3FFFFFFFFFFFF;
25uint64_t allbutbx = 0x200001FFFFFFF;
26uint64_t allbut10bits = 0x3FFFFFFF003FF;
27
28BOOST_AUTO_TEST_SUITE(o2_mch_raw)
29
30BOOST_AUTO_TEST_SUITE(sampaheader)
31
32BOOST_AUTO_TEST_CASE(SampaHeaderCtorBunchCrossingCounter)
33{
34 SampaHeader expected(static_cast<uint8_t>(0x3F),
35 true,
36 SampaPacketType::DataTriggerTooEarlyNumWords,
37 static_cast<uint16_t>(0x3FF),
38 static_cast<uint16_t>(0xF),
39 static_cast<uint16_t>(0x1F),
40 static_cast<uint32_t>(0),
41 true);
43}
44
45BOOST_AUTO_TEST_CASE(SampaHeaderCtorNof10BitsWords)
46{
47 SampaHeader expected(static_cast<uint8_t>(0x3F),
48 true,
49 SampaPacketType::DataTriggerTooEarlyNumWords,
50 static_cast<uint16_t>(0),
51 static_cast<uint16_t>(0xF),
52 static_cast<uint16_t>(0x1F),
53 static_cast<uint32_t>(0xFFFFF),
54 true);
56}
57
58BOOST_AUTO_TEST_CASE(SampaHeaderEqualityOperators)
59{
60 // comparison is full comparison (i.e. equality of 50bits)
61
63
65
66 SampaHeader h2(UINT64_C(0x1fffff5f0007f));
67
68 BOOST_CHECK(h2 != sampaSync());
69}
70
71BOOST_AUTO_TEST_CASE(SampaHeaderSetHamming)
72{
73 SampaHeader sh;
74
75 sh.hammingCode(0x3F);
77}
78
79BOOST_AUTO_TEST_CASE(SampaHeaderSetHeaderParity)
80{
81 SampaHeader sh;
82
83 sh.headerParity(true);
85}
86
87BOOST_AUTO_TEST_CASE(SampaHeaderSetPacketType)
88{
89 SampaHeader sh;
90
91 sh.packetType(SampaPacketType::DataTriggerTooEarlyNumWords);
92 BOOST_CHECK(sh.packetType() == SampaPacketType::DataTriggerTooEarlyNumWords);
93}
94
95BOOST_AUTO_TEST_CASE(SampaHeaderSetNumberOf10BitsWords)
96{
97 SampaHeader sh;
98
99 sh.nof10BitWords(0x3FF);
100 BOOST_CHECK_EQUAL(sh.nof10BitWords(), 0x3FF);
101 sh.nof10BitWords(0);
103}
104
105BOOST_AUTO_TEST_CASE(SampaHeaderSetChipAddress)
106{
107 SampaHeader sh;
108
109 sh.chipAddress(0xF);
111 sh.chipAddress(0);
113 sh.chipAddress(1);
115}
116
117BOOST_AUTO_TEST_CASE(SampaHeaderSetChannelAddress)
118{
119 SampaHeader sh;
120
121 sh.channelAddress(0x1F);
123}
124
125BOOST_AUTO_TEST_CASE(SampaHeaderSetBunchCrossingCounter)
126{
127 SampaHeader sh;
128
129 sh.bunchCrossingCounter(0xFFFFF);
131}
132
133BOOST_AUTO_TEST_CASE(SampaHeaderSetPayloadParity)
134{
135 SampaHeader sh;
136
137 sh.payloadParity(true);
139}
140
141BOOST_AUTO_TEST_CASE(SampaHeaderLessThanOperatorComparesBx)
142{
143 SampaHeader h1;
144 SampaHeader h2;
145
148
149 SampaHeader h10{h1};
150
151 BOOST_CHECK(h1 == h10);
152
153 BOOST_CHECK_EQUAL(h1 > h2, false);
154 BOOST_CHECK_EQUAL(h1 < h2, true);
155 BOOST_CHECK_EQUAL(h1 <= h10, true);
156 BOOST_CHECK_EQUAL(h1 >= h10, true);
157}
158
159BOOST_AUTO_TEST_CASE(SampaHeaderCtorWithMoreThan50BitsShouldThrow)
160{
161 BOOST_CHECK_THROW(SampaHeader(static_cast<uint64_t>(1) << 50), std::invalid_argument);
162}
163
164BOOST_AUTO_TEST_CASE(SampaHeaderCtorWithInvalidBitsIsNotAHeartbeat)
165{
166 uint64_t h = 0x3FFFFEAFFFFFF; // completely invalid value to start with
167 uint64_t one = 1;
168
169 // - bits 7-9 must be zero
170 // - bits 10-19 must be zero
171 // - bits 24,26,28 must be one
172 // - bits 25,27 must be zero
173 // - bit 49 must be zero
174
175 std::vector<int> zeros = {7, 8, 9, 24, 26, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 25, 27, 49};
176 std::vector<int> ones = {24, 26, 28};
177
178 BOOST_CHECK_EQUAL(SampaHeader(h).isHeartbeat(), false);
179 for (auto ix : zeros) {
180 h &= ~(one << ix);
181 BOOST_CHECK_EQUAL(SampaHeader(h).isHeartbeat(), false);
182 }
183 for (auto ix : ones) {
184 h |= (one << ix);
185 }
186 BOOST_CHECK_EQUAL(SampaHeader(h).isHeartbeat(), true);
187}
188
189BOOST_AUTO_TEST_CASE(CheckSampaSyncIsExpectedValue)
190{
191 SampaHeader h(0x1555540f00113);
192 BOOST_CHECK(sampaSync() == h);
193}
194
195BOOST_AUTO_TEST_CASE(SetChannelAddressTwice)
196{
198
199 h.packetType(SampaPacketType::Data);
200 h.channelAddress(1);
201 BOOST_CHECK_EQUAL(h.channelAddress(), 1);
202 h.channelAddress(31);
203 BOOST_CHECK_EQUAL(h.channelAddress(), 31);
204 h.channelAddress(5);
205 BOOST_CHECK_EQUAL(h.channelAddress(), 5);
206}
207
208BOOST_AUTO_TEST_CASE(ComputeHammingCode)
209{
210 BOOST_CHECK_EQUAL(computeHammingCode(0x3722e80103208), 0x8); // 000100 P0
211 BOOST_CHECK_EQUAL(computeHammingCode(0x1722e9f00327d), 0x3D); // 101101 P1
212 BOOST_CHECK_EQUAL(computeHammingCode(0x1722e8090322f), 0x2F); // 111101 P0
213}
214
215BOOST_AUTO_TEST_CASE(ComputeHammingCode2)
216{
217 BOOST_CHECK_EQUAL(computeHammingCode2(0x3722e80103208), 0x8); // 000100 P0
218 BOOST_CHECK_EQUAL(computeHammingCode2(0x1722e9f00327d), 0x3D); // 101101 P1
219 BOOST_CHECK_EQUAL(computeHammingCode2(0x1722e8090322f), 0x2F); // 111101 P0
220}
221
222BOOST_AUTO_TEST_CASE(ComputeHammingCode3)
223{
224 BOOST_CHECK_EQUAL(computeHammingCode3(0x3722e80103208), 0x8); // 000100 P0
225 BOOST_CHECK_EQUAL(computeHammingCode3(0x1722e9f00327d), 0x3D); // 101101 P1
226 BOOST_CHECK_EQUAL(computeHammingCode3(0x1722e8090322f), 0x2F); // 111101 P0
227}
228
229BOOST_AUTO_TEST_CASE(ComputeHammingCode4)
230{
231 BOOST_CHECK_EQUAL(computeHammingCode4(0x3722e80103208), 0x8); // 000100 P0
232 BOOST_CHECK_EQUAL(computeHammingCode4(0x1722e9f00327d), 0x3D); // 101101 P1
233 BOOST_CHECK_EQUAL(computeHammingCode4(0x1722e8090322f), 0x2F); // 111101 P0
234}
235
236BOOST_AUTO_TEST_CASE(CheckHammingCodeError)
237{
238 uint64_t v = 0x1722e9f00327d;
239 int expected = 0x3D;
240
241 auto ref = computeHammingCode(v);
243
244 const uint64_t one{1};
245 // flip a data bit
246 v ^= (one << 34);
247 auto h = computeHammingCode(v);
248 BOOST_CHECK_NE(ref, h);
249}
250
251BOOST_AUTO_TEST_CASE(CheckHeaderParity)
252{
253 BOOST_CHECK_EQUAL(computeHeaderParity(0x3722e80103208), 0); // 000100 P0
254 BOOST_CHECK_EQUAL(computeHeaderParity(0x1722e8090322f), 0); // 111101 P0
255 BOOST_CHECK_EQUAL(computeHeaderParity(0x1722e9f00327d), 1); // 101101 P1
256}
257
258BOOST_AUTO_TEST_CASE(CheckHeaderParity2)
259{
260 BOOST_CHECK_EQUAL(computeHeaderParity2(0x3722e80103208), 0); // 000100 P0
261 BOOST_CHECK_EQUAL(computeHeaderParity2(0x1722e8090322f), 0); // 111101 P0
262 BOOST_CHECK_EQUAL(computeHeaderParity2(0x1722e9f00327d), 1); // 101101 P1
263}
264
265BOOST_AUTO_TEST_CASE(CheckHeaderParity3)
266{
267 BOOST_CHECK_EQUAL(computeHeaderParity3(0x3722e80103208), 0); // 000100 P0
268 BOOST_CHECK_EQUAL(computeHeaderParity3(0x1722e8090322f), 0); // 111101 P0
269 BOOST_CHECK_EQUAL(computeHeaderParity3(0x1722e9f00327d), 1); // 101101 P1
270}
271
272BOOST_AUTO_TEST_CASE(CheckHeaderParity4)
273{
274 BOOST_CHECK_EQUAL(computeHeaderParity4(0x3722e80103208), 0); // 000100 P0
275 BOOST_CHECK_EQUAL(computeHeaderParity4(0x1722e8090322f), 0); // 111101 P0
276 BOOST_CHECK_EQUAL(computeHeaderParity4(0x1722e9f00327d), 1); // 101101 P1
277}
278
279BOOST_AUTO_TEST_CASE(CreateHearbeat)
280{
282 BOOST_CHECK_EQUAL(h.isHeartbeat(), true);
283 h = sampaHeartbeat(39, 12345);
284 BOOST_CHECK_EQUAL(h.isHeartbeat(), true);
285}
286BOOST_AUTO_TEST_SUITE_END()
287BOOST_AUTO_TEST_SUITE_END()
uint32_t one
Definition RawData.h:4
Class for time synchronization of RawReader instances.
SampaHeader is the 50-bits header word used in Sampa data transmission protocol.
Definition SampaHeader.h:51
SampaChannelAddress channelAddress() const
uint16_t nof10BitWords() const
uint8_t chipAddress() const
uint32_t bunchCrossingCounter() const
SampaPacketType packetType() const
uint8_t hammingCode() const
const GLdouble * v
Definition glcorearb.h:832
int computeHeaderParity(uint64_t value)
int computeHammingCode3(uint64_t value)
SampaHeader sampaHeartbeat(uint8_t elinkId, uint20_t bunchCrossing)
Heartbeat packet.
SampaHeader sampaSync()
The 50-bits Sampa SYNC word.
int computeHammingCode2(uint64_t value)
int computeHeaderParity4(uint64_t value)
int computeHeaderParity2(uint64_t value)
int computeHeaderParity3(uint64_t value)
int computeHammingCode4(uint64_t value)
int computeHammingCode(uint64_t value)
BOOST_AUTO_TEST_CASE(FlatHisto)
std::map< std::string, ID > expected
uint64_t allbutbx
uint64_t allbut10bits
uint64_t allones
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())