16 #include "mock/mockWorkspace.hpp"
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
26 auto daq = std::make_unique<MockDaqController>();
72 "fileId": "TEST.FILEID",
75 "location": "dcs-host:/path/to/somefile.fits",
76 "path": "dcs/somefile.fits"
83 "location": "fcs-host:/path/to/somefile.fits",
84 "path": "fcs/somefile.fits"
89 "type": "olasReceiver",
91 "path": "/remote/olas/"
94 "type": "olasReceiver",
95 "path": "/local/olas/"
120 using namespace ::testing;
124 EXPECT_CALL(m_ws_mock, LoadQueue()).WillOnce(Return(m_queue));
130 auto daq_ws = std::make_unique<MockDaqWorkspace>();
132 status.
id =
"TEST.ID";
133 status.
file_id =
"TEST.FILEID";
135 status.
error =
false;
137 EXPECT_CALL(*daq_ws, StoreStatus(status));
138 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
139 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
140 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}));
145 m_scheduler->QueueDaq(m_spec_str);
146 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
149 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str), std::invalid_argument);
150 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
155 auto daq_ws = std::make_unique<MockDaqWorkspace>();
157 status.
id =
"TEST.ID";
158 status.
file_id =
"TEST.FILEID";
161 Sequence init, rollback;
163 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
165 EXPECT_CALL(*daq_ws, StoreStatus(status));
166 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
167 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
168 .InSequence(init, rollback)
169 .WillOnce(Return(ByMove(std::move(daq_ws))));
170 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}))
171 .InSequence(init, rollback)
172 .WillRepeatedly(Throw(std::runtime_error(
"FAILED")));
175 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
180 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str), std::exception);
181 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
186 auto daq_ws = std::make_unique<MockDaqWorkspace>();
188 status.
id =
"TEST.ID";
189 status.
file_id =
"TEST.FILEID";
192 Sequence init, rollback;
194 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
196 EXPECT_CALL(*daq_ws, StoreStatus(status));
197 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str))
198 .WillOnce(Throw(std::runtime_error(
"ERROR")));
200 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
201 .InSequence(init, rollback)
202 .WillOnce(Return(ByMove(std::move(daq_ws))));
205 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
210 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str), std::exception);
211 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
216 Sequence init, rollback;
217 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
219 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
220 .InSequence(init, rollback)
221 .WillRepeatedly(Throw(std::runtime_error(
"ERROR")));
224 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
229 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str), std::exception);
230 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
235 Sequence init, rollback;
236 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
238 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).Times(0);
243 EXPECT_THROW(m_scheduler->QueueDaq(
"not a specification"), std::invalid_argument);
244 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
250 m_scheduler->Start();
252 auto daq_ws = std::make_unique<MockDaqWorkspace>();
254 status.
id =
"TEST.ID";
255 status.
file_id =
"TEST.FILEID";
258 EXPECT_CALL(*daq_ws, StoreStatus(status));
259 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
260 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
261 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}));
263 m_scheduler->QueueDaq(m_spec_str);
264 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
267 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str), std::invalid_argument);
268 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
272 daq_ws = std::make_unique<MockDaqWorkspace>();
273 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
275 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
276 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
278 EXPECT_CALL(mock, Start());
287 m_queue = {
"TEST.ID"};
290 auto daq_ws = std::make_unique<MockDaqWorkspace>();
293 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
296 daq_ws = std::make_unique<MockDaqWorkspace>();
298 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
299 EXPECT_CALL(m_ws_mock, ArchiveDaq(
"TEST.ID"));
300 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>()));
303 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
304 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
305 EXPECT_CALL(mock, GetState())
311 EXPECT_CALL(mock, Start()).WillOnce(Invoke([&]() { m_status.SetState(
State::Completed); }));
316 m_scheduler->Start();
322 m_queue = {
"TEST.ID"};
324 auto daq_ws = std::make_unique<MockDaqWorkspace>();
326 status.
id =
"TEST.ID";
327 status.
file_id =
"TEST.FILEID";
329 status.
error =
false;
331 EXPECT_CALL(*daq_ws, LoadStatus()).WillOnce(Return(status));
332 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
333 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{}));
334 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID"));
340 m_scheduler->AbortDaq(status.
id);
341 EXPECT_FALSE(m_scheduler->IsQueued(status.
id));
346 m_queue = {
"TEST.ID"};
348 auto daq_ws_init = std::make_unique<MockDaqWorkspace>();
349 auto daq_ws_abort = std::make_unique<MockDaqWorkspace>();
351 EXPECT_CALL(*daq_ws_init, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
352 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws_init))));
355 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
356 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
358 EXPECT_CALL(mock, Start());
364 m_scheduler->Start();
367 EXPECT_CALL(*daq_ws_abort, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
368 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws_abort))));
369 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID"));
370 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{}));
374 m_scheduler->AbortDaq(
"TEST.ID");
375 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
383 EXPECT_THROW(m_scheduler->AbortDaq(
"UNKOWN"), std::runtime_error);
388 m_queue = {
"TEST.ID"};
389 auto daq_ws = std::make_unique<MockDaqWorkspace>();
391 EXPECT_CALL(*daq_ws, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
392 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
398 auto status = m_scheduler->GetDaqStatus(
"TEST.ID");
400 EXPECT_EQ(status.state, m_status.GetState());
405 m_queue = {
"TEST.ID"};
406 Status archived_status(
"TEST.ID.ARCHIVED",
"TEST.ID.ARCHIVED");
408 EXPECT_CALL(m_ws_mock, LoadArchivedStatus(
"TEST.ID.ARCHIVED"))
409 .WillOnce(Return(archived_status));
414 ASSERT_FALSE(m_scheduler->IsQueued(
"TEST.ID.ARCHIVED"));
415 auto status = m_scheduler->GetDaqStatus(
"TEST.ID.ARCHIVED");
Stores data acquisition status and allows subscription to status changes.
State GetState() const noexcept
daq::dpm::MockWorkspace m_ws_mock
boost::asio::io_context m_io_ctx
std::vector< std::string > m_queue
rad::IoExecutor m_executor
SchedulerOptions m_options
std::unique_ptr< SchedulerImpl > m_scheduler
ObservableStatus m_status
FakeDaqControllerFactory m_daq_controller_factory
Adapts boost::asio::io_context into a compatible boost::thread Executor type.
Mocks for daq::dpm::Scheduler and daq::dpm::DaqScheduler.
TEST_F(TestDaqController, ScheduledTransitionsToCollecting)
Options controlling scheduler operations.
@ Completed
Completed DAQ.
@ Scheduled
daq is acknowledged by dpm and is scheduled for merging (i.e.
@ Collecting
Input files are being collected.
daq::dpm::Scheduler and related class declarations.
Non observable status object that keeps stores status of data acquisition.
std::unique_ptr< DaqController > operator()(std::unique_ptr< DaqWorkspace >, Resources &)
std::vector< DaqController * > daq_controllers
std::function< void(MockDaqController &)> Hook
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
ASSERT_TRUE(std::holds_alternative< OlasReceiver >(spec.receivers[0]))