ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
testDpmClient.cpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup daq_ocm_libdaq_test
4 * @copyright 2023 ESO - European Southern Observatory
5 *
6 * @brief `daq::DpmClientImpl` tests
7 */
8#include <daq/config.hpp>
9
10#include <optional>
11
12#include <gmock/gmock.h>
13#include <gtest/gtest.h>
14
15#include "mock/daqifMock.hpp"
16#include "mock/malMock.hpp"
17
18#include <daq/dpmClient.hpp>
19#include <daq/json.hpp>
20
21using namespace ::testing;
22
23namespace daq {
24class TestDpmClient : public Test {
25public:
26 void SetUp() {
27 m_params.ps_uri = "zpb.ps://127.0.0.1:1234";
28 m_params.rr_uri = "zpb.rr://127.0.0.1:1234";
29 m_params.timeout = std::chrono::seconds(0);
30 m_params.status_retry_interval = std::chrono::seconds(0);
31
32 Status s("id", "id");
33 {
34 nlohmann::json j = s;
35 m_status_1 = j.dump(2);
36 }
38 }
39
40 void PostSetUp() {
44
45 // DpmClient constructor sets up subscriptions for DaqStatus and StorageStatus.
46 EXPECT_CALL(
48 subscribeAsync(
50 EXPECT_CALL(
52 subscribeAsync(_, Matcher<SubscriberMock<daqif::StorageStatus>::DataEventListener>(_)));
53 EXPECT_CALL(m_mal, getClientUnsafe(_, _, _, _, _)).WillOnce(Return(m_daqif_client));
54 EXPECT_CALL(m_mal, getSubscriberUnsafe(_, "daqif_InternalDaqStatus", _, _, _))
55 .WillOnce(Return(m_status_subscriber));
56 EXPECT_CALL(m_mal, getSubscriberUnsafe(_, "daqif_StorageStatus", _, _, _))
57 .WillOnce(Return(m_storage_subscriber));
58
60 }
61
62 void PollOnce() {
63 m_io_ctx.restart();
64 m_io_ctx.poll();
65 }
66
67protected:
68 boost::asio::io_context m_io_ctx;
71 DpmDaqControlAsyncMock* m_daqif_client; // Ownership transferred via MalMock to DpmClientImpl
74
75 std::string m_status_1;
76 std::string m_status_2;
77 std::optional<DpmClientImpl> m_client;
78};
79
80TEST_F(TestDpmClient, StartMonitoringSendsRequestAndReceivesReply) {
81 // Setup
82 PostSetUp();
83
84 boost::promise<std::string> reply;
85
86 EXPECT_CALL(*m_daqif_client, GetInternalDaqStatus("id"))
87 .WillOnce(Return(ByMove(reply.get_future())));
88
89 // Run
90 m_client->StartMonitorStatus("id");
91 PollOnce();
92
93 reply.set_value(m_status_1);
94
95 PollOnce();
96}
97
98TEST_F(TestDpmClient, StartMonitoringSendsRequestAndRetriesOnTimeout) {
99 // Setup
100 PostSetUp();
101
102 boost::promise<std::string> reply1;
103 boost::promise<std::string> reply2;
104 InSequence s;
105
106 {
107 EXPECT_CALL(*m_daqif_client, GetInternalDaqStatus("id"))
108 .WillOnce(Return(ByMove(reply1.get_future())));
109
110 // Run
111 m_client->StartMonitorStatus("id");
112 PollOnce();
113 }
114
115 {
116 EXPECT_CALL(*m_daqif_client, GetInternalDaqStatus("id"))
117 .WillOnce(Return(ByMove(reply2.get_future())));
118 reply1.set_exception(elt::mal::TimeoutException("timeout"));
119 PollOnce();
120
121 reply2.set_value(m_status_1);
122 PollOnce();
123 }
124}
125
126} // namespace daq
boost::asio::io_context m_io_ctx
std::optional< DpmClientImpl > m_client
std::string m_status_2
DpmClientParams m_params
SubscriberMock< daqif::StorageStatus > * m_storage_subscriber
SubscriberMock< daqif::InternalDaqStatus > * m_status_subscriber
DpmDaqControlAsyncMock * m_daqif_client
std::string m_status_1
Declares JSON support for serialization.
daq::DpmClient
TEST_F(TestDpmClient, StartMonitoringSendsRequestAndReceivesReply)
std::chrono::seconds timeout
Definition: dpmClient.hpp:96
std::string rr_uri
Definition: dpmClient.hpp:94
std::string ps_uri
Definition: dpmClient.hpp:95
std::chrono::seconds status_retry_interval
Definition: dpmClient.hpp:97
Connection parameters for DPM.
Definition: dpmClient.hpp:93
Non observable status object that keeps stores status of data acquisition.
Definition: status.hpp:164
std::function< void(elt::mal::ps::Subscriber< T > &subscriber, const elt::mal::ps::DataEvent< T > &event)> DataEventListener
Definition: daqifMock.hpp:144