Project
Loading...
Searching...
No Matches
parser.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
16
17#define BOOST_TEST_MODULE Test Algorithm Parser
18#define BOOST_TEST_MAIN
19#define BOOST_TEST_DYN_LINK
20#include <boost/test/unit_test.hpp>
21#include <iostream>
22#include <iomanip>
23#include <vector>
24#include "../include/Algorithm/Parser.h"
26
27// header test class
28struct Header {
29 unsigned identifier = 0xdeadbeef;
30 size_t payloadSize = 0;
31
32 Header(size_t ps) : payloadSize(ps) {}
33};
34
35// trailer test class
36struct Trailer {
37 unsigned identifier = 0xaaffee00;
38 unsigned char flags = 0xaa;
39
40 Trailer(unsigned char f) : flags(f) {}
41};
42
43// trailer test class including payload size
45 unsigned identifier = 0xaaffee00;
46 unsigned char flags = 0xaa;
47 size_t payloadSize = 0;
48
49 SizedTrailer(size_t s, unsigned char f) : flags(f), payloadSize(s) {}
50};
51
52BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_trailer)
53{
55 // note: the length of the data is set in the header word
57 TestFrame tf(FrameT(16, "lotsofsillydata", 0xaa),
58 FrameT(5, "test", 0xcc),
59 FrameT(10, "dummydata", 0x33));
60
61 using ParserT = o2::algorithm::ForwardParser<typename FrameT::HeaderType,
62 typename FrameT::TrailerType>;
63
64 auto checkHeader = [](const typename FrameT::HeaderType& header) {
65 return header.identifier == 0xdeadbeef;
66 };
67 auto checkTrailer = [](const typename FrameT::TrailerType& trailer) {
68 return trailer.identifier == 0xaaffee00;
69 };
70 auto getFrameSize = [](const typename ParserT::HeaderType& header) {
71 // frame size includes total offset from header and trailer
72 return header.payloadSize + ParserT::totalOffset;
73 };
74
75 std::vector<typename ParserT::FrameInfo> frames;
76 auto insert = [&frames](typename ParserT::FrameInfo& info) {
77 frames.emplace_back(info);
78 return true;
79 };
80
81 ParserT parser;
82 auto result = parser.parse(tf.buffer.get(), tf.size(),
83 checkHeader,
84 checkTrailer,
85 getFrameSize,
86 insert);
87
88 BOOST_REQUIRE(result == 3);
89 BOOST_REQUIRE(frames.size() == 3);
90
91 BOOST_CHECK(memcmp(frames[0].payload, "lotsofsillydata", frames[0].length) == 0);
92 BOOST_CHECK(memcmp(frames[1].payload, "test", frames[1].length) == 0);
93 BOOST_CHECK(memcmp(frames[2].payload, "dummydata", frames[2].length) == 0);
94}
95
96BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_void_trailer)
97{
99 // note: the length of the data is set in the header word
101 TestFrame tf(FrameT(16, "lotsofsillydata"),
102 FrameT(5, "test"),
103 FrameT(10, "dummydata"));
104
105 using ParserT = o2::algorithm::ForwardParser<typename FrameT::HeaderType,
106 typename FrameT::TrailerType>;
107
108 auto checkHeader = [](const typename FrameT::HeaderType& header) {
109 return header.identifier == 0xdeadbeef;
110 };
111
112 auto getFrameSize = [](const typename ParserT::HeaderType& header) {
113 // frame size includes total offset from header and trailer
114 return header.payloadSize + ParserT::totalOffset;
115 };
116
117 std::vector<typename ParserT::FrameInfo> frames;
118 auto insert = [&frames](typename ParserT::FrameInfo& info) {
119 frames.emplace_back(info);
120 return true;
121 };
122
123 ParserT parser;
124 auto result = parser.parse(tf.buffer.get(), tf.size(),
125 checkHeader,
126 getFrameSize,
127 insert);
128
129 BOOST_REQUIRE(result == 3);
130 BOOST_REQUIRE(frames.size() == 3);
131
132 BOOST_CHECK(memcmp(frames[0].payload, "lotsofsillydata", frames[0].length) == 0);
133 BOOST_CHECK(memcmp(frames[1].payload, "test", frames[1].length) == 0);
134 BOOST_CHECK(memcmp(frames[2].payload, "dummydata", frames[2].length) == 0);
135}
136
137BOOST_AUTO_TEST_CASE(test_forwardparser_no_frames)
138{
140 // note: the length of the data is set in the header word
142 TestFrame tf(FrameT(16, "lotsofsillydata"),
143 FrameT(5, "test"),
144 FrameT(10, "dummydata"));
145
146 using ParserT = o2::algorithm::ForwardParser<typename FrameT::HeaderType,
147 typename FrameT::TrailerType>;
148
149 auto checkHeader = [](const typename FrameT::HeaderType& header) {
150 // simply indicate invalid header to read no frames
151 return false;
152 };
153
154 auto getFrameSize = [](const typename ParserT::HeaderType& header) {
155 // frame size includes total offset from header and trailer
156 return header.payloadSize + ParserT::totalOffset;
157 };
158
159 std::vector<typename ParserT::FrameInfo> frames;
160 auto insert = [&frames](typename ParserT::FrameInfo& info) {
161 frames.emplace_back(info);
162 return true;
163 };
164
165 ParserT parser;
166 auto result = parser.parse(tf.buffer.get(), tf.size(),
167 checkHeader,
168 getFrameSize,
169 insert);
170
171 // check that there are really no frames found
172 BOOST_REQUIRE(result == 0);
173}
174
175BOOST_AUTO_TEST_CASE(test_forwardparser_format_error)
176{
178 // note: the length of the data is set in the header word
180 TestFrame tf(FrameT(16, "lotsofsillydata"),
181 FrameT(4, "test"), // <- note wrong size
182 FrameT(10, "dummydata"));
183
184 using ParserT = o2::algorithm::ForwardParser<typename FrameT::HeaderType,
185 typename FrameT::TrailerType>;
186
187 auto checkHeader = [](const typename FrameT::HeaderType& header) {
188 return header.identifier == 0xdeadbeef;
189 };
190
191 auto getFrameSize = [](const typename ParserT::HeaderType& header) {
192 // frame size includes total offset from header and trailer
193 return header.payloadSize + ParserT::totalOffset;
194 };
195
196 std::vector<typename ParserT::FrameInfo> frames;
197 auto insert = [&frames](typename ParserT::FrameInfo& info) {
198 frames.emplace_back(info);
199 return true;
200 };
201
202 ParserT parser;
203 auto result = parser.parse(tf.buffer.get(), tf.size(),
204 checkHeader,
205 getFrameSize,
206 insert);
207
208 BOOST_REQUIRE(result == -1);
209}
210
211BOOST_AUTO_TEST_CASE(test_reverseparser)
212{
214 // note: the length of the data is set in the trailer word
216 TestFrame tf(FrameT(0, "lotsofsillydata", {16, 0xaa}),
217 FrameT(0, "test", {5, 0xcc}),
218 FrameT(0, "dummydata", {10, 0x33}));
219
220 using ParserT = o2::algorithm::ReverseParser<typename FrameT::HeaderType,
221 typename FrameT::TrailerType>;
222
223 auto checkHeader = [](const typename FrameT::HeaderType& header) {
224 return header.identifier == 0xdeadbeef;
225 };
226 auto checkTrailer = [](const typename FrameT::TrailerType& trailer) {
227 return trailer.identifier == 0xaaffee00;
228 };
229 auto getFrameSize = [](const typename ParserT::TrailerType& trailer) {
230 return trailer.payloadSize + ParserT::totalOffset;
231 };
232
233 std::vector<typename ParserT::FrameInfo> frames;
234 auto insert = [&frames](const typename ParserT::FrameInfo& info) {
235 frames.emplace_back(info);
236 return true;
237 };
238
239 ParserT parser;
240 auto result = parser.parse(tf.buffer.get(), tf.size(),
241 checkHeader,
242 checkTrailer,
243 getFrameSize,
244 insert);
245
246 BOOST_REQUIRE(result == 3);
247 BOOST_REQUIRE(frames.size() == 3);
248
249 BOOST_CHECK(memcmp(frames[2].payload, "lotsofsillydata", frames[2].length) == 0);
250 BOOST_CHECK(memcmp(frames[1].payload, "test", frames[1].length) == 0);
251 BOOST_CHECK(memcmp(frames[0].payload, "dummydata", frames[0].length) == 0);
252}
An allocator for static sequences of object types.
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct< TrailerType > checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
Definition Parser.h:154
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
Definition Parser.h:335
GLuint64EXT * result
Definition glcorearb.h:5662
GLdouble f
Definition glcorearb.h:310
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLbitfield flags
Definition glcorearb.h:1570
BOOST_AUTO_TEST_CASE(test_forwardparser_header_and_trailer)
Definition parser.cxx:52
std::unique_ptr< GPUReconstructionTimeframe > tf
unsigned identifier
Definition parser.cxx:29
Header(size_t ps)
Definition parser.cxx:32
size_t payloadSize
Definition parser.cxx:30
SizedTrailer(size_t s, unsigned char f)
Definition parser.cxx:49
unsigned identifier
Definition parser.cxx:45
size_t payloadSize
Definition parser.cxx:47
unsigned identifier
Definition parser.cxx:37
Trailer(unsigned char f)
Definition parser.cxx:40
BOOST_CHECK(tree)