10#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12#include <log4cplus/logger.h>
13#include <nlohmann/json.hpp>
26using namespace ::testing;
40 "type":"valueKeyword",
57 std::vector<std::string> meta_reply_files_1 = {"host@:/some/path",
"host@:/some/path2"};
58 std::vector<std::string> meta_reply_files_2;
60 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
61 auto reply_mock = std::make_shared<DaqStopReplyMock>();
62 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
63 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(m_keywords));
65 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
66 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
67 EXPECT_CALL(*reply_mock2, getFiles()).WillRepeatedly(Return(meta_reply_files_2));
68 EXPECT_CALL(*reply_mock2, getKeywords()).WillRepeatedly(Return(m_empty));
69 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
70 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
71 .WillOnce(Return(ByMove(reply_promise2.get_future())));
73 boost::promise<std::shared_ptr<recif::RecStatus>> prim_reply_promise_1;
74 boost::promise<std::shared_ptr<recif::RecStatus>> prim_reply_promise_2;
75 EXPECT_CALL(*m_prim_rr_client, RecStop())
76 .WillOnce(Return(ByMove(prim_reply_promise_1.get_future())));
77 EXPECT_CALL(*m_prim_rr_client2, RecStop())
78 .WillOnce(Return(ByMove(prim_reply_promise_2.get_future())));
80 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
81 std::vector<std::string> prim_reply_files_2;
82 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
83 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
84 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
85 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
88 auto fut = op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Strict, MakeParams());
89 ASSERT_FALSE(fut.is_ready());
92 reply_promise.set_value(reply_mock);
93 reply_promise2.set_value(reply_mock2);
94 prim_reply_promise_1.set_value(prim_reply_mock1);
95 prim_reply_promise_2.set_value(prim_reply_mock2);
101 ASSERT_FALSE(fut.has_exception()) <<
"Future has unexpected exception!";
102 auto result = fut.get();
104 1u + meta_reply_files_1.size() +
105 prim_reply_files_1.size());
109 std::vector<std::string> meta_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
110 std::vector<std::string> meta_reply_files_2;
112 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
113 auto reply_mock = std::make_shared<DaqStopReplyMock>();
114 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
115 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(
"this is not JSON"));
117 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
118 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
119 EXPECT_CALL(*reply_mock2, getFiles()).WillRepeatedly(Return(meta_reply_files_2));
120 EXPECT_CALL(*reply_mock2, getKeywords()).WillRepeatedly(Return(m_empty));
121 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
122 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
123 .WillOnce(Return(ByMove(reply_promise2.get_future())));
125 EXPECT_CALL(*m_prim_rr_client, RecStop())
126 .WillOnce(Return(ByMove(m_recstatus_promise1.get_future())));
127 EXPECT_CALL(*m_prim_rr_client2, RecStop())
128 .WillOnce(Return(ByMove(m_recstatus_promise2.get_future())));
129 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
130 std::vector<std::string> prim_reply_files_2;
131 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
132 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
133 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
134 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
138 op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Tolerant, MakeParams());
139 ASSERT_FALSE(fut.is_ready());
142 reply_promise.set_value(reply_mock);
143 reply_promise2.set_value(reply_mock2);
144 m_recstatus_promise1.set_value(prim_reply_mock1);
145 m_recstatus_promise2.set_value(prim_reply_mock2);
151 ASSERT_FALSE(fut.has_exception()) <<
"Future should have an exception from JSON decoding error";
152 auto result = fut.get();
153 EXPECT_EQ(result.result.size(), prim_reply_files_1.size())
154 <<
"Expected nothing from meta source";
160 std::vector<std::string> meta_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
161 std::vector<std::string> meta_reply_files_2;
163 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
164 auto reply_mock = std::make_shared<DaqStopReplyMock>();
165 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
166 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(
"this is not JSON"));
168 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
169 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
170 EXPECT_CALL(*reply_mock2, getFiles()).WillRepeatedly(Return(meta_reply_files_2));
171 EXPECT_CALL(*reply_mock2, getKeywords()).WillRepeatedly(Return(m_empty));
172 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
173 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
174 .WillOnce(Return(ByMove(reply_promise2.get_future())));
176 EXPECT_CALL(*m_prim_rr_client, RecStop())
177 .WillOnce(Return(ByMove(m_recstatus_promise1.get_future())));
178 EXPECT_CALL(*m_prim_rr_client2, RecStop())
179 .WillOnce(Return(ByMove(m_recstatus_promise2.get_future())));
180 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
181 std::vector<std::string> prim_reply_files_2;
182 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
183 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
184 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
185 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
188 auto fut = op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Strict, MakeParams());
189 ASSERT_FALSE(fut.is_ready());
192 reply_promise.set_value(reply_mock);
193 reply_promise2.set_value(reply_mock2);
194 m_recstatus_promise1.set_value(prim_reply_mock1);
195 m_recstatus_promise2.set_value(prim_reply_mock2);
201 ASSERT_TRUE(fut.has_exception()) <<
"Future should have an exception from JSON decoding error";
209 std::vector<std::string> meta_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
210 std::vector<std::string> meta_reply_files_2;
212 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
213 auto reply_mock = std::make_shared<DaqStopReplyMock>();
214 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
215 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(m_keywords));
217 auto obs_tplno_kw =
fits::EsoKeyword(
"OBS TPLNO",
static_cast<std::uint64_t
>(2u));
223 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
224 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
225 EXPECT_CALL(*reply_mock2, getFiles()).WillRepeatedly(Return(meta_reply_files_2));
226 EXPECT_CALL(*reply_mock2, getKeywords()).WillRepeatedly(Return(m_empty));
227 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
228 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
229 .WillOnce(Return(ByMove(reply_promise2.get_future())));
231 EXPECT_CALL(*m_prim_rr_client, RecStop())
232 .WillOnce(Return(ByMove(m_recstatus_promise1.get_future())));
233 EXPECT_CALL(*m_prim_rr_client2, RecStop())
234 .WillOnce(Return(ByMove(m_recstatus_promise2.get_future())));
235 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
236 std::vector<std::string> prim_reply_files_2;
237 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
238 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
239 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
240 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
243 auto fut = op::InitiateOperation<op::StopAsync>(
244 m_executor, ErrorPolicy::Strict, MakeParams(&kw_fmt_mock));
245 ASSERT_FALSE(fut.is_ready());
248 reply_promise.set_value(reply_mock);
249 reply_promise2.set_value(reply_mock2);
250 m_recstatus_promise1.set_value(prim_reply_mock1);
251 m_recstatus_promise2.set_value(prim_reply_mock2);
257 ASSERT_TRUE(fut.has_exception()) <<
"Future should have an exception from unknown keyword";
260 for (
auto& s : m_meta_sources) {
270 std::vector<std::string> meta_reply_files_1;
272 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
273 auto reply_mock = std::make_shared<DaqStopReplyMock>();
274 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
275 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(
""));
277 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
278 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
279 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
280 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
281 .WillOnce(Return(ByMove(reply_promise2.get_future())));
283 EXPECT_CALL(*m_prim_rr_client, RecStop())
284 .WillOnce(Return(ByMove(m_recstatus_promise1.get_future())));
285 EXPECT_CALL(*m_prim_rr_client2, RecStop())
286 .WillOnce(Return(ByMove(m_recstatus_promise2.get_future())));
287 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
288 std::vector<std::string> prim_reply_files_2;
289 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
290 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
291 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
292 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
295 auto fut = op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Strict, MakeParams());
296 ASSERT_FALSE(fut.is_ready());
299 reply_promise.set_value(reply_mock);
300 reply_promise2.set_exception(metadaqif::DaqException(m_id,
"message"));
301 m_recstatus_promise1.set_value(prim_reply_mock1);
302 m_recstatus_promise2.set_value(prim_reply_mock2);
313 std::vector<std::string> meta_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
315 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise;
316 auto reply_mock = std::make_shared<DaqStopReplyMock>();
317 EXPECT_CALL(*reply_mock, getFiles()).WillRepeatedly(Return(meta_reply_files_1));
318 EXPECT_CALL(*reply_mock, getKeywords()).WillRepeatedly(Return(
""));
320 boost::promise<std::shared_ptr<metadaqif::DaqStopReply>> reply_promise2;
321 auto reply_mock2 = std::make_shared<DaqStopReplyMock>();
322 EXPECT_CALL(*m_meta_rr_client, StopDaq(_)).WillOnce(Return(ByMove(reply_promise.get_future())));
323 EXPECT_CALL(*m_meta_rr_client2, StopDaq(_))
324 .WillOnce(Return(ByMove(reply_promise2.get_future())));
325 EXPECT_CALL(*m_prim_rr_client, RecStop())
326 .WillOnce(Return(ByMove(m_recstatus_promise1.get_future())));
327 EXPECT_CALL(*m_prim_rr_client2, RecStop())
328 .WillOnce(Return(ByMove(m_recstatus_promise2.get_future())));
329 std::vector<std::string> prim_reply_files_1 = {
"host@:/some/path",
"host@:/some/path2"};
330 std::vector<std::string> prim_reply_files_2;
331 auto prim_reply_mock1 = std::make_shared<RecStatusMock>();
332 auto prim_reply_mock2 = std::make_shared<RecStatusMock>();
333 EXPECT_CALL(*prim_reply_mock1, getDpFiles()).WillRepeatedly(Return(prim_reply_files_1));
334 EXPECT_CALL(*prim_reply_mock2, getDpFiles()).WillRepeatedly(Return(prim_reply_files_2));
338 op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Tolerant, MakeParams());
339 ASSERT_FALSE(fut.is_ready());
342 reply_promise.set_value(reply_mock);
343 reply_promise2.set_exception(metadaqif::DaqException(m_id,
"message"));
344 m_recstatus_promise1.set_value(prim_reply_mock1);
345 m_recstatus_promise2.set_value(prim_reply_mock2);
351 EXPECT_FALSE(fut.has_exception());
352 auto result = fut.get();
353 EXPECT_TRUE(result.error);
354 EXPECT_EQ(result.result.size(), meta_reply_files_1.size() + prim_reply_files_1.size());
359 for (
auto& s : m_prim_sources) {
360 s.SetState(State::Stopped);
362 for (
auto& s : m_meta_sources) {
363 s.SetState(State::Stopped);
366 op::InitiateOperation<op::StopAsync>(m_executor, ErrorPolicy::Tolerant, MakeParams());
369 auto result = fut.get();
Exception thrown to carry reply errors.
Indicates keyword is unknown and cannot be formatted.
Contains error related declarations for DAQ.
void MakeTestProgress(boost::asio::io_context &io_ctx, Future *fut=nullptr)
Test helper that progress the test by executing pending jobs and optionally wait for a future to be r...
Base fixture for async operation tests.
Note: TestAsyncOpBase set.
Contains declarations for the helper functions to initiate operations.
LiteralKeyword Format(KeywordVariant const &keyword)
std::variant< ValueKeyword, EsoKeyword, LiteralKeyword > KeywordVariant
The different variants of keywords that are supported.
BasicKeyword< ValueKeywordTraits > ValueKeyword
Standard FITS value keyword.
BasicKeyword< EsoKeywordTraits > EsoKeyword
ESO hiearchical keyword.
Contains declaration for the StopAsync operation.
Contains declaration for async operations shared base class.
TEST_F(TestAsyncOpStop, Stop)
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
ASSERT_TRUE(std::holds_alternative< OlasReceiver >(spec.receivers[0]))
Defines shared test utilities.