6 #include <condition_variable>
30 #if defined(ZMQ_CPP11)
31 TEST_CASE(
"monitor move construct",
"[monitor]")
35 SECTION(
"move ctor empty") {
39 SECTION(
"move ctor init") {
41 monitor1.
init(
sock,
"inproc://monitor-client");
46 TEST_CASE(
"monitor move assign",
"[monitor]")
50 SECTION(
"move assign empty") {
53 monitor1 = std::move(monitor2);
55 SECTION(
"move assign init") {
57 monitor1.
init(
sock,
"inproc://monitor-client");
59 monitor2 = std::move(monitor1);
61 SECTION(
"move assign init both") {
63 monitor1.
init(
sock,
"inproc://monitor-client");
66 monitor2.
init(sock2,
"inproc://monitor-client2");
67 monitor2 = std::move(monitor1);
71 TEST_CASE(
"monitor init event count",
"[monitor]")
73 common_server_client_setup
s{
false};
74 mock_monitor_t monitor;
76 const int expected_event_count = 1;
77 monitor.init(
s.client,
"inproc://foo");
79 CHECK_FALSE(monitor.check_event(0));
82 while (monitor.check_event(1000) && monitor.total < expected_event_count) {
84 CHECK(monitor.connected == 1);
85 CHECK(monitor.total == expected_event_count);
88 TEST_CASE(
"monitor init abort",
"[monitor]")
90 class mock_monitor :
public mock_monitor_t
93 mock_monitor(std::function<
void(
void)> handle_connected) :
94 handle_connected{std::move(handle_connected)}
100 mock_monitor_t::on_event_connected(e,
m);
104 std::function<
void(
void)> handle_connected;
107 common_server_client_setup
s(
false);
110 std::condition_variable cond_var;
113 mock_monitor monitor([&]()
115 std::lock_guard<std::mutex> lock(mutex);
117 cond_var.notify_one();
119 monitor.init(
s.client,
"inproc://foo");
121 auto thread = std::thread([&monitor]
123 while (monitor.check_event(-1)) {
129 std::unique_lock<std::mutex> lock(mutex);
130 CHECK(cond_var.wait_for(lock, std::chrono::seconds(1),
131 [&done] { return done; }));
133 CHECK(monitor.connected == 1);
139 TEST_CASE(
"monitor from move assigned socket",
"[monitor]")
143 sock = std::move([&ctx] {
148 monitor1.
init(
sock,
"inproc://monitor-client");
154 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) \
155 && !defined(ZMQ_CPP11_PARTIAL) && defined(ZMQ_HAVE_POLLER)
158 TEST_CASE(
"poll monitor events using active poller",
"[monitor]")
165 const char *
const addr_,
171 void addToPoller(zmq::active_poller_t &inActivePoller)
175 [&](zmq::event_flags ef) {
process_event(
static_cast<short>(ef)); });
183 const char *
const addr)
override
185 clientDisconnected++;
188 int clientAccepted = 0;
189 int clientDisconnected = 0;
193 int messageCounter = 0;
194 const char monitorAddress[] =
"inproc://monitor-server";
196 auto addToPoller = [&](
zmq::socket_t &socket, zmq::active_poller_t &poller) {
197 poller.add(socket, zmq::event_flags::pollin, [&](zmq::event_flags ef) {
199 auto result = socket.recv(msg, zmq::recv_flags::dontwait);
204 common_server_client_setup sockets(
false);
206 test_monitor monitor;
207 monitor.init(sockets.server, monitorAddress,
210 zmq::active_poller_t poller;
211 monitor.addToPoller(poller);
212 addToPoller(sockets.server, poller);
215 sockets.client.send(
zmq::message_t(0), zmq::send_flags::dontwait);
216 CHECK(monitor.clientAccepted == 0);
217 CHECK(monitor.clientDisconnected == 0);
220 for (
int i = 0;
i < 100;
i++) {
221 poller.wait(std::chrono::milliseconds(50));
222 if (monitor.clientAccepted > 0) {
226 CHECK(monitor.clientAccepted == 1);
227 CHECK(monitor.clientDisconnected == 0);
229 sockets.client.close();
231 for (
int i = 0;
i < 100;
i++) {
232 poller.wait(std::chrono::milliseconds(50));
233 if (monitor.clientDisconnected > 0) {
237 sockets.server.close();
240 CHECK(messageCounter == 1);
241 CHECK(monitor.clientAccepted == 1);
242 CHECK(monitor.clientDisconnected == 1);