mirror of
https://github.com/zeromq/cppzmq.git
synced 2024-12-12 18:40:28 +01:00
ae15964907
Currently cppzmq as relatively simple and header only library depends on rather complex unit test framework googletest. Current issues: - Googletest requires downloading and building it every time on travis as cache support is limited there - Googletest build is signifficant with comparison to cppzmq unittests total runtime Solution: Port existing tests to Catch - header only C++ framework and gain ~20% build speed up on travis. Why Catch? It is well know C++ header only testing framework. It works well, it is being kept up to date and maintainers seem to pay attention to community's comments and issues. We can not use Catch2 currently as we still support pre-C++11 compilers.
107 lines
2.3 KiB
C++
107 lines
2.3 KiB
C++
#include "testutil.hpp"
|
|
|
|
#ifdef ZMQ_CPP11
|
|
#include <thread>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
class mock_monitor_t : public zmq::monitor_t
|
|
{
|
|
public:
|
|
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};
|
|
};
|
|
|
|
#endif
|
|
|
|
TEST_CASE("monitor create destroy", "[monitor]")
|
|
{
|
|
zmq::monitor_t monitor;
|
|
}
|
|
|
|
#if defined(ZMQ_CPP11)
|
|
TEST_CASE("monitor init event count", "[monitor]")
|
|
{
|
|
common_server_client_setup s{false};
|
|
mock_monitor_t monitor;
|
|
|
|
const int expected_event_count = 2;
|
|
int event_count = 0;
|
|
auto count_event = [&event_count](const zmq_event_t &, const char *) {
|
|
++event_count;
|
|
};
|
|
|
|
monitor.init(s.client, "inproc://foo");
|
|
|
|
CHECK_FALSE(monitor.check_event(0));
|
|
s.init();
|
|
|
|
while (monitor.check_event(100) && monitor.total < expected_event_count) {
|
|
}
|
|
CHECK(monitor.connect_delayed == 1);
|
|
CHECK(monitor.connected == 1);
|
|
}
|
|
|
|
TEST_CASE("monitor init abort", "[monitor]")
|
|
{
|
|
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;
|
|
|
|
};
|
|
|
|
common_server_client_setup s(false);
|
|
|
|
std::mutex mutex;
|
|
std::condition_variable cond_var;
|
|
bool done{false};
|
|
|
|
mock_monitor monitor([&]() {
|
|
std::lock_guard<std::mutex> lock(mutex);
|
|
done = true;
|
|
cond_var.notify_one();
|
|
});
|
|
monitor.init(s.client, "inproc://foo");
|
|
|
|
auto thread = std::thread([&monitor] {
|
|
while (monitor.check_event(-1)) {
|
|
}
|
|
});
|
|
|
|
s.init();
|
|
{
|
|
std::unique_lock<std::mutex> lock(mutex);
|
|
CHECK(cond_var.wait_for(lock, std::chrono::seconds(1),
|
|
[&done] { return done; }));
|
|
}
|
|
CHECK(monitor.connect_delayed == 1);
|
|
CHECK(monitor.connected == 1);
|
|
monitor.abort();
|
|
thread.join();
|
|
}
|
|
#endif
|