ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
testStartDaqV2.cpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup daq_libjson
4 * @copyright
5 * (c) Copyright ESO 2022
6 * All Rights Reserved
7 * ESO (eso.org) is an Intergovernmental Organisation, and therefore special legal conditions apply.
8 */
10
11#include <gtest/gtest.h>
12
13using namespace ::testing;
14
15namespace daq::json {
16
17class TestParseStartDaqV2Spec : public ::testing::Test {
18public:
19 void SetUp() {
20 using namespace nlohmann;
21 m_spec = R"(
22 {
23 "id": "myid",
24 "awaitCompletionInterval": 3.0,
25 "mergeTarget": {
26 "sourceName": "primary"
27 },
28 "sources": [
29 {
30 "type": "primarySource",
31 "sourceName": "primary",
32 "rrUri": "zpb.rr://prim",
33 "keywordRules": [
34 {
35 "type": "filter",
36 "selectionPatterns": [
37 "+e *",
38 "+v *"
39 ]
40 }
41 ]
42 },
43 {
44 "type": "metadataSource",
45 "sourceName": "metadata",
46 "rrUri": "zpb.rr://meta",
47 "initialKeywords": "user",
48 "keywordRules": [
49 {
50 "type": "transform",
51 "selectionPatterns": [
52 "+e INS1 *"
53 ],
54 "regex": "INS1 ",
55 "format": "INS2 "
56 }
57 ]
58 },
59 {
60 "type": "fitsKeywords",
61 "sourceName": "keywords",
62 "keywords": [
63 {
64 "type": "valueKeyword",
65 "name": "TELESCOP",
66 "value": "ESO-ELT"
67 }
68 ],
69 "keywordRules": [
70 {
71 "type": "transform",
72 "selectionPatterns": [
73 "+e INS1 *"
74 ],
75 "regex": "INS1 ",
76 "format": "INS2 "
77 }
78 ]
79 },
80 {
81 "type": "fitsFile",
82 "sourceName": "file",
83 "location": "host:/path/to.fits.",
84 "keywordRules": [
85 {
86 "type": "transform",
87 "selectionPatterns": [
88 "+e INS1 *"
89 ],
90 "regex": "INS1 ",
91 "format": "INS2 "
92 }
93 ]
94 }
95 ],
96 "filePrefix": "prefix",
97 "receivers": [
98 {
99 "type": "olasReceiver",
100 "host": "1.2.3.4",
101 "path": "/absolute/path"
102 }
103 ]
104 }
106 }
107 nlohmann::json m_spec;
108};
109
110TEST_F(TestParseStartDaqV2Spec, RoundTripParsing) {
111 auto spec_1 = ParseStartDaqV2Spec(m_spec);
112 auto spec_1_json = nlohmann::json();
113 to_json(spec_1_json, spec_1);
114
115 auto spec_2 = ParseStartDaqV2Spec(spec_1_json);
116 EXPECT_EQ(spec_1, spec_2);
117}
118
119TEST_F(TestParseStartDaqV2Spec, SuccessfulTemplate) {
120 auto spec = ParseStartDaqV2Spec(m_spec);
121
122 EXPECT_EQ(spec.id, "myid");
123 EXPECT_EQ(spec.file_prefix, "prefix");
124 EXPECT_EQ(spec.await_completion_interval, std::chrono::milliseconds(3000));
125
126 ASSERT_EQ(spec.sources.size(), 4u);
127
128 ASSERT_TRUE(spec.merge_target);
129 EXPECT_EQ(spec.merge_target->source_name, "primary");
130 {
131 auto const& prim = std::get<StartDaqV2Spec::PrimaryDataSource>(spec.sources[0]);
132 EXPECT_EQ(prim.source_name, "primary");
133 EXPECT_EQ(prim.rr_uri, "zpb.rr://prim");
134
135 ASSERT_EQ(prim.keyword_rules.size(), 1u);
136 auto const& filter = std::get<KeywordFilter>(prim.keyword_rules.at(0));
137 ASSERT_EQ(filter.selection_patterns.size(), 2u);
138 EXPECT_EQ(filter.selection_patterns[0], "+e *");
139 EXPECT_EQ(filter.selection_patterns[1], "+v *");
140 }
141 {
142 auto const& meta = std::get<StartDaqV2Spec::MetadataSource>(spec.sources[1]);
143 EXPECT_EQ(meta.rr_uri, "zpb.rr://meta");
144 EXPECT_EQ(meta.source_name, "metadata");
145 EXPECT_EQ(meta.initial_keywords, InitialKeywords::User);
146
147 ASSERT_EQ(meta.keyword_rules.size(), 1u);
148 auto const& transform = std::get<KeywordTransform>(meta.keyword_rules.at(0));
149 ASSERT_EQ(transform.selection_patterns.size(), 1u);
150 EXPECT_EQ(transform.selection_patterns[0], "+e INS1 *");
151 EXPECT_EQ(transform.regex, "INS1 ");
152 EXPECT_EQ(transform.format, "INS2 ");
153 }
154 {
155 auto const& kws = std::get<FitsKeywordsSource>(spec.sources[2]);
156 EXPECT_EQ(kws.source_name, "keywords");
157 }
158 {
159 auto const& file = std::get<FitsFileSource>(spec.sources[3]);
160 EXPECT_EQ(file.source_name, "file");
161 }
162 {
163 // receivers
164 ASSERT_EQ(spec.receivers.size(), 1u);
165 ASSERT_TRUE(std::holds_alternative<OlasReceiver>(spec.receivers[0]));
166 auto const& olas_receiver = std::get<OlasReceiver>(spec.receivers[0]);
167 EXPECT_EQ(olas_receiver.host, "1.2.3.4");
168 EXPECT_EQ(olas_receiver.path, "/absolute/path/");
169 }
170}
171
172TEST_F(TestParseStartDaqV2Spec, EmptyKeywordRulesModelledAsEmptyOptional) {
173 m_spec["sources"][0].erase("keywordRules");
174 m_spec["sources"][1].erase("keywordRules");
175 auto spec = ParseStartDaqV2Spec(m_spec);
176
177 EXPECT_EQ(spec.id, "myid");
178 EXPECT_EQ(spec.file_prefix, "prefix");
179
180 ASSERT_EQ(spec.sources.size(), 4u);
181
182 {
183 auto const& prim = std::get<StartDaqV2Spec::PrimaryDataSource>(spec.sources[0]);
184 EXPECT_EQ(prim.source_name, "primary");
185 EXPECT_EQ(prim.rr_uri, "zpb.rr://prim");
186
187 ASSERT_TRUE(prim.keyword_rules.empty());
188 }
189 {
190 auto const& meta = std::get<StartDaqV2Spec::MetadataSource>(spec.sources[1]);
191 EXPECT_EQ(meta.rr_uri, "zpb.rr://meta");
192 EXPECT_EQ(meta.source_name, "metadata");
193
194 ASSERT_TRUE(meta.keyword_rules.empty());
195 }
196}
197
198TEST_F(TestParseStartDaqV2Spec, NoIdIsModelledAsEmptyString) {
199 m_spec.erase("id");
200 auto spec = ParseStartDaqV2Spec(m_spec);
201 EXPECT_EQ(spec.id, "");
202}
203
204TEST_F(TestParseStartDaqV2Spec, EmptydIsAllowed) {
205 m_spec["id"] = "";
206 auto spec = ParseStartDaqV2Spec(m_spec);
207 EXPECT_EQ(spec.id, "");
208}
209
210TEST_F(TestParseStartDaqV2Spec, AwaitCompletionIntervalIsOptional) {
211 m_spec.erase("awaitCompletionInterval");
212 auto spec = ParseStartDaqV2Spec(m_spec);
213
214 EXPECT_EQ(spec.await_completion_interval, std::nullopt);
215}
216
217TEST_F(TestParseStartDaqV2Spec, AwaitCompletionIntervalAcceptsIntegers) {
218 m_spec["awaitCompletionInterval"] = 2;
219 auto spec = ParseStartDaqV2Spec(m_spec);
220
221 EXPECT_EQ(spec.await_completion_interval, std::chrono::milliseconds(2000));
222}
223
224TEST_F(TestParseStartDaqV2Spec, MergeTargetWithoutSourceIsInvalid) {
225 m_spec["mergeTarget"].erase("sourceName");
226 EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
227}
228
229TEST_F(TestParseStartDaqV2Spec, MergeTargetMatchingMultipleSourcesIsInvalid) {
230 m_spec["sources"][1]["sourceName"] = "primary";
231 EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
232}
233
234TEST_F(TestParseStartDaqV2Spec, MergeTargetWithoutCorrespondingSourceIsInvalid) {
235 m_spec["mergeTarget"]["sourceName"] = "foob";
236 EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
237}
238
239TEST_F(TestParseStartDaqV2Spec, MergeTargetMetadataIsValid) {
240 m_spec["mergeTarget"]["sourceName"] = "metadata";
241 EXPECT_NO_THROW(ParseStartDaqV2Spec(m_spec));
242}
243
244TEST_F(TestParseStartDaqV2Spec, MergeTargetFitsfileIsValid) {
245 m_spec["mergeTarget"]["sourceName"] = "file";
246 EXPECT_NO_THROW(ParseStartDaqV2Spec(m_spec));
247}
248
249TEST_F(TestParseStartDaqV2Spec, MergeTargetIsOptional) {
250 m_spec.erase("mergeTarget");
251 auto spec = ParseStartDaqV2Spec(m_spec);
252 EXPECT_FALSE(spec.merge_target);
253}
254
255TEST_F(TestParseStartDaqV2Spec, MergeTargetWithKeywordsSourceIsInvalid) {
256 m_spec["mergeTarget"]["sourceName"] = "keywords";
257 EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
258}
259
260TEST_F(TestParseStartDaqV2Spec, AwaitCompletionIntervalMustBePositive) {
261 m_spec["awaitCompletionInterval"] = -1.0;
262 EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
263}
264
265TEST_F(TestParseStartDaqV2Spec, EmptyReceiversIsAllowed) {
266 m_spec["receivers"] = nlohmann::json::array();
267 auto spec = ParseStartDaqV2Spec(m_spec);
268 EXPECT_TRUE(spec.receivers.empty());
269}
270
271TEST_F(TestParseStartDaqV2Spec, UndefinedReceiversIsAllowed) {
272 m_spec.erase("receivers");
273 auto spec = ParseStartDaqV2Spec(m_spec);
274 EXPECT_TRUE(spec.receivers.empty());
275}
276
277} // namespace daq::json
@ User
Keep only user-keywords.
TEST_F(TestParseLocation, ParseSucceeds)
Definition: testDpSpec.cpp:20
nlohmann::json m_spec
StartDaqV2Spec ParseStartDaqV2Spec(nlohmann::json const &json)
Parse StartDaqSpec.
Definition: startDaqV2.cpp:46
daq::json::TestParseStartDaqV2Spec _json
void to_json(nlohmann::json &out, KeywordFilter const &s)
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
auto const & olas_receiver
ASSERT_EQ(meta.keyword_rules.size(), 1u)
auto const & transform
ASSERT_TRUE(std::holds_alternative< OlasReceiver >(spec.receivers[0]))