ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
testAsyncOpAwaitState.cpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup daq_ocm_libdaq_test
4 * @copyright 2022 ESO - European Southern Observatory
5 *
6 * @brief Unit test for op::AwaitStateAsync
7 */
8#include <daq/config.hpp>
9
10#include <gtest/gtest.h>
11#include <log4cplus/logger.h>
12
13#include <daq/error.hpp>
14#include <daq/op/awaitState.hpp>
15#include <daq/op/initiate.hpp>
16
17#include "utils.hpp"
18
19using namespace daq;
20using namespace ::testing;
21using namespace std::chrono_literals;
22
23/**
24 * @ingroup daq_ocm_libdaq_test
25 */
26struct TestAsyncOpAwaitState : ::testing::Test {
28 : m_io_ctx()
30 , m_status()
31 , m_logger(log4cplus::Logger::getInstance("test")) {
32 }
33
34 void SetUp() override {
35 m_status = std::make_shared<ObservableStatus>("id", "fileid");
36 }
37 void TearDown() override {
38 }
39
40 boost::asio::io_context m_io_ctx;
42 std::shared_ptr<daq::ObservableStatus> m_status;
43 log4cplus::Logger m_logger;
44};
45
46TEST_F(TestAsyncOpAwaitState, ConditionAlreadySatisfiedReturnsReadyFuture) {
47 // Test
48 op::AwaitStateAsync op(m_io_ctx, m_status, State::NotStarted, 100ms, m_logger);
49 auto fut = op.Initiate();
50 ASSERT_TRUE(fut.is_ready());
51 auto result = fut.get();
52 EXPECT_FALSE(result.error);
53 EXPECT_EQ(result.result, *m_status);
54}
55
56TEST_F(TestAsyncOpAwaitState, ConditionSatisfiedByStateChange) {
57 // Setup
58 // Test
59 auto [fut, abort] = op::InitiateAbortableOperation<op::AwaitStateAsync>(
60 m_executor, m_io_ctx, m_status, State::Acquiring, 100ms, m_logger);
61 (void)abort;
62
63 EXPECT_FALSE(fut.is_ready());
64 m_io_ctx.poll();
65 EXPECT_FALSE(fut.is_ready());
66
67 m_status->SetState(State::Acquiring);
68 MakeTestProgress(m_io_ctx, &fut);
69 ASSERT_TRUE(fut.is_ready());
70
71 auto result = fut.get();
72 EXPECT_FALSE(result.error);
73 EXPECT_EQ(result.result, *m_status);
74}
75
76TEST_F(TestAsyncOpAwaitState, ConditionTimesOut) {
77 // Setup
78 // Test
79 auto [fut, abort] = op::InitiateAbortableOperation<op::AwaitStateAsync>(
80 m_executor, m_io_ctx, m_status, State::Acquiring, 0ms, m_logger);
81 (void)abort;
82
83 MakeTestProgress(m_io_ctx, &fut);
84 ASSERT_TRUE(fut.is_ready());
85
86 auto result = fut.get();
87 EXPECT_TRUE(result.error);
88 EXPECT_EQ(result.result, *m_status);
89}
90
91TEST_F(TestAsyncOpAwaitState, OperationAborted) {
92 // Setup
93 // Test
94 auto [fut, abort] = op::InitiateAbortableOperation<op::AwaitStateAsync>(
95 m_executor, m_io_ctx, m_status, State::Acquiring, 100ms, m_logger);
96
97 abort();
98 MakeTestProgress(m_io_ctx, &fut);
99 ASSERT_TRUE(fut.is_ready());
100
101 EXPECT_THROW(fut.get(), DaqOperationAborted);
102}
103
104TEST_F(TestAsyncOpAwaitState, ConditionSatisfiedAtTimeout) {
105 // Setup
106 // Test
107 auto [fut, abort] = op::InitiateAbortableOperation<op::AwaitStateAsync>(
108 m_executor, m_io_ctx, m_status, State::Acquiring, 0ms, m_logger);
109 (void)abort;
110
111 // Hack to bypass observer notification
112 auto& mut_status = const_cast<Status&>(m_status->GetStatus());
113 mut_status.state = State::Acquiring;
114
115 MakeTestProgress(m_io_ctx, &fut);
116 ASSERT_TRUE(fut.is_ready());
117
118 auto result = fut.get();
119 EXPECT_FALSE(result.error);
120 EXPECT_EQ(result.result, *m_status);
121}
Contains declaration for the AwaitStateAsync operation.
Started operation was aborted.
Definition: error.hpp:48
Adapts boost::asio::io_context into a compatible boost::thread Executor type.
Definition: ioExecutor.hpp:12
Contains error related declarations for DAQ.
boost::asio::io_context m_io_ctx
std::shared_ptr< daq::ObservableStatus > m_status
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...
Definition: utils.hpp:44
Contains declarations for the helper functions to initiate operations.
Non observable status object that keeps stores status of data acquisition.
Definition: status.hpp:164
State state
Definition: status.hpp:186
Async operation to await Data Acquisition state.
Definition: awaitState.hpp:32
boost::future< ResultType > Initiate()
Initiates operation that await state.
Definition: awaitState.cpp:33
TEST_F(TestAsyncOpAwaitState, ConditionAlreadySatisfiedReturnsReadyFuture)
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
ASSERT_TRUE(std::holds_alternative< OlasReceiver >(spec.receivers[0]))
Defines shared test utilities.