ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
testStatus.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 Test daq::Status and daq::ObservableStatus
7 */
8#include <daq/status.hpp>
9#include <gmock/gmock.h>
10#include <gtest/gtest.h>
11
12#include "statusObserver.hpp"
13
14using namespace ::testing;
15using namespace daq;
16
17/**
18 * ObservableStatus test fixture.
19 *
20 * @ingroup daq_ocm_libdaq_test
21 */
22class TestObservableStatus : public ::testing::Test {
23public:
24};
25
27 ObservableStatus s("id", "fileid");
28}
29
31 ObservableStatus s1("id", "fileid");
32 ObservableStatus s2("id", "fileid");
33 ObservableStatus s3("id", "fileid");
34 s3.SetAlert(MakeAlert("cat", "key", "description"));
35 EXPECT_EQ(s1, s2);
36 EXPECT_NE(s1, s3);
37}
38
40 ObservableStatus s("id", "fileid");
41
42 EXPECT_EQ(State::NotStarted, s.GetState()) << "Default state should be State::NotStarted";
43 EXPECT_FALSE(HasError(s)) << "By default error flag should be false";
44
45 s.SetState(State::Starting);
46 EXPECT_EQ(State::Starting, s.GetState());
47}
48
49TEST_F(TestObservableStatus, OstreamOperator) {
50 ObservableStatus s("id", "fileid");
51 std::stringstream ss;
52 ss << s;
53 EXPECT_THAT(
54 ss.str(),
55 MatchesRegex("ObservableStatus\\(id='id', file_id='fileid', state=.*, error=false\\)"));
56}
57
59 // Setup
60 InSequence seq; // Mock expectations must occur in sequence
61
63 ObservableStatus s("id", "fileid");
64
65 auto time = Status::Clock::now();
66
67 s.ConnectObserver(std::reference_wrapper(o));
68 EXPECT_CALL(o, CallOperator(Property(&ObservableStatus::GetState, State::Starting)));
69 EXPECT_CALL(o, CallOperator(Property(&ObservableStatus::GetState, State::Acquiring)));
70 EXPECT_CALL(o, CallOperator(Property(&ObservableStatus::GetTimestamp, time)));
71
72 // Test
73 s.SetState(State::Starting);
74 s.SetState(State::Acquiring);
75
76 auto new_status = s.GetStatus();
77 new_status.timestamp = time;
78 // Assigning complete status which should then use the timestamp from that status.
79 s = new_status;
80}
81
82TEST(TestStatus, OstreamOperator) {
83 Status s("id", "fileid");
84 // Note that epoch is not really portable so this test may break on non-linux platforms
85 s.timestamp = std::chrono::time_point<std::chrono::system_clock>(
86 std::chrono::nanoseconds(1693899318896895717));
87 std::stringstream ss;
88 ss << s;
89 EXPECT_THAT(ss.str(),
90 MatchesRegex("Status\\(id='id', file_id='fileid', state=.*, error=false, "
91 "result=''\\, timestamp=2023-09-05T07:35:18.896)"));
92}
93
94TEST(TestStatus, Comparison) {
95 Status s1("id", "fileid");
96 Status s2("id", "fileid");
97 Status s3("id", "fileid");
98 EXPECT_FALSE(HasError(s3));
99 s3.alerts.push_back(MakeAlert("cat", "key", "description"));
100
101 EXPECT_TRUE(HasError(s3));
102 EXPECT_EQ(s1, s2);
103 EXPECT_NE(s1, s3);
104}
105
106TEST(TestStatus, Alerts) {
107 Status s1("id", "fileid");
108 Alert alert = {};
109 alert.id.category = "cat";
110 alert.id.key = "key";
111 alert.description = "description";
112
113 SetAlert(s1.alerts, alert);
114 ASSERT_EQ(1, s1.alerts.size());
115 EXPECT_EQ(s1.alerts[0], alert);
116 EXPECT_EQ(s1.alerts[0].description, "description");
117
118 auto alert2 = alert;
119 alert2.id.key = "different key";
120
121 SetAlert(s1.alerts, alert2);
122
123 ASSERT_EQ(2, s1.alerts.size());
124
125 alert.description = "new description";
126 SetAlert(s1.alerts, alert);
127 EXPECT_EQ(s1.alerts[0].description, "new description");
128
129 // Remove alert1 which leaves alert2
130 ClearAlert(s1.alerts, alert.id);
131 ASSERT_EQ(1, s1.alerts.size());
132 EXPECT_EQ(s1.alerts[0], alert2);
133}
134
135TEST(TestAlertId, Comparison) {
136 AlertId alert1 = {};
137 alert1.category = "cat";
138 alert1.key = "key";
139 EXPECT_EQ(alert1, alert1);
140
141 auto alert2 = alert1;
142 alert2.key = "different key";
143 EXPECT_NE(alert1, alert2);
144
145 auto alert3 = alert1;
146 alert3.category = "different category";
147 EXPECT_NE(alert1, alert3);
148}
149
150TEST(TestAlert, Comparison) {
151 Alert alert1 = {};
152 alert1.id.category = "cat";
153 alert1.id.key = "key";
154 alert1.description = "description";
155 EXPECT_EQ(alert1, alert1);
156
157 auto alert2 = alert1;
158 alert2.id.key = "different key";
159 EXPECT_NE(alert1, alert2);
160
161 auto alert3 = alert1;
162 alert3.id.category = "different category";
163 EXPECT_NE(alert1, alert3);
164}
Stores data acquisition status and allows subscription to status changes.
Definition: status.hpp:224
boost::signals2::connection ConnectObserver(Observer o)
Connect observer that is invoked when state is modified.
Definition: status.hpp:406
State GetState() const noexcept
Definition: status.cpp:297
Status const & GetStatus() const noexcept
Connect observer that is invoked when state is modified.
Definition: status.cpp:371
void SetState(State s) noexcept
Set state of data acquisition.
Definition: status.cpp:305
Status::Clock::time_point GetTimestamp() const noexcept
Definition: status.cpp:289
void SetAlert(Alert alert)
Set alert.
Definition: status.cpp:336
ObservableStatus test fixture.
Definition: testStatus.cpp:22
Simple observer used for testing.
AlertId id
Definition: status.hpp:99
std::string key
Unique key for each alert.
Definition: status.hpp:76
std::string description
Definition: status.hpp:100
bool HasError(Status const &status) noexcept
Definition: status.cpp:179
std::string category
Standardized category.
Definition: status.hpp:72
void SetAlert(std::vector< Alert > &alerts, Alert alert)
Set alert.
Definition: status.cpp:20
bool ClearAlert(std::vector< Alert > &alerts, AlertId const &alert)
Clear alert.
Definition: status.cpp:31
State
Observable states of the data acquisition process.
Definition: state.hpp:41
std::vector< Alert > Alerts
Definition: status.hpp:104
Alert MakeAlert(std::string_view category, std::string key, std::string description)
Construct alert.
Definition: status.cpp:45
Describes an active Data Acquisition alert.
Definition: status.hpp:95
Uniquely identfies an alert.
Definition: status.hpp:68
Contains declaration for Status and ObservableStatus.
Non observable status object that keeps stores status of data acquisition.
Definition: status.hpp:164
std::vector< Alert > alerts
Active alerts.
Definition: status.hpp:190
TimePoint timestamp
Timestamp of last update.
Definition: status.hpp:207
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")
ASSERT_EQ(meta.keyword_rules.size(), 1u)
TEST_F(TestObservableStatus, Construct)
Definition: testStatus.cpp:26
TEST(TestStatus, OstreamOperator)
Definition: testStatus.cpp:82