18#include "mock/mockWorkspace.hpp"
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
28 auto daq = std::make_unique<MockDaqController>();
80 "fileId": "TEST.FILEID",
83 "location": "dcs-host:/path/to/somefile.fits",
84 "path": "dcs/somefile.fits"
91 "location": "fcs-host:/path/to/somefile.fits",
92 "path": "fcs/somefile.fits"
97 "type": "olasReceiver",
99 "path": "/remote/olas/"
102 "type": "olasReceiver",
103 "path": "/local/olas/"
128using namespace ::testing;
132 EXPECT_CALL(m_ws_mock, LoadQueue()).WillOnce(Return(m_queue));
138 auto daq_ws = std::make_unique<MockDaqWorkspace>();
140 status.
id =
"TEST.ID";
141 status.
file_id =
"TEST.FILEID";
144 EXPECT_CALL(*daq_ws, StoreStatus(status));
145 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
146 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
147 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}));
152 m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status));
153 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
156 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status)), std::invalid_argument);
157 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
162 auto daq_ws = std::make_unique<MockDaqWorkspace>();
164 status.
id =
"TEST.ID";
165 status.
file_id =
"TEST.FILEID";
168 Sequence init, rollback;
170 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
172 EXPECT_CALL(*daq_ws, StoreStatus(status));
173 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
174 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
175 .InSequence(init, rollback)
176 .WillOnce(Return(ByMove(std::move(daq_ws))));
177 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}))
178 .InSequence(init, rollback)
179 .WillRepeatedly(Throw(std::runtime_error(
"FAILED")));
182 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
187 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status)), std::exception);
188 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
193 auto daq_ws = std::make_unique<MockDaqWorkspace>();
195 status.
id =
"TEST.ID";
196 status.
file_id =
"TEST.FILEID";
199 Sequence init, rollback;
201 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
203 EXPECT_CALL(*daq_ws, StoreStatus(status));
204 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str))
205 .WillOnce(Throw(std::runtime_error(
"ERROR")));
207 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
208 .InSequence(init, rollback)
209 .WillOnce(Return(ByMove(std::move(daq_ws))));
212 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
217 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status)), std::exception);
218 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
224 status.
id =
"TEST.ID";
225 status.
file_id =
"TEST.FILEID";
227 Sequence init, rollback;
228 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
230 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID"))
231 .InSequence(init, rollback)
232 .WillRepeatedly(Throw(std::runtime_error(
"ERROR")));
235 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID")).InSequence(rollback);
240 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status)), std::exception);
241 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
247 status.
id =
"TEST.ID";
248 status.
file_id =
"TEST.FILEID";
250 Sequence init, rollback;
251 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
253 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).Times(0);
258 EXPECT_THROW(m_scheduler->QueueDaq(
"not a specification", SerializeStatus(status)),
259 std::invalid_argument);
260 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
265 Sequence init, rollback;
266 EXPECT_CALL(m_ws_mock, GetPath()).Times(AnyNumber()).WillRepeatedly(Return(
"/tmp/workspace"));
268 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).Times(0);
273 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str,
"not a status"), std::invalid_argument);
274 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
280 m_scheduler->Start();
282 auto daq_ws = std::make_unique<MockDaqWorkspace>();
284 status.
id =
"TEST.ID";
285 status.
file_id =
"TEST.FILEID";
288 EXPECT_CALL(*daq_ws, StoreStatus(status));
289 EXPECT_CALL(*daq_ws, StoreSpecification(m_spec_str));
290 EXPECT_CALL(m_ws_mock, InitializeDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
291 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{
"TEST.ID"}));
293 m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status));
294 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
297 EXPECT_THROW(m_scheduler->QueueDaq(m_spec_str, SerializeStatus(status)), std::invalid_argument);
298 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
302 daq_ws = std::make_unique<MockDaqWorkspace>();
303 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
305 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
306 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
308 EXPECT_CALL(mock, Start());
317 m_queue = {
"TEST.ID"};
320 auto daq_ws = std::make_unique<MockDaqWorkspace>();
323 EXPECT_TRUE(m_scheduler->IsQueued(
"TEST.ID"));
326 daq_ws = std::make_unique<MockDaqWorkspace>();
328 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
329 EXPECT_CALL(m_ws_mock, ArchiveDaq(
"TEST.ID"));
330 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>()));
333 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
334 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
335 EXPECT_CALL(mock, GetState())
341 EXPECT_CALL(mock, Start()).WillOnce(Invoke([&]() { m_status.SetState(
State::Completed); }));
346 m_scheduler->Start();
352 m_queue = {
"TEST.ID"};
354 auto daq_ws = std::make_unique<MockDaqWorkspace>();
356 status.
id =
"TEST.ID";
357 status.
file_id =
"TEST.FILEID";
360 EXPECT_CALL(*daq_ws, LoadStatus()).WillOnce(Return(status));
361 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
362 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{}));
363 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID"));
369 m_scheduler->AbortDaq(status.
id);
370 EXPECT_FALSE(m_scheduler->IsQueued(status.
id));
375 m_queue = {
"TEST.ID"};
377 auto daq_ws_init = std::make_unique<MockDaqWorkspace>();
378 auto daq_ws_abort = std::make_unique<MockDaqWorkspace>();
380 EXPECT_CALL(*daq_ws_init, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
381 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws_init))));
384 EXPECT_CALL(mock, GetStatus()).WillOnce(ReturnRef(m_status));
385 EXPECT_CALL(mock, GetId()).WillRepeatedly(ReturnRef(m_status.GetId()));
387 EXPECT_CALL(mock, Start());
393 m_scheduler->Start();
396 EXPECT_CALL(*daq_ws_abort, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
397 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws_abort))));
398 EXPECT_CALL(m_ws_mock, RemoveDaq(
"TEST.ID"));
399 EXPECT_CALL(m_ws_mock, StoreQueue(std::vector<std::string>{}));
403 m_scheduler->AbortDaq(
"TEST.ID");
404 EXPECT_FALSE(m_scheduler->IsQueued(
"TEST.ID"));
412 EXPECT_THROW(m_scheduler->AbortDaq(
"UNKOWN"), std::runtime_error);
417 m_queue = {
"TEST.ID"};
418 auto daq_ws = std::make_unique<MockDaqWorkspace>();
420 EXPECT_CALL(*daq_ws, LoadStatus()).WillRepeatedly(Return(m_status.GetStatus()));
421 EXPECT_CALL(m_ws_mock, LoadDaq(
"TEST.ID")).WillOnce(Return(ByMove(std::move(daq_ws))));
427 auto status = m_scheduler->GetDaqStatus(
"TEST.ID");
429 EXPECT_EQ(status.state, m_status.GetState());
434 m_queue = {
"TEST.ID"};
435 Status archived_status(
"TEST.ID.ARCHIVED",
"TEST.ID.ARCHIVED");
437 EXPECT_CALL(m_ws_mock, LoadArchivedStatus(
"TEST.ID.ARCHIVED"))
438 .WillOnce(Return(archived_status));
443 ASSERT_FALSE(m_scheduler->IsQueued(
"TEST.ID.ARCHIVED"));
444 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
auto SerializeStatus(Status const &status) const -> std::string
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.
Declares JSON support for serialization.
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]))