Skip to content

Commit 8b64a34

Browse files
committed
Add requirement that the handler is non-null in active_poller
1 parent e9c5546 commit 8b64a34

File tree

2 files changed

+34
-25
lines changed

2 files changed

+34
-25
lines changed

tests/active_poller.cpp

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ static_assert(!std::is_copy_constructible<zmq::active_poller_t>::value,
1818
static_assert(!std::is_copy_assignable<zmq::active_poller_t>::value,
1919
"active_active_poller_t should not be copy-assignable");
2020

21+
static const zmq::active_poller_t::handler_type no_op_handler =
22+
[](zmq::event_flags) {};
23+
2124
TEST_CASE("move construct empty", "[active_poller]")
2225
{
2326
zmq::active_poller_t a;
@@ -63,7 +66,7 @@ TEST_CASE("move assign non empty", "[active_poller]")
6366
zmq::socket_t socket{context, zmq::socket_type::router};
6467

6568
zmq::active_poller_t a;
66-
a.add(socket, zmq::event_flags::pollin, [](zmq::event_flags) {});
69+
a.add(socket, zmq::event_flags::pollin, no_op_handler);
6770
CHECK_FALSE(a.empty());
6871
CHECK(1u == a.size());
6972
zmq::active_poller_t b;
@@ -75,12 +78,22 @@ TEST_CASE("move assign non empty", "[active_poller]")
7578
}
7679

7780
TEST_CASE("add handler", "[active_poller]")
81+
{
82+
zmq::context_t context;
83+
zmq::socket_t socket{context, zmq::socket_type::router};
84+
zmq::active_poller_t active_poller;
85+
CHECK_NOTHROW(
86+
active_poller.add(socket, zmq::event_flags::pollin, no_op_handler));
87+
}
88+
89+
TEST_CASE("add null handler fails", "[active_poller]")
7890
{
7991
zmq::context_t context;
8092
zmq::socket_t socket{context, zmq::socket_type::router};
8193
zmq::active_poller_t active_poller;
8294
zmq::active_poller_t::handler_type handler;
83-
CHECK_NOTHROW(active_poller.add(socket, zmq::event_flags::pollin, handler));
95+
CHECK_THROWS_AS(active_poller.add(socket, zmq::event_flags::pollin, handler),
96+
const std::invalid_argument &);
8497
}
8598

8699
#if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 0)
@@ -90,11 +103,10 @@ TEST_CASE("add handler invalid events type", "[active_poller]")
90103
zmq::context_t context;
91104
zmq::socket_t socket{context, zmq::socket_type::router};
92105
zmq::active_poller_t active_poller;
93-
zmq::active_poller_t::handler_type handler;
94106
short invalid_events_type = 2 << 10;
95107
CHECK_THROWS_AS(
96108
active_poller.add(socket, static_cast<zmq::event_flags>(invalid_events_type),
97-
handler),
109+
no_op_handler),
98110
const zmq::error_t &);
99111
CHECK(active_poller.empty());
100112
CHECK(0u == active_poller.size());
@@ -106,15 +118,16 @@ TEST_CASE("add handler twice throws", "[active_poller]")
106118
zmq::context_t context;
107119
zmq::socket_t socket{context, zmq::socket_type::router};
108120
zmq::active_poller_t active_poller;
109-
zmq::active_poller_t::handler_type handler;
110-
active_poller.add(socket, zmq::event_flags::pollin, handler);
111-
CHECK_THROWS_ZMQ_ERROR(EINVAL, active_poller.add(socket, zmq::event_flags::pollin, handler));
121+
active_poller.add(socket, zmq::event_flags::pollin, no_op_handler);
122+
CHECK_THROWS_ZMQ_ERROR(
123+
EINVAL, active_poller.add(socket, zmq::event_flags::pollin, no_op_handler));
112124
}
113125

114126
TEST_CASE("wait with no handlers throws", "[active_poller]")
115127
{
116128
zmq::active_poller_t active_poller;
117-
CHECK_THROWS_ZMQ_ERROR(EFAULT, active_poller.wait(std::chrono::milliseconds{10}));
129+
CHECK_THROWS_ZMQ_ERROR(EFAULT,
130+
active_poller.wait(std::chrono::milliseconds{10}));
118131
}
119132

120133
TEST_CASE("remove unregistered throws", "[active_poller]")
@@ -130,8 +143,7 @@ TEST_CASE("remove registered empty", "[active_poller]")
130143
zmq::context_t context;
131144
zmq::socket_t socket{context, zmq::socket_type::router};
132145
zmq::active_poller_t active_poller;
133-
active_poller.add(socket, zmq::event_flags::pollin,
134-
zmq::active_poller_t::handler_type{});
146+
active_poller.add(socket, zmq::event_flags::pollin, no_op_handler);
135147
CHECK_NOTHROW(active_poller.remove(socket));
136148
}
137149

@@ -140,7 +152,7 @@ TEST_CASE("remove registered non empty", "[active_poller]")
140152
zmq::context_t context;
141153
zmq::socket_t socket{context, zmq::socket_type::router};
142154
zmq::active_poller_t active_poller;
143-
active_poller.add(socket, zmq::event_flags::pollin, [](zmq::event_flags) {});
155+
active_poller.add(socket, zmq::event_flags::pollin, no_op_handler);
144156
CHECK_NOTHROW(active_poller.remove(socket));
145157
}
146158

