Project
Loading...
Searching...
No Matches
test_O2DataModelHelpers.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#include "Headers/DataHeader.h"
15#include "Headers/Stack.h"
16#include <fairmq/TransportFactory.h>
17#include <catch_amalgamated.hpp>
18
19using namespace o2::framework;
20
21TEST_CASE("TestDataModelHelpers01")
22{
24 dh1.dataDescription = "CLUSTERS";
25 dh1.dataOrigin = "TPC";
26 dh1.subSpecification = 0;
27 dh1.splitPayloadIndex = 0;
28 dh1.splitPayloadParts = 0;
29
31 dh2.dataDescription = "CLUSTERS";
32 dh2.dataOrigin = "ITS";
33 dh2.subSpecification = 0;
34 dh2.splitPayloadIndex = 0;
35 dh2.splitPayloadParts = 0;
36
37 DataProcessingHeader dph1{0, 1};
38 DataProcessingHeader dph2{0, 1};
39 auto transport = fair::mq::TransportFactory::CreateTransportFactory("zeromq");
40 std::array<fair::mq::MessagePtr, 2> messages;
41 auto channelAlloc = o2::pmr::getTransportAllocator(transport.get());
42 fair::mq::Parts inputs{
43 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh1, dph1}),
44 transport->CreateMessage(1000),
45 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh2, dph2}),
46 transport->CreateMessage(1000)};
47 // Check if any header has dataDescription == "CLUSTERS"
48 REQUIRE(O2DataModelHelpers::all_headers_matching(inputs, [](auto const& header) {
49 return header != nullptr && header->dataDescription == o2::header::DataDescription("CLUSTERS");
50 }));
51
52 REQUIRE(O2DataModelHelpers::any_header_matching(inputs, [](auto const& header) {
53 return header != nullptr && header->dataOrigin == o2::header::DataOrigin("ITS");
54 }));
55
56 REQUIRE(O2DataModelHelpers::any_header_matching(inputs, [](auto const& header) {
57 return header != nullptr && header->dataOrigin == o2::header::DataOrigin("TPC");
58 }));
59
60 dh2.splitPayloadParts = 2;
62 dh3.dataDescription = "TRACKS";
63 dh3.dataOrigin = "ITS";
64 dh3.subSpecification = 0;
65 dh3.splitPayloadIndex = 0;
66 dh3.splitPayloadParts = 0;
67 DataProcessingHeader dph3{0, 1};
68
69 fair::mq::Parts inputs2{
70 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh1, dph1}),
71 transport->CreateMessage(1000),
72 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh2, dph2}),
73 transport->CreateMessage(1000),
74 transport->CreateMessage(1000),
75 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh3, dph3}),
76 transport->CreateMessage(1000),
77 };
78
79 REQUIRE(O2DataModelHelpers::all_headers_matching(inputs, [](auto const& header) {
80 return header != nullptr && header->dataDescription == o2::header::DataDescription("CLUSTERS");
81 }));
82
83 REQUIRE(O2DataModelHelpers::any_header_matching(inputs, [](auto const& header) {
84 return header != nullptr && header->dataOrigin == o2::header::DataOrigin("ITS");
85 }));
86
87 REQUIRE(O2DataModelHelpers::any_header_matching(inputs, [](auto const& header) {
88 return header != nullptr && header->dataDescription == o2::header::DataDescription("TRACKS");
89 }) == false);
90
91 REQUIRE(O2DataModelHelpers::any_header_matching(inputs2, [](auto const& header) {
92 return header != nullptr && header->dataDescription == o2::header::DataDescription("TRACKS");
93 }));
94
95 REQUIRE(O2DataModelHelpers::all_headers_matching(inputs2, [](auto const& header) {
96 return header != nullptr && header->subSpecification == 0;
97 }));
98}
99
100// Add a test to check that all the Lifetime::Timeframe messages are
101// actually there in the parts.
102TEST_CASE("TestTimeframePresent")
103{
105 dh1.dataDescription = "CLUSTERS";
106 dh1.dataOrigin = "TPC";
107 dh1.subSpecification = 0;
108 dh1.splitPayloadIndex = 0;
109 dh1.splitPayloadParts = 0;
110
112 dh2.dataDescription = "CLUSTERS";
113 dh2.dataOrigin = "ITS";
114 dh2.subSpecification = 0;
115 dh2.splitPayloadIndex = 0;
116 dh2.splitPayloadParts = 0;
117
118 DataProcessingHeader dph1{0, 1};
119 DataProcessingHeader dph2{0, 1};
120 auto transport = fair::mq::TransportFactory::CreateTransportFactory("zeromq");
121 std::array<fair::mq::MessagePtr, 2> messages;
122 auto channelAlloc = o2::pmr::getTransportAllocator(transport.get());
123 fair::mq::Parts inputs{
124 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh1, dph1}),
125 transport->CreateMessage(1000),
126 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh2, dph2}),
127 transport->CreateMessage(1000)};
128
129 std::vector<OutputSpec> outputs{
130 OutputSpec{{"TPC"}, "CLUSTERS", 0, Lifetime::Timeframe},
131 OutputSpec{{"ITS"}, "CLUSTERS", 0, Lifetime::Timeframe},
132 };
133 std::vector<bool> present;
134 present.resize(outputs.size());
135 O2DataModelHelpers::updateMissingSporadic(inputs, outputs, present);
136 REQUIRE(O2DataModelHelpers::validateOutputs(present) == true);
137}
138
139TEST_CASE("TestTimeframeMissing")
140{
142 dh1.dataDescription = "CLUSTERS";
143 dh1.dataOrigin = "TPC";
144 dh1.subSpecification = 0;
145 dh1.splitPayloadIndex = 0;
146 dh1.splitPayloadParts = 0;
147
148 DataProcessingHeader dph1{0, 1};
149 auto transport = fair::mq::TransportFactory::CreateTransportFactory("zeromq");
150 std::array<fair::mq::MessagePtr, 2> messages;
151 auto channelAlloc = o2::pmr::getTransportAllocator(transport.get());
152 fair::mq::Parts inputs{
153 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh1, dph1}),
154 transport->CreateMessage(1000),
155 };
156
157 std::vector<OutputSpec> outputs{
158 OutputSpec{{"TPC"}, "CLUSTERS", 0, Lifetime::Timeframe},
159 OutputSpec{{"ITS"}, "CLUSTERS", 0, Lifetime::Timeframe},
160 };
161 std::vector<bool> present;
162 present.resize(outputs.size());
163 O2DataModelHelpers::updateMissingSporadic(inputs, outputs, present);
164 REQUIRE(O2DataModelHelpers::validateOutputs(present) == false);
165
166 REQUIRE(O2DataModelHelpers::describeMissingOutputs(outputs, present) ==
167 "This timeframe has a missing output of lifetime timeframe: ITS/CLUSTERS/0. If this is expected, please change its lifetime to Sporadic / QA. Present outputs are: TPC/CLUSTERS/0.");
168}
169
170TEST_CASE("TestTimeframeSporadic")
171{
173 dh1.dataDescription = "CLUSTERS";
174 dh1.dataOrigin = "TPC";
175 dh1.subSpecification = 0;
176 dh1.splitPayloadIndex = 0;
177 dh1.splitPayloadParts = 0;
178
179 DataProcessingHeader dph1{0, 1};
180 auto transport = fair::mq::TransportFactory::CreateTransportFactory("zeromq");
181 std::array<fair::mq::MessagePtr, 2> messages;
182 auto channelAlloc = o2::pmr::getTransportAllocator(transport.get());
183 fair::mq::Parts inputs{
184 o2::pmr::getMessage(o2::header::Stack{channelAlloc, dh1, dph1}),
185 transport->CreateMessage(1000),
186 };
187
188 std::vector<OutputSpec> outputs{
189 OutputSpec{{"TPC"}, "CLUSTERS", 0, Lifetime::Timeframe},
190 OutputSpec{{"ITS"}, "QA", 0, Lifetime::Sporadic},
191 };
192 std::vector<bool> present;
193 present.resize(outputs.size());
194 O2DataModelHelpers::updateMissingSporadic(inputs, outputs, present);
195 REQUIRE(O2DataModelHelpers::validateOutputs(present) == true);
196}
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
TEST_CASE("test_prepareArguments")
Descriptor< gSizeDataDescriptionString > DataDescription
Definition DataHeader.h:551
Descriptor< gSizeDataOriginString > DataOrigin
Definition DataHeader.h:550
fair::mq::MessagePtr getMessage(ContainerT &&container, FairMQMemoryResource *targetResource=nullptr)
static bool validateOutputs(std::vector< bool > &present)
static void updateMissingSporadic(fair::mq::Parts &parts, std::vector< OutputSpec > const &specs, std::vector< bool > &present)
static bool any_header_matching(fair::mq::Parts &parts, F &&f)
static std::string describeMissingOutputs(std::vector< OutputSpec > const &specs, std::vector< bool > const &present)
static bool all_headers_matching(fair::mq::Parts &parts, F &&f)
the main header struct
Definition DataHeader.h:618
SplitPayloadPartsType splitPayloadParts
Definition DataHeader.h:646
DataDescription dataDescription
Definition DataHeader.h:636
SubSpecificationType subSpecification
Definition DataHeader.h:656
SplitPayloadIndexType splitPayloadIndex
Definition DataHeader.h:661
a move-only header stack with serialized headers This is the flat buffer where all the headers in a m...
Definition Stack.h:36