10 #include <gmock/gmock.h>
11 #include <gtest/gtest.h>
12 #include <log4cplus/logger.h>
21 using namespace ::testing;
25 class RecStatusFake :
public recif::RecStatus {
27 RecStatusFake(std::string
id, recif::RecStatusNames status, std::vector<std::string> files)
28 : m_id(std::move(id)), m_status(status), m_files(std::move(files)) {
30 virtual std::vector<std::string> getDpFiles()
const override {
33 virtual void setDpFiles(
const std::vector<std::string>& dp_files)
override {
37 virtual double getEndTime()
const override {
40 virtual void setEndTime(
double end_time)
override {
43 virtual int32_t getFilesGenerated()
const override {
44 return m_files.size();
46 virtual void setFilesGenerated(int32_t files_generated)
override {
49 virtual int32_t getFramesProcessed()
const override {
52 virtual void setFramesProcessed(int32_t frames_processed)
override {
55 virtual int32_t getFramesRemaining()
const override {
58 virtual void setFramesRemaining(int32_t frames_remaining)
override {
61 virtual std::string getId()
const override {
64 virtual void setId(
const std::string&
id)
override {
68 virtual std::string getInfo()
const override {
71 virtual void setInfo(
const std::string& info)
override {
74 virtual double getRemainingTime()
const override {
77 virtual void setRemainingTime(
double remaining_time)
override {
80 virtual int32_t getSizeRecorded()
const override {
83 virtual void setSizeRecorded(int32_t size_recorded)
override {
86 virtual double getStartTime()
const override {
89 virtual void setStartTime(
double start_time)
override {
92 virtual ::recif::RecStatusNames getStatus()
const override {
95 virtual void setStatus(::recif::RecStatusNames status)
override {
99 virtual double getTimeElapsed()
const override {
102 virtual void setTimeElapsed(
double time_elapsed)
override {
104 bool hasKey()
const override {
107 std::unique_ptr<recif::RecStatus> cloneKey()
const override {
108 throw std::runtime_error(
"not clonable");
110 std::unique_ptr<recif::RecStatus> clone()
const override {
111 throw std::runtime_error(
"not clonable");
113 bool keyEquals(
const recif::RecStatus& other)
const override {
119 recif::RecStatusNames m_status;
120 std::vector<std::string> m_files;
123 class RecWaitStatusFake :
public recif::RecWaitStatus {
125 RecWaitStatusFake(recif::RecWaitStatusNames wait_status,
126 std::shared_ptr<recif::RecStatus> rec_status)
127 : m_wait_status{wait_status}, m_rec_status{std::move(rec_status)} {
129 std::shared_ptr<recif::RecStatus> getRecStatus()
const override {
134 void setRecStatus(
const std::shared_ptr<::recif::RecStatus>& status) {
135 m_rec_status = status;
138 recif::RecWaitStatusNames getStatus()
const override {
139 return m_wait_status;
141 void setStatus(recif::RecWaitStatusNames wait_status)
override {
142 m_wait_status = wait_status;
144 bool hasKey()
const override {
147 std::unique_ptr<recif::RecWaitStatus> cloneKey()
const override {
148 throw std::runtime_error(
"not clonable");
150 std::unique_ptr<recif::RecWaitStatus> clone()
const override {
151 throw std::runtime_error(
"not clonable");
153 bool keyEquals(
const recif::RecWaitStatus& other)
const override {
158 recif::RecWaitStatusNames m_wait_status;
159 std::shared_ptr<recif::RecStatus> m_rec_status;
167 auto status = std::make_shared<RecWaitStatusFake>(
169 std::make_shared<RecStatusFake>(
170 m_id, recif::RecStatusNames::Active, std::vector<std::string>()));
174 auto status = std::make_shared<RecWaitStatusFake>(
176 std::make_shared<RecStatusFake>(
178 recif::RecStatusNames::Completed,
179 std::vector<std::string>{
"/file1.fits",
"/file2.fits"}));
189 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_1;
190 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2;
191 auto reply_1 = MakeWaitCompletedStatus();
192 auto reply_2 = MakeWaitCompletedStatus();
193 EXPECT_CALL(*m_prim_rr_client, RecWait(_))
194 .WillOnce(Return(ByMove(prim_promise_1.get_future())));
195 EXPECT_CALL(*m_prim_rr_client2, RecWait(_))
196 .WillOnce(Return(ByMove(prim_promise_2.get_future())));
199 auto fut = op::InitiateOperation<op::AwaitPrimAsync>(MakeAwaitOpParams());
201 prim_promise_1.set_value(reply_1);
202 prim_promise_2.set_value(reply_2);
207 ASSERT_TRUE(fut.is_ready());
208 ASSERT_FALSE(fut.has_exception()) <<
"Future has unexpected exception!";
209 auto result = fut.get();
210 EXPECT_FALSE(result.error) <<
"There should have been no errors as each request was successful";
211 EXPECT_EQ(result.result.size(), 4u) <<
"Each primary source returned two files by default";
216 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_1;
217 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_1;
218 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_2;
219 auto reply_1 = MakeWaitCompletedStatus();
220 auto reply_2_1 = MakeWaitNotCompletedStatus();
221 auto reply_2_2 = MakeWaitCompletedStatus();
222 EXPECT_CALL(*m_prim_rr_client, RecWait(_))
223 .WillOnce(Return(ByMove(prim_promise_1.get_future())));
224 EXPECT_CALL(*m_prim_rr_client2, RecWait(_))
225 .WillOnce(Return(ByMove(prim_promise_2_1.get_future())))
226 .WillOnce(Return(ByMove(prim_promise_2_2.get_future())));
229 auto fut = op::InitiateOperation<op::AwaitPrimAsync>(MakeAwaitOpParams());
231 prim_promise_1.set_value(reply_1);
232 prim_promise_2_1.set_value(reply_2_1);
236 ASSERT_FALSE(fut.is_ready());
238 prim_promise_2_2.set_value(reply_2_2);
243 ASSERT_TRUE(fut.is_ready());
244 ASSERT_FALSE(fut.has_exception()) <<
"Future has unexpected exception!";
245 auto result = fut.get();
246 EXPECT_FALSE(result.error) <<
"There should have been no errors as each request was successful";
247 EXPECT_EQ(result.result.size(), 4u) <<
"Each primary source returned two files by default";
251 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_1;
252 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_1;
255 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_2;
256 auto reply_1 = MakeWaitCompletedStatus();
257 auto reply_2_2 = MakeWaitCompletedStatus();
258 EXPECT_CALL(*m_prim_rr_client, RecWait(_))
259 .WillOnce(Return(ByMove(prim_promise_1.get_future())));
260 EXPECT_CALL(*m_prim_rr_client2, RecWait(_))
261 .WillOnce(Return(ByMove(prim_promise_2_1.get_future())))
262 .WillOnce(Return(ByMove(prim_promise_2_2.get_future())));
265 ASSERT_TRUE(m_status->GetAlerts().empty());
267 auto fut = op::InitiateOperation<op::AwaitPrimAsync>(MakeAwaitOpParams());
269 prim_promise_1.set_value(reply_1);
270 prim_promise_2_1.set_exception(recif::ExceptionErr(
"random error", 1));
274 ASSERT_FALSE(fut.is_ready());
276 ASSERT_EQ(m_status->GetAlerts().size(), 1u);
277 auto alert = m_status->GetAlerts()[0];
278 EXPECT_THAT(alert.description, HasSubstr(
"prim-source-2"));
280 prim_promise_2_2.set_value(reply_2_2);
285 ASSERT_TRUE(fut.is_ready());
286 ASSERT_FALSE(fut.has_exception()) <<
"Future has unexpected exception!";
287 auto result = fut.get();
288 EXPECT_TRUE(result.error) <<
"A erors as each request was successful";
289 EXPECT_EQ(result.result.size(), 4u) <<
"Each primary source returned two files by default";
290 EXPECT_TRUE(m_status->GetAlerts().empty())
291 <<
"Alert should have cleared after successful retry";
295 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_1;
296 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_1;
297 boost::promise<std::shared_ptr<recif::RecWaitStatus>> prim_promise_2_2;
298 auto reply_1 = MakeWaitCompletedStatus();
299 auto reply_2_2 = MakeWaitCompletedStatus();
300 EXPECT_CALL(*m_prim_rr_client, RecWait(_))
301 .WillOnce(Return(ByMove(prim_promise_1.get_future())));
302 EXPECT_CALL(*m_prim_rr_client2, RecWait(_))
303 .WillOnce(Return(ByMove(prim_promise_2_1.get_future())));
306 auto [fut, abort] = op::InitiateAbortableOperation<op::AwaitPrimAsync>(MakeAwaitOpParams());
308 prim_promise_1.set_value(reply_1);
309 prim_promise_2_1.set_exception(recif::ExceptionErr(
"random error", 1));
313 ASSERT_FALSE(fut.is_ready());
317 EXPECT_TRUE(abort());
320 EXPECT_TRUE(fut.is_ready()) <<
"aborting operation should immediately set operation result";
322 ASSERT_FALSE(fut.has_exception()) <<
"Future has unexpected exception!";
323 auto result = fut.get();
324 EXPECT_TRUE(result.error) <<
"Operation was completed with error (exception from source)";
325 EXPECT_EQ(result.result.size(), 2u) <<
"Only result from first source was received before "
329 prim_promise_2_2.set_value(reply_1);
Contains declaration for the AwaitPrimAsync operation.
Contains error related declarations for DAQ.
std::shared_ptr< recif::RecWaitStatus > MakeWaitCompletedStatus()
daq::op::AwaitOpParams MakeAwaitOpParams()
std::shared_ptr< recif::RecWaitStatus > MakeWaitNotCompletedStatus()
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.
Contains declarations for the helper functions to initiate operations.
TEST_F(TestDpmDaqController, StatusUpdateInNotScheduledSucceeds)
Await specific parameters that is not provided with AsyncOpParams.
Contains declaration for async operations shared base class.
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
ASSERT_EQ(meta.keyword_rules.size(), 1u)