@@ -223,8 +235,7 @@ TEST_CASE("add invalid socket throws", "[active_poller]")
223235
zmq::active_poller_t active_poller;
224236
zmq::socket_t a{context, zmq::socket_type::router};
225237
zmq::socket_t b{std::move(a)};
226-
CHECK_THROWS_AS(active_poller.add(a, zmq::event_flags::pollin,
227-
zmq::active_poller_t::handler_type{}),
238+
CHECK_THROWS_AS(active_poller.add(a, zmq::event_flags::pollin, no_op_handler),
228239
const zmq::error_t &);
229240
}
230241

@@ -233,8 +244,8 @@ TEST_CASE("remove invalid socket throws", "[active_poller]")
233244
zmq::context_t context;
234245
zmq::socket_t socket{context, zmq::socket_type::router};
235246
zmq::active_poller_t active_poller;
236-
CHECK_NOTHROW(active_poller.add(socket, zmq::event_flags::pollin,
237-
zmq::active_poller_t::handler_type{}));
247+
CHECK_NOTHROW(
248+
active_poller.add(socket, zmq::event_flags::pollin, no_op_handler));
238249
CHECK(1u == active_poller.size());
239250
std::vector<zmq::socket_t> sockets;
240251
sockets.emplace_back(std::move(socket));
@@ -247,8 +258,8 @@ TEST_CASE("wait on added empty handler", "[active_poller]")
247258
server_client_setup s;
248259
CHECK_NOTHROW(s.client.send(zmq::message_t{hi_str}, zmq::send_flags::none));
249260
zmq::active_poller_t active_poller;
250-
zmq::active_poller_t::handler_type handler;
251-
CHECK_NOTHROW(active_poller.add(s.server, zmq::event_flags::pollin, handler));
261+
CHECK_NOTHROW(
262+
active_poller.add(s.server, zmq::event_flags::pollin, no_op_handler));
252263
CHECK_NOTHROW(active_poller.wait(std::chrono::milliseconds{-1}));
253264
}
254265

@@ -277,8 +288,7 @@ TEST_CASE("modify not added throws", "[active_poller]")
277288
zmq::socket_t a{context, zmq::socket_type::push};
278289
zmq::socket_t b{context, zmq::socket_type::push};
279290
zmq::active_poller_t active_poller;
280-
CHECK_NOTHROW(active_poller.add(a, zmq::event_flags::pollin,
281-
zmq::active_poller_t::handler_type{}));
291+
CHECK_NOTHROW(active_poller.add(a, zmq::event_flags::pollin, no_op_handler));
282292
CHECK_THROWS_AS(active_poller.modify(b, zmq::event_flags::pollin),
283293
const zmq::error_t &);
284294
}
@@ -288,8 +298,7 @@ TEST_CASE("modify simple", "[active_poller]")
288298
zmq::context_t context;
289299
zmq::socket_t a{context, zmq::socket_type::push};
290300
zmq::active_poller_t active_poller;
291-
CHECK_NOTHROW(active_poller.add(a, zmq::event_flags::pollin,
292-
zmq::active_poller_t::handler_type{}));
301+
CHECK_NOTHROW(active_poller.add(a, zmq::event_flags::pollin, no_op_handler));
293302
CHECK_NOTHROW(
294303
active_poller.modify(a, zmq::event_flags::pollin | zmq::event_flags::pollout));
295304
}
@@ -342,8 +351,7 @@ TEST_CASE("wait on move constructed active_poller", "[active_poller]")
342351
server_client_setup s;
343352
CHECK_NOTHROW(s.client.send(zmq::message_t{hi_str}, zmq::send_flags::none));
344353
zmq::active_poller_t a;
345-
zmq::active_poller_t::handler_type handler;
346-
CHECK_NOTHROW(a.add(s.server, zmq::event_flags::pollin, handler));
354+
CHECK_NOTHROW(a.add(s.server, zmq::event_flags::pollin, no_op_handler));
347355
zmq::active_poller_t b{std::move(a)};
348356
CHECK(1u == b.size());
349357
CHECK(0u == a.size());
@@ -356,8 +364,7 @@ TEST_CASE("wait on move assigned active_poller", "[active_poller]")
356364
server_client_setup s;
357365
CHECK_NOTHROW(s.client.send(zmq::message_t{hi_str}, zmq::send_flags::none));
358366
zmq::active_poller_t a;
359-
zmq::active_poller_t::handler_type handler;
360-
CHECK_NOTHROW(a.add(s.server, zmq::event_flags::pollin, handler));
367+
CHECK_NOTHROW(a.add(s.server, zmq::event_flags::pollin, no_op_handler));
361368
zmq::active_poller_t b;
362369
b = {std::move(a)};
363370
CHECK(1u == b.size());

zmq_addon.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ class active_poller_t
673673

674674
void add(zmq::socket_ref socket, event_flags events, handler_type handler)
675675
{
676+
if (!handler)
677+
throw std::invalid_argument("null handler in active_poller_t::add");
676678
auto it = decltype(handlers)::iterator{};
677679
auto inserted = bool{};
678680
std::tie(it, inserted) = handlers.emplace(

0 commit comments

Comments
 (0)