3 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && !defined(ZMQ_CPP11_PARTIAL) && defined(ZMQ_HAVE_POLLER)
9 static_assert(std::is_nothrow_swappable_v<zmq::poller_t<>>);
18 static_assert(!std::is_copy_constructible<zmq::poller_t<>>::
value,
19 "poller_t should not be copy-constructible");
20 static_assert(!std::is_copy_assignable<zmq::poller_t<>>::
value,
21 "poller_t should not be copy-assignable");
25 CHECK((zmq::event_flags::pollin | zmq::event_flags::pollout)
27 CHECK((zmq::event_flags::pollin & zmq::event_flags::pollout)
29 CHECK((zmq::event_flags::pollin ^ zmq::event_flags::pollout)
31 CHECK(~zmq::event_flags::pollin ==
static_cast<zmq::event_flags
>(~
ZMQ_POLLIN));
34 TEST_CASE(
"poller create destroy",
"[poller]")
37 #ifdef ZMQ_CPP17 // CTAD
43 TEST_CASE(
"poller move construct empty",
"[poller]")
46 zmq::poller_t<>
b = std::move(
a);
49 TEST_CASE(
"poller move assign empty",
"[poller]")
64 TEST_CASE(
"poller move construct non empty",
"[poller]")
70 a.add(socket, zmq::event_flags::pollin);
71 zmq::poller_t<>
b = std::move(
a);
74 TEST_CASE(
"poller move assign non empty",
"[poller]")
80 a.add(socket, zmq::event_flags::pollin);
85 TEST_CASE(
"poller add nullptr",
"[poller]")
89 zmq::poller_t<void> poller;
90 CHECK_NOTHROW(poller.add(socket, zmq::event_flags::pollin,
nullptr));
93 TEST_CASE(
"poller add non nullptr",
"[poller]")
97 zmq::poller_t<int> poller;
99 CHECK_NOTHROW(poller.add(socket, zmq::event_flags::pollin, &
i));
102 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 0)
104 TEST_CASE(
"poller add handler invalid events type",
"[poller]")
108 zmq::poller_t<> poller;
109 short invalid_events_type = 2 << 10;
111 poller.add(socket,
static_cast<zmq::event_flags
>(invalid_events_type)),
116 TEST_CASE(
"poller add handler twice throws",
"[poller]")
120 zmq::poller_t<> poller;
121 poller.add(socket, zmq::event_flags::pollin);
123 CHECK_THROWS_AS(poller.add(socket, zmq::event_flags::pollin),
127 TEST_CASE(
"poller wait with no handlers throws",
"[poller]")
129 zmq::poller_t<> poller;
130 std::vector<zmq::poller_event<>> events;
132 CHECK_THROWS_AS(poller.wait_all(events, std::chrono::milliseconds{10}),
136 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 3)
137 TEST_CASE(
"poller add/remove size checks",
"[poller]")
141 zmq::poller_t<> poller;
142 CHECK(poller.size() == 0);
143 poller.add(socket, zmq::event_flags::pollin);
144 CHECK(poller.size() == 1);
145 CHECK_NOTHROW(poller.remove(socket));
146 CHECK(poller.size() == 0);
150 TEST_CASE(
"poller remove unregistered throws",
"[poller]")
154 zmq::poller_t<> poller;
159 TEST_CASE(
"poller remove registered empty",
"[poller]")
163 zmq::poller_t<> poller;
164 poller.add(socket, zmq::event_flags::pollin);
165 CHECK_NOTHROW(poller.remove(socket));
168 TEST_CASE(
"poller remove registered non empty",
"[poller]")
172 zmq::poller_t<int> poller;
174 poller.add(socket, zmq::event_flags::pollin, &empty);
175 CHECK_NOTHROW(poller.remove(socket));
180 TEST_CASE(
"poller poll basic",
"[poller]")
182 common_server_client_setup
s;
184 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
186 zmq::poller_t<int> poller;
187 std::vector<zmq::poller_event<int>> events{1};
189 CHECK_NOTHROW(poller.add(
s.server, zmq::event_flags::pollin, &
i));
190 CHECK(1 == poller.wait_all(events, std::chrono::milliseconds{-1}));
191 CHECK(
s.server == events[0].socket);
192 CHECK(&
i == events[0].user_data);
195 TEST_CASE(
"poller poll basic static array",
"[poller]")
197 common_server_client_setup
s;
199 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
201 zmq::poller_t<int> poller;
202 std::array<zmq::poller_event<int>, 1> events;
204 CHECK_NOTHROW(poller.add(
s.server, zmq::event_flags::pollin, &
i));
205 CHECK(1 == poller.wait_all(events, std::chrono::milliseconds{-1}));
206 CHECK(
s.server == events[0].socket);
207 CHECK(&
i == events[0].user_data);
210 TEST_CASE(
"poller add invalid socket throws",
"[poller]")
213 zmq::poller_t<> poller;
216 CHECK_THROWS_AS(poller.add(
a, zmq::event_flags::pollin),
zmq::error_t);
219 TEST_CASE(
"poller remove invalid socket throws",
"[poller]")
223 zmq::poller_t<> poller;
224 CHECK_NOTHROW(poller.add(socket, zmq::event_flags::pollin));
225 std::vector<zmq::socket_t> sockets;
226 sockets.emplace_back(std::move(socket));
228 CHECK_NOTHROW(poller.remove(sockets[0]));
231 TEST_CASE(
"poller modify empty throws",
"[poller]")
235 zmq::poller_t<> poller;
236 CHECK_THROWS_AS(poller.modify(socket, zmq::event_flags::pollin),
240 TEST_CASE(
"poller modify invalid socket throws",
"[poller]")
245 zmq::poller_t<> poller;
246 CHECK_THROWS_AS(poller.modify(
a, zmq::event_flags::pollin),
zmq::error_t);
249 TEST_CASE(
"poller modify not added throws",
"[poller]")
254 zmq::poller_t<> poller;
255 CHECK_NOTHROW(poller.add(
a, zmq::event_flags::pollin));
256 CHECK_THROWS_AS(poller.modify(
b, zmq::event_flags::pollin),
zmq::error_t);
259 TEST_CASE(
"poller modify simple",
"[poller]")
263 zmq::poller_t<> poller;
264 CHECK_NOTHROW(poller.add(
a, zmq::event_flags::pollin));
266 poller.modify(
a, zmq::event_flags::pollin | zmq::event_flags::pollout));
269 TEST_CASE(
"poller poll client server",
"[poller]")
272 common_server_client_setup
s;
275 zmq::poller_t<zmq::socket_t> poller;
276 CHECK_NOTHROW(poller.add(
s.server, zmq::event_flags::pollin, &
s.server));
279 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
282 std::vector<zmq::poller_event<zmq::socket_t>> events(1);
283 CHECK(1 == poller.wait_all(events, std::chrono::milliseconds{500}));
284 CHECK(zmq::event_flags::pollin == events[0].events);
288 poller.modify(
s.server, zmq::event_flags::pollin | zmq::event_flags::pollout
290 CHECK(1 == poller.wait_all(events, std::chrono::milliseconds{500}));
291 CHECK((zmq::event_flags::pollin | zmq::event_flags::pollout) == events[0].events)
295 TEST_CASE(
"poller wait one return",
"[poller]")
298 common_server_client_setup
s;
301 zmq::poller_t<> poller;
302 CHECK_NOTHROW(poller.add(
s.server, zmq::event_flags::pollin));
305 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
308 std::vector<zmq::poller_event<>> events(1);
309 CHECK(1 == poller.wait_all(events, std::chrono::milliseconds{500}));
312 TEST_CASE(
"poller wait on move constructed",
"[poller]")
314 common_server_client_setup
s;
315 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
317 CHECK_NOTHROW(
a.add(
s.server, zmq::event_flags::pollin));
318 zmq::poller_t<>
b{std::move(
a)};
319 std::vector<zmq::poller_event<>> events(1);
321 CHECK_THROWS_AS(
a.wait_all(events, std::chrono::milliseconds{10}),
323 CHECK(1 ==
b.wait_all(events, std::chrono::milliseconds{-1}));
326 TEST_CASE(
"poller wait on move assigned",
"[poller]")
328 common_server_client_setup
s;
329 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
331 CHECK_NOTHROW(
a.add(
s.server, zmq::event_flags::pollin));
335 std::vector<zmq::poller_event<>> events(1);
336 CHECK_THROWS_AS(
a.wait_all(events, std::chrono::milliseconds{10}),
338 CHECK(1 ==
b.wait_all(events, std::chrono::milliseconds{-1}));
341 TEST_CASE(
"poller remove from handler",
"[poller]")
343 constexpr
size_t ITER_NO = 10;
346 std::vector<common_server_client_setup> setup_list;
347 for (
size_t i = 0;
i < ITER_NO; ++
i)
348 setup_list.emplace_back(common_server_client_setup{});
351 zmq::poller_t<> poller;
352 for (
size_t i = 0;
i < ITER_NO; ++
i) {
353 CHECK_NOTHROW(poller.add(setup_list[
i].server, zmq::event_flags::pollin));
356 for (
auto &s : setup_list) {
357 CHECK_NOTHROW(
s.client.send(
zmq::message_t{hi_str}, zmq::send_flags::none));
361 for (
auto &s : setup_list) {
367 std::vector<zmq::poller_event<>> events(ITER_NO);
368 CHECK(ITER_NO == poller.wait_all(events, std::chrono::milliseconds{-1}));