2018-07-05 00:46:47 +02:00
|
|
|
#include "testutil.hpp"
|
2018-06-04 10:41:17 +02:00
|
|
|
|
2018-06-05 10:18:05 +02:00
|
|
|
#ifdef ZMQ_CPP11
|
|
|
|
#include <thread>
|
2018-07-05 00:46:47 +02:00
|
|
|
#include <mutex>
|
|
|
|
#include <condition_variable>
|
2018-06-05 10:18:05 +02:00
|
|
|
|
2018-06-04 10:41:17 +02:00
|
|
|
class mock_monitor_t : public zmq::monitor_t
|
|
|
|
{
|
|
|
|
public:
|
2018-09-23 18:14:25 +02:00
|
|
|
void on_event_connect_delayed(const zmq_event_t &, const char *) ZMQ_OVERRIDE
|
|
|
|
{
|
|
|
|
++connect_delayed;
|
|
|
|
++total;
|
|
|
|
}
|
|
|
|
|
|
|
|
void on_event_connected(const zmq_event_t &, const char *) ZMQ_OVERRIDE
|
|
|
|
{
|
|
|
|
++connected;
|
|
|
|
++total;
|
|
|
|
}
|
|
|
|
|
|
|
|
int total{0};
|
|
|
|
int connect_delayed{0};
|
|
|
|
int connected{0};
|
2018-06-04 10:41:17 +02:00
|
|
|
};
|
|
|
|
|
2018-09-23 18:14:25 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
TEST_CASE("monitor create destroy", "[monitor]")
|
2018-06-04 10:41:17 +02:00
|
|
|
{
|
|
|
|
zmq::monitor_t monitor;
|
|
|
|
}
|
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
#if defined(ZMQ_CPP11)
|
2018-09-23 18:14:25 +02:00
|
|
|
TEST_CASE("monitor init event count", "[monitor]")
|
2018-06-04 10:41:17 +02:00
|
|
|
{
|
2018-07-05 00:46:47 +02:00
|
|
|
common_server_client_setup s{false};
|
|
|
|
mock_monitor_t monitor;
|
2018-06-04 10:41:17 +02:00
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
const int expected_event_count = 2;
|
|
|
|
int event_count = 0;
|
|
|
|
auto count_event = [&event_count](const zmq_event_t &, const char *) {
|
|
|
|
++event_count;
|
|
|
|
};
|
2018-06-04 10:41:17 +02:00
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
monitor.init(s.client, "inproc://foo");
|
2018-06-04 10:41:17 +02:00
|
|
|
|
2018-09-23 18:14:25 +02:00
|
|
|
CHECK_FALSE(monitor.check_event(0));
|
2018-07-05 00:46:47 +02:00
|
|
|
s.init();
|
2018-06-04 10:41:17 +02:00
|
|
|
|
2018-09-23 18:14:25 +02:00
|
|
|
while (monitor.check_event(100) && monitor.total < expected_event_count) {
|
2018-06-04 10:41:17 +02:00
|
|
|
}
|
2018-09-23 18:14:25 +02:00
|
|
|
CHECK(monitor.connect_delayed == 1);
|
|
|
|
CHECK(monitor.connected == 1);
|
2018-06-04 10:41:17 +02:00
|
|
|
}
|
2018-06-05 10:18:05 +02:00
|
|
|
|
2018-09-23 18:14:25 +02:00
|
|
|
TEST_CASE("monitor init abort", "[monitor]")
|
2018-06-05 10:18:05 +02:00
|
|
|
{
|
2018-09-23 18:14:25 +02:00
|
|
|
class mock_monitor : public mock_monitor_t
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
mock_monitor(std::function<void(void)> handle_connected)
|
|
|
|
: handle_connected{std::move(handle_connected)}
|
|
|
|
{}
|
|
|
|
|
|
|
|
void on_event_connected(const zmq_event_t &e, const char *m) ZMQ_OVERRIDE
|
|
|
|
{
|
|
|
|
mock_monitor_t::on_event_connected(e, m);
|
|
|
|
handle_connected();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::function<void(void)> handle_connected;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
common_server_client_setup s(false);
|
2018-06-05 10:18:05 +02:00
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
std::mutex mutex;
|
|
|
|
std::condition_variable cond_var;
|
|
|
|
bool done{false};
|
2018-06-05 10:18:05 +02:00
|
|
|
|
2018-09-23 18:14:25 +02:00
|
|
|
mock_monitor monitor([&]() {
|
2018-07-05 00:46:47 +02:00
|
|
|
std::lock_guard<std::mutex> lock(mutex);
|
|
|
|
done = true;
|
|
|
|
cond_var.notify_one();
|
2018-09-23 18:14:25 +02:00
|
|
|
});
|
|
|
|
monitor.init(s.client, "inproc://foo");
|
2018-06-05 10:18:05 +02:00
|
|
|
|
|
|
|
auto thread = std::thread([&monitor] {
|
|
|
|
while (monitor.check_event(-1)) {
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-07-05 00:46:47 +02:00
|
|
|
s.init();
|
|
|
|
{
|
|
|
|
std::unique_lock<std::mutex> lock(mutex);
|
2018-09-23 18:14:25 +02:00
|
|
|
CHECK(cond_var.wait_for(lock, std::chrono::seconds(1),
|
2018-07-05 00:46:47 +02:00
|
|
|
[&done] { return done; }));
|
|
|
|
}
|
2018-09-23 18:14:25 +02:00
|
|
|
CHECK(monitor.connect_delayed == 1);
|
|
|
|
CHECK(monitor.connected == 1);
|
2018-06-05 10:18:05 +02:00
|
|
|
monitor.abort();
|
|
|
|
thread.join();
|
|
|
|
}
|
|
|
|
#endif
|