ifw-daq  3.0.1
IFW Data Acquisition modules
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 #include <thread>
12 
13 #include <gmock/gmock.h>
14 #include <gtest/gtest.h>
15 
16 #include "mock/daqifMock.hpp"
17 #include "mock/malMock.hpp"
18 
19 #include <daq/dpmClient.hpp>
20 
21 using namespace ::testing;
22 
23 namespace daq {
24 class TestDpmClient : public Test {
25 public:
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  m_status_1 = std::make_shared<daq::DaqStatusFake>();
33  m_status_2 = std::make_shared<daq::DaqStatusFake>();
34  }
35 
36  void PostSetUp() {
40 
41  // DpmClient constructor sets up subscriptions for DaqStatus and StorageStatus.
42  EXPECT_CALL(
44  subscribeAsync(_, Matcher<SubscriberMock<daqif::DaqStatus>::DataEventListener>(_)));
45  EXPECT_CALL(
47  subscribeAsync(_, Matcher<SubscriberMock<daqif::StorageStatus>::DataEventListener>(_)));
48  EXPECT_CALL(m_mal, getClientUnsafe(_, _, _, _, _)).WillOnce(Return(m_daqif_client));
49  EXPECT_CALL(m_mal, getSubscriberUnsafe(_, "daqif_DaqStatus", _, _, _))
50  .WillOnce(Return(m_status_subscriber));
51  EXPECT_CALL(m_mal, getSubscriberUnsafe(_, "daqif_StorageStatus", _, _, _))
52  .WillOnce(Return(m_storage_subscriber));
53 
54  m_client.emplace(m_io_ctx, m_mal, m_params);
55  }
56 
57  void PollOnce() {
58  m_io_ctx.restart();
59  m_io_ctx.poll();
60  }
61 
62 protected:
63  boost::asio::io_context m_io_ctx;
66  DpmDaqControlAsyncMock* m_daqif_client; // Ownership transferred via MalMock to DpmClientImpl
69 
70  std::shared_ptr<daqif::DaqStatus> m_status_1;
71  std::shared_ptr<daqif::DaqStatus> m_status_2;
72  std::optional<DpmClientImpl> m_client;
73 };
74 
75 TEST_F(TestDpmClient, StartMonitoringSendsRequestAndReceivesReply) {
76  // Setup
77  PostSetUp();
78 
79  boost::promise<std::shared_ptr<daqif::DaqStatus>> reply;
80 
81  EXPECT_CALL(*m_daqif_client, GetDaqStatus("id")).WillOnce(Return(ByMove(reply.get_future())));
82 
83  // Run
84  m_client->StartMonitorStatus("id");
85  PollOnce();
86 
87  reply.set_value(m_status_1);
88 
89  PollOnce();
90 }
91 
92 TEST_F(TestDpmClient, StartMonitoringSendsRequestAndRetriesOnTimeout) {
93  // Setup
94  PostSetUp();
95 
96  boost::promise<std::shared_ptr<daqif::DaqStatus>> reply1;
97  boost::promise<std::shared_ptr<daqif::DaqStatus>> reply2;
98  InSequence s;
99 
100  {
101  EXPECT_CALL(*m_daqif_client, GetDaqStatus("id"))
102  .WillOnce(Return(ByMove(reply1.get_future())));
103 
104  // Run
105  m_client->StartMonitorStatus("id");
106  PollOnce();
107  }
108 
109  {
110  EXPECT_CALL(*m_daqif_client, GetDaqStatus("id"))
111  .WillOnce(Return(ByMove(reply2.get_future())));
112  reply1.set_exception(elt::mal::TimeoutException("timeout"));
113  PollOnce();
114 
115  reply2.set_value(m_status_1);
116  PollOnce();
117  }
118 }
119 
120 } // namespace daq
boost::asio::io_context m_io_ctx
std::shared_ptr< daqif::DaqStatus > m_status_2
SubscriberMock< daqif::DaqStatus > * m_status_subscriber
std::optional< DpmClientImpl > m_client
std::shared_ptr< daqif::DaqStatus > m_status_1
DpmClientParams m_params
SubscriberMock< daqif::StorageStatus > * m_storage_subscriber
DpmDaqControlAsyncMock * m_daqif_client
daq::DpmClient
TEST_F(TestDpmClient, StartMonitoringSendsRequestAndReceivesReply)
std::chrono::seconds timeout
Definition: dpmClient.hpp:95
std::string rr_uri
Definition: dpmClient.hpp:93
std::string ps_uri
Definition: dpmClient.hpp:94
std::chrono::seconds status_retry_interval
Definition: dpmClient.hpp:96
Connection parameters for DPM.
Definition: dpmClient.hpp:92