Skip to content

Commit 2dcab86

Browse files
committed
add test for using active poller on monitor
1 parent 224bfca commit 2dcab86

File tree

1 file changed

+90
-3
lines changed

1 file changed

+90
-3
lines changed

tests/monitor.cpp

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
class mock_monitor_t : public zmq::monitor_t
1010
{
11-
public:
11+
public:
1212

1313
void on_event_connected(const zmq_event_t &, const char *) ZMQ_OVERRIDE
1414
{
@@ -89,7 +89,7 @@ TEST_CASE("monitor init abort", "[monitor]")
8989
{
9090
class mock_monitor : public mock_monitor_t
9191
{
92-
public:
92+
public:
9393
mock_monitor(std::function<void(void)> handle_connected) :
9494
handle_connected{std::move(handle_connected)}
9595
{
@@ -128,7 +128,7 @@ TEST_CASE("monitor init abort", "[monitor]")
128128
{
129129
std::unique_lock<std::mutex> lock(mutex);
130130
CHECK(cond_var.wait_for(lock, std::chrono::seconds(1),
131-
[&done] { return done; }));
131+
[&done] { return done; }));
132132
}
133133
CHECK(monitor.connected == 1);
134134
monitor.abort();
@@ -150,3 +150,90 @@ TEST_CASE("monitor from move assigned socket", "[monitor]")
150150
// failing
151151
}
152152
#endif
153+
154+
#if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) \
155+
&& !defined(ZMQ_CPP11_PARTIAL) && defined(ZMQ_HAVE_POLLER)
156+
#include "zmq_addon.hpp"
157+
using namespace std::literals::chrono_literals;
158+
159+
TEST_CASE("poll monitor events using active poller", "[monitor]")
160+
{
161+
// define necessary class for test
162+
class test_monitor : public zmq::monitor_t
163+
{
164+
public:
165+
void init(zmq::socket_t &socket,
166+
const char *const addr_,
167+
int events = ZMQ_EVENT_ALL)
168+
{
169+
zmq::monitor_t::init(socket, addr_, events);
170+
}
171+
172+
void addToPoller(zmq::active_poller_t &inActivePoller)
173+
{
174+
inActivePoller.add(
175+
_monitor_socket, zmq::event_flags::pollin,
176+
[&](zmq::event_flags ef) { process_event(static_cast<short>(ef)); });
177+
}
178+
179+
void on_event_accepted(const zmq_event_t &event_,
180+
const char *addr_) override
181+
{
182+
clientAccepted++;
183+
}
184+
void on_event_disconnected(const zmq_event_t &event,
185+
const char *const addr) override
186+
{
187+
clientDisconnected++;
188+
}
189+
190+
int clientAccepted = 0;
191+
int clientDisconnected = 0;
192+
};
193+
194+
//Arrange
195+
int messageCounter = 0;
196+
const char monitorAddress[] = "inproc://monitor-server";
197+
198+
auto addToPoller = [&](zmq::socket_t &socket, zmq::active_poller_t &poller) {
199+
poller.add(socket, zmq::event_flags::pollin, [&](zmq::event_flags ef) {
200+
zmq::message_t msg;
201+
auto result = socket.recv(msg, zmq::recv_flags::dontwait);
202+
messageCounter++;
203+
});
204+
};
205+
206+
common_server_client_setup sockets(false);
207+
208+
test_monitor monitor;
209+
monitor.init(sockets.server, monitorAddress);
210+
211+
zmq::active_poller_t poller;
212+
monitor.addToPoller(poller);
213+
addToPoller(sockets.server, poller);
214+
215+
sockets.init();
216+
sockets.client.send(zmq::message_t(0), zmq::send_flags::dontwait);
217+
CHECK(monitor.clientAccepted == 0);
218+
CHECK(monitor.clientDisconnected == 0);
219+
220+
//Act
221+
for (int i = 0; i < 10; i++) {
222+
poller.wait(10ms);
223+
}
224+
CHECK(monitor.clientAccepted == 1);
225+
CHECK(monitor.clientDisconnected == 0);
226+
227+
sockets.client.close();
228+
229+
for (int i = 0; i < 10; i++) {
230+
poller.wait(10ms);
231+
}
232+
sockets.server.close();
233+
234+
// Assert
235+
CHECK(messageCounter == 1);
236+
CHECK(monitor.clientAccepted == 1);
237+
CHECK(monitor.clientDisconnected == 1);
238+
}
239+
#endif

0 commit comments

Comments
 (0)