ifw-daq  3.0.1
IFW Data Acquisition modules
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 
13 using namespace ::testing;
14 
15 namespace daq::json {
16 
17 class TestParseStartDaqV2Spec : public ::testing::Test {
18 public:
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  }
105  )"_json;
106  }
107  nlohmann::json m_spec;
108 };
109 
110 TEST_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 
119 TEST_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 
172 TEST_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 
198 TEST_F(TestParseStartDaqV2Spec, NoIdIsModelledAsEmptyString) {
199  m_spec.erase("id");
200  auto spec = ParseStartDaqV2Spec(m_spec);
201  EXPECT_EQ(spec.id, "");
202 }
203 
204 TEST_F(TestParseStartDaqV2Spec, EmptydIsAllowed) {
205  m_spec["id"] = "";
206  auto spec = ParseStartDaqV2Spec(m_spec);
207  EXPECT_EQ(spec.id, "");
208 }
209 
210 TEST_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 
217 TEST_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 
224 TEST_F(TestParseStartDaqV2Spec, MergeTargetWithoutSourceIsInvalid) {
225  m_spec["mergeTarget"].erase("sourceName");
226  EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
227 }
228 
229 TEST_F(TestParseStartDaqV2Spec, MergeTargetMatchingMultipleSourcesIsInvalid) {
230  m_spec["sources"][1]["sourceName"] = "primary";
231  EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
232 }
233 
234 TEST_F(TestParseStartDaqV2Spec, MergeTargetWithoutCorrespondingSourceIsInvalid) {
235  m_spec["mergeTarget"]["sourceName"] = "foob";
236  EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
237 }
238 
239 TEST_F(TestParseStartDaqV2Spec, MergeTargetMetadataIsValid) {
240  m_spec["mergeTarget"]["sourceName"] = "metadata";
241  EXPECT_NO_THROW(ParseStartDaqV2Spec(m_spec));
242 }
243 
244 TEST_F(TestParseStartDaqV2Spec, MergeTargetFitsfileIsValid) {
245  m_spec["mergeTarget"]["sourceName"] = "file";
246  EXPECT_NO_THROW(ParseStartDaqV2Spec(m_spec));
247 }
248 
249 TEST_F(TestParseStartDaqV2Spec, MergeTargetIsOptional) {
250  m_spec.erase("mergeTarget");
251  auto spec = ParseStartDaqV2Spec(m_spec);
252  EXPECT_FALSE(spec.merge_target);
253 }
254 
255 TEST_F(TestParseStartDaqV2Spec, MergeTargetWithKeywordsSourceIsInvalid) {
256  m_spec["mergeTarget"]["sourceName"] = "keywords";
257  EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
258 }
259 
260 TEST_F(TestParseStartDaqV2Spec, AwaitCompletionIntervalMustBePositive) {
261  m_spec["awaitCompletionInterval"] = -1.0;
262  EXPECT_THROW(ParseStartDaqV2Spec(m_spec), StartDaqV2SpecError);
263 }
264 
265 TEST_F(TestParseStartDaqV2Spec, EmptyReceiversIsAllowed) {
266  m_spec["receivers"] = nlohmann::json::array();
267  auto spec = ParseStartDaqV2Spec(m_spec);
268  EXPECT_TRUE(spec.receivers.empty());
269 }
270 
271 TEST_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]))