Project
Loading...
Searching...
No Matches
test_InfrastructureBuilder.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 Utilities MergersInfrastructureBuilder
18#define BOOST_TEST_MAIN
19#define BOOST_TEST_DYN_LINK
20
21#include <boost/test/unit_test.hpp>
22
24
26#include <iostream>
27
28using namespace o2::framework;
29using namespace o2::mergers;
30
31BOOST_AUTO_TEST_CASE(InfrastructureBuilderUnconfigured)
32{
34
35 // unconfigured builder
36 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
37
38 // partially configured builder
39 builder.setInfrastructureName("name");
40 builder.setInputSpecs({{"one", "TST", "test", 1}});
41 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
42
43 builder.setOutputSpec({{"main"}, "TST", "test", 0});
44 builder.setInfrastructureName("");
45 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
46
47 builder.setInfrastructureName("name");
48 builder.setInputSpecs({});
49 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
50
51 // configured builder (no exception)
52 builder.setInputSpecs({{"one", "TST", "test", 1}});
54}
55
56BOOST_AUTO_TEST_CASE(InfrastructureBuilderLayers)
57{
59 builder.setInfrastructureName("name");
60 builder.setInputSpecs({{"one", "TST", "test", 1},
61 {"two", "TST", "test", 2},
62 {"thr", "TST", "test", 3},
63 {"fou", "TST", "test", 4},
64 {"fiv", "TST", "test", 5},
65 {"six", "TST", "test", 6},
66 {"sev", "TST", "test", 7}});
67 builder.setOutputSpec({{"main"}, "TST", "test", 0});
68 MergerConfig config;
69
70 {
71 config.topologySize = {TopologySize::NumberOfLayers, 0};
72 builder.setConfig(config);
73 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
74 }
75
76 {
77 config.topologySize = {TopologySize::NumberOfLayers, 1};
78 builder.setConfig(config);
79 auto mergersTopology = builder.generateInfrastructure();
80
81 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 1);
82 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 8);
83 BOOST_REQUIRE_EQUAL(mergersTopology[0].outputs.size(), 1);
84
85 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[0].outputs[0]);
86 BOOST_CHECK_EQUAL(concrete.origin.str, "TST");
87 BOOST_CHECK_EQUAL(concrete.description.str, "test");
88 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
89
90 BOOST_REQUIRE_EQUAL(mergersTopology[0].labels.size(), 1);
91 BOOST_CHECK_EQUAL(mergersTopology[0].labels[0].value, "merger");
92 }
93
94 {
95 config.topologySize = {TopologySize::NumberOfLayers, 2};
96 builder.setConfig(config);
97 auto mergersTopology = builder.generateInfrastructure();
98
99 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 4);
100
101 // the first layer
102 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 4);
103 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
104 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 3);
105 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 1);
106 BOOST_CHECK_EQUAL(mergersTopology[2].inputs.size(), 3);
107 BOOST_CHECK_EQUAL(mergersTopology[2].outputs.size(), 1);
108
109 // the second layer
110 BOOST_CHECK_EQUAL(mergersTopology[3].inputs.size(), 4);
111 BOOST_CHECK_EQUAL(mergersTopology[3].outputs.size(), 1);
112 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[3].outputs[0]);
113 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
114 BOOST_CHECK_EQUAL(concrete.description.str, "test");
115 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
116 }
117}
118
119BOOST_AUTO_TEST_CASE(InfrastructureBuilderReductionFactor)
120{
122 builder.setInfrastructureName("name");
123 builder.setInputSpecs({{"one", "TST", "test", 1},
124 {"two", "TST", "test", 2},
125 {"thr", "TST", "test", 3},
126 {"fou", "TST", "test", 4},
127 {"fiv", "TST", "test", 5},
128 {"six", "TST", "test", 6},
129 {"sev", "TST", "test", 7}});
130 builder.setOutputSpec({{"main"}, "TST", "test", 0});
131 MergerConfig config;
132
133 {
134 config.topologySize = {TopologySize::ReductionFactor, 1};
135 builder.setConfig(config);
136 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
137 }
138
139 {
140 config.topologySize = {TopologySize::ReductionFactor, 7};
141 builder.setConfig(config);
142 auto mergersTopology = builder.generateInfrastructure();
143
144 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 1);
145 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 8);
146 BOOST_REQUIRE_EQUAL(mergersTopology[0].outputs.size(), 1);
147
148 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[0].outputs[0]);
149 BOOST_CHECK_EQUAL(concrete.origin.str, "TST");
150 BOOST_CHECK_EQUAL(concrete.description.str, "test");
151 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
152 }
153
154 {
155 config.topologySize = {TopologySize::ReductionFactor, 3};
156 builder.setConfig(config);
157 auto mergersTopology = builder.generateInfrastructure();
158
159 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 4);
160
161 // the first layer
162 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 4);
163 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
164 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 3);
165 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 1);
166 BOOST_CHECK_EQUAL(mergersTopology[2].inputs.size(), 3);
167 BOOST_CHECK_EQUAL(mergersTopology[2].outputs.size(), 1);
168
169 // the second layer
170 BOOST_CHECK_EQUAL(mergersTopology[3].inputs.size(), 4);
171 BOOST_CHECK_EQUAL(mergersTopology[3].outputs.size(), 1);
172
173 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[3].outputs[0]);
174 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
175 BOOST_CHECK_EQUAL(concrete.description.str, "test");
176 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
177 }
178
179 {
180 config.topologySize = {TopologySize::ReductionFactor, 3};
181 config.parallelismType = {ParallelismType::RoundRobin, 3};
182 config.inputObjectTimespan = {InputObjectsTimespan::LastDifference};
183 builder.setConfig(config);
184 auto mergersTopology = builder.generateInfrastructure();
185
186 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 2);
187
188 // the first layer
189 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 8);
190 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
191
192 // the second layer
193 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 2);
194 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 1);
195
196 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[1].outputs[0]);
197 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
198 BOOST_CHECK_EQUAL(concrete.description.str, "test");
199 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
200 }
201}
202
203BOOST_AUTO_TEST_CASE(InfrastructureBuilderMergersPerLayer)
204{
206 builder.setInfrastructureName("name");
207 builder.setInputSpecs({{"one", "TST", "test", 1},
208 {"two", "TST", "test", 2},
209 {"thr", "TST", "test", 3},
210 {"fou", "TST", "test", 4},
211 {"fiv", "TST", "test", 5},
212 {"six", "TST", "test", 6},
213 {"sev", "TST", "test", 7}});
214 builder.setOutputSpec({{"main"}, "TST", "test", 0});
215 MergerConfig config;
216
217 {
218 config.topologySize = {TopologySize::MergersPerLayer, 1}; // int instead of std::vector<size_t>
219 builder.setConfig(config);
220 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
221 }
222
223 {
224 config.topologySize = {TopologySize::MergersPerLayer, std::vector<size_t>{10, 4, 2}}; // last layer is not 1
225 builder.setConfig(config);
226 BOOST_CHECK_THROW(builder.generateInfrastructure(), std::runtime_error);
227 }
228
229 {
230 config.topologySize = {TopologySize::MergersPerLayer, std::vector<size_t>{1}};
231 builder.setConfig(config);
232 auto mergersTopology = builder.generateInfrastructure();
233
234 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 1);
235 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 8); // 7 inputs + 1 timer
236 BOOST_REQUIRE_EQUAL(mergersTopology[0].outputs.size(), 1);
237
238 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[0].outputs[0]);
239 BOOST_CHECK_EQUAL(concrete.origin.str, "TST");
240 BOOST_CHECK_EQUAL(concrete.description.str, "test");
241 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
242 }
243
244 {
245 config.topologySize = {TopologySize::MergersPerLayer, std::vector<size_t>{3, 1}};
246 builder.setConfig(config);
247 auto mergersTopology = builder.generateInfrastructure();
248
249 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 4);
250
251 // the first layer
252 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 4); // 3 inputs + 1 timer
253 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
254 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 3); // 2 inputs + 1 timer
255 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 1);
256 BOOST_CHECK_EQUAL(mergersTopology[2].inputs.size(), 3); // 2 inputs + 1 timer
257 BOOST_CHECK_EQUAL(mergersTopology[2].outputs.size(), 1);
258
259 // the second layer
260 BOOST_CHECK_EQUAL(mergersTopology[3].inputs.size(), 4);
261 BOOST_CHECK_EQUAL(mergersTopology[3].outputs.size(), 1);
262
263 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[3].outputs[0]);
264 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
265 BOOST_CHECK_EQUAL(concrete.description.str, "test");
266 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
267 }
268
269 {
270 config.topologySize = {TopologySize::MergersPerLayer, std::vector<size_t>{10, 2, 1}};
271 config.parallelismType = {ParallelismType::RoundRobin};
272 config.inputObjectTimespan = {InputObjectsTimespan::LastDifference};
273 builder.setConfig(config);
274 auto mergersTopology = builder.generateInfrastructure();
275
276 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 3);
277
278 // the first layer
279 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 8); // 7 inputs + 1 timer
280 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
281 BOOST_CHECK_EQUAL(mergersTopology[0].maxInputTimeslices, 10);
282
283 // the second layer
284 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 2); // 1 input + 1 timer
285 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 1);
286 BOOST_CHECK_EQUAL(mergersTopology[1].maxInputTimeslices, 2);
287
288 // the third layer
289 BOOST_CHECK_EQUAL(mergersTopology[2].inputs.size(), 2); // 1 input + 1 timer
290 BOOST_CHECK_EQUAL(mergersTopology[2].outputs.size(), 1);
291 BOOST_CHECK_EQUAL(mergersTopology[2].maxInputTimeslices, 1);
292
293 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[2].outputs[0]);
294 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
295 BOOST_CHECK_EQUAL(concrete.description.str, "test");
296 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
297 }
298
299 {
300 config.topologySize = {TopologySize::MergersPerLayer, std::vector<size_t>{10, 1}};
301 config.parallelismType = {ParallelismType::RoundRobin};
302 config.publishMovingWindow = {PublishMovingWindow::Yes};
303 builder.setInputSpecs({{"one", "TST", "test", 1}});
304 builder.setConfig(config);
305 auto mergersTopology = builder.generateInfrastructure();
306
307 BOOST_REQUIRE_EQUAL(mergersTopology.size(), 2);
308
309 // the first layer
310 BOOST_CHECK_EQUAL(mergersTopology[0].inputs.size(), 2); // 1 input + 1 timer
311 BOOST_CHECK_EQUAL(mergersTopology[0].outputs.size(), 1);
312 BOOST_CHECK_EQUAL(mergersTopology[0].maxInputTimeslices, 10);
313
314 // the second layer
315 BOOST_CHECK_EQUAL(mergersTopology[1].inputs.size(), 2); // 1 input + 1 timer
316 BOOST_CHECK_EQUAL(mergersTopology[1].outputs.size(), 2); // 1 integral + 1 moving window
317 BOOST_CHECK_EQUAL(mergersTopology[1].maxInputTimeslices, 1);
318
319 auto concrete = DataSpecUtils::asConcreteDataMatcher(mergersTopology[1].outputs[0]);
320 BOOST_REQUIRE_EQUAL(concrete.origin.str, "TST");
321 BOOST_CHECK_EQUAL(concrete.description.str, "test");
322 BOOST_CHECK_EQUAL(concrete.subSpec, 0);
323 }
324}
Definition of O2 MergerInfrastructureBuilder, v0.1.
void setOutputSpec(const framework::OutputSpec &outputSpec)
void setInputSpecs(const framework::Inputs &inputs)
GLsizei const GLfloat * value
Definition glcorearb.h:819
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
static ConcreteDataMatcher asConcreteDataMatcher(InputSpec const &input)
ConfigEntry< PublishMovingWindow > publishMovingWindow
ConfigEntry< TopologySize, std::variant< int, std::vector< size_t > > > topologySize
ConfigEntry< ParallelismType > parallelismType
ConfigEntry< InputObjectsTimespan > inputObjectTimespan
BOOST_CHECK_NO_THROW(algorithm::merge(target, other))
BOOST_AUTO_TEST_CASE(InfrastructureBuilderUnconfigured)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())