Problem: no tests for monitor_t::abort

Solution: add a test and fix implementation of monitor_t::abort to make it usable
This commit is contained in:
Simon Giesecke 2018-06-05 10:18:05 +02:00
parent ec63fb3485
commit 58ffef7190
2 changed files with 41 additions and 5 deletions

View File

@ -2,6 +2,10 @@
#include <gmock/gmock.h>
#include <zmq.hpp>
#ifdef ZMQ_CPP11
#include <thread>
#endif
class mock_monitor_t : public zmq::monitor_t
{
public:
@ -40,3 +44,39 @@ TEST(monitor, init_check)
while (monitor.check_event(100)) {
}
}
#ifdef ZMQ_CPP11
TEST(monitor, init_abort)
{
zmq::context_t ctx;
zmq::socket_t bind_socket(ctx, zmq::socket_type::dealer);
bind_socket.bind("tcp://127.0.0.1:*");
char endpoint[255];
size_t endpoint_len = sizeof(endpoint);
bind_socket.getsockopt(ZMQ_LAST_ENDPOINT, &endpoint, &endpoint_len);
zmq::socket_t connect_socket(ctx, zmq::socket_type::dealer);
mock_monitor_t monitor;
monitor.init(connect_socket, "inproc://foo");
EXPECT_CALL(monitor, on_event_connect_delayed(testing::_, testing::_))
.Times(testing::AtLeast(1));
EXPECT_CALL(monitor, on_event_connected(testing::_, testing::_))
.Times(testing::AtLeast(1));
auto thread = std::thread([&monitor] {
while (monitor.check_event(-1)) {
}
});
connect_socket.connect(endpoint);
std::this_thread::sleep_for(std::chrono::milliseconds(250));
// TODO instead of sleeping an arbitrary amount of time, we should better
// wait until the expectations have met. How can this be done with
// googlemock?
monitor.abort();
thread.join();
}
#endif

View File

@ -849,7 +849,7 @@ class monitor_t
#ifdef ZMQ_EVENT_MONITOR_STOPPED
if (event->event == ZMQ_EVENT_MONITOR_STOPPED) {
zmq_msg_close(&eventMsg);
return true;
return false;
}
#endif
@ -923,11 +923,7 @@ class monitor_t
if (socketPtr)
zmq_socket_monitor(socketPtr, NULL, 0);
if (monitor_socket)
zmq_close(monitor_socket);
socketPtr = NULL;
monitor_socket = NULL;
}
#endif
virtual void on_monitor_started() {}