test_poller.cpp 22.6 KB
Newer Older
1
/*
2
    Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

    This file is part of libzmq, the ZeroMQ core engine in C++.

    libzmq is free software; you can redistribute it and/or modify it under
    the terms of the GNU Lesser General Public License (LGPL) as published
    by the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    As a special exception, the Contributors give you permission to link
    this library with independent modules to produce an executable,
    regardless of the license terms of these independent modules, and to
    copy and distribute the resulting executable under terms of your choice,
    provided that you also meet, for each linked independent module, the
    terms and conditions of the license of that module. An independent
    module is a module which is not derived from or based on this library.
    If you modify this library, you must extend this exception to your
    version of the library.

    libzmq is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "testutil.hpp"
31 32 33
#include "testutil_unity.hpp"

#include <unity.h>
34
#include <limits.h>
35 36 37 38 39 40 41 42 43 44

void setUp ()
{
    setup_test_context ();
}

void tearDown ()
{
    teardown_test_context ();
}
45

46
fd_t get_fd (void *socket_)
47 48 49
{
    fd_t fd;
    size_t fd_size = sizeof fd;
50
    TEST_ASSERT_SUCCESS_ERRNO (zmq_getsockopt (socket_, ZMQ_FD, &fd, &fd_size));
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    return fd;
}

void test_null_poller_pointers_destroy_direct ()
{
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_destroy (NULL));
}

void test_null_poller_pointers_destroy_indirect ()
{
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_destroy (&null_poller));
}

void test_null_poller_pointers_add_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_add (NULL, socket, NULL, ZMQ_POLLIN));
    test_context_socket_close (socket);
}

void test_null_poller_pointers_add_indirect ()
{
    void *null_poller = NULL;
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (
      EFAULT, zmq_poller_add (&null_poller, socket, NULL, ZMQ_POLLIN));
    test_context_socket_close (socket);
}

void test_null_poller_pointers_modify_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_modify (NULL, socket, ZMQ_POLLIN));
    test_context_socket_close (socket);
}

void test_null_poller_pointers_modify_indirect ()
91 92
{
    void *null_poller = NULL;
93 94 95 96 97
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (
      EFAULT, zmq_poller_modify (&null_poller, socket, ZMQ_POLLIN));
    test_context_socket_close (socket);
}
98

99 100 101 102 103 104
void test_null_poller_pointers_remove_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_remove (NULL, socket));
    test_context_socket_close (socket);
}
105

106 107 108 109 110 111 112 113
void test_null_poller_pointers_remove_indirect ()
{
    void *null_poller = NULL;
    void *socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_remove (&null_poller, socket));
    test_context_socket_close (socket);
}
114

115 116 117 118
void test_null_poller_pointers_add_fd_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
119

120 121 122 123
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_add_fd (NULL, fd, NULL, ZMQ_POLLIN));
    test_context_socket_close (socket);
}
124

125 126 127 128 129 130 131 132 133
void test_null_poller_pointers_add_fd_indirect ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (
      EFAULT, zmq_poller_add_fd (&null_poller, fd, NULL, ZMQ_POLLIN));
    test_context_socket_close (socket);
}
134

135 136 137 138 139 140 141 142
void test_null_poller_pointers_modify_fd_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_modify_fd (NULL, fd, ZMQ_POLLIN));
    test_context_socket_close (socket);
}
143

144 145 146 147 148 149 150 151 152
void test_null_poller_pointers_modify_fd_indirect ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (
      EFAULT, zmq_poller_modify_fd (&null_poller, fd, ZMQ_POLLIN));
    test_context_socket_close (socket);
}
153

154 155 156 157 158 159 160
void test_null_poller_pointers_remove_fd_direct ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_remove_fd (NULL, fd));
    test_context_socket_close (socket);
}
161

162 163 164 165 166 167 168 169 170 171 172
void test_null_poller_pointers_remove_fd_indirect ()
{
    void *socket = test_context_socket (ZMQ_PAIR);
    const fd_t fd = get_fd (socket);
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_remove_fd (&null_poller, fd));
    test_context_socket_close (socket);
}

void test_null_poller_pointers_wait_direct ()
{
173
    zmq_poller_event_t event;
174 175
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_wait (NULL, &event, 0));
}
176

177 178 179 180 181 182 183
void test_null_poller_pointers_wait_indirect ()
{
    zmq_poller_event_t event;
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_wait (&null_poller, &event, 0));
}
184

185 186 187 188 189 190 191 192 193 194 195 196 197
void test_null_poller_pointers_wait_all_direct ()
{
    zmq_poller_event_t event;
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
                               zmq_poller_wait_all (NULL, &event, 1, 0));
}

void test_null_poller_pointers_wait_all_indirect ()
{
    zmq_poller_event_t event;
    void *null_poller = NULL;
    TEST_ASSERT_FAILURE_ERRNO (
      EFAULT, zmq_poller_wait_all (&null_poller, &event, 1, 0));
198 199 200 201 202
}

void test_null_socket_pointers ()
{
    void *poller = zmq_poller_new ();
203
    TEST_ASSERT_NOT_NULL (poller);
204

205 206
    TEST_ASSERT_FAILURE_ERRNO (ENOTSOCK,
                               zmq_poller_add (poller, NULL, NULL, ZMQ_POLLIN));
207

208 209
    TEST_ASSERT_FAILURE_ERRNO (ENOTSOCK,
                               zmq_poller_modify (poller, NULL, ZMQ_POLLIN));
210

211
    TEST_ASSERT_FAILURE_ERRNO (ENOTSOCK, zmq_poller_remove (poller, NULL));
212

213
    fd_t null_socket_fd = retired_fd;
214

215 216
    TEST_ASSERT_FAILURE_ERRNO (
      EBADF, zmq_poller_add_fd (poller, null_socket_fd, NULL, ZMQ_POLLIN));
217

218 219
    TEST_ASSERT_FAILURE_ERRNO (
      EBADF, zmq_poller_modify_fd (poller, null_socket_fd, ZMQ_POLLIN));
220

221 222
    TEST_ASSERT_FAILURE_ERRNO (EBADF,
                               zmq_poller_remove_fd (poller, null_socket_fd));
223

224
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));
225 226
}

227
typedef void (*extra_poller_socket_func_t) (void *poller_, void *socket_);
228

229
void test_with_empty_poller (extra_poller_socket_func_t extra_func_)
230 231 232 233 234 235
{
    void *socket = test_context_socket (ZMQ_PAIR);

    void *poller = zmq_poller_new ();
    TEST_ASSERT_NOT_NULL (poller);

236
    extra_func_ (poller, socket);
237 238 239 240 241 242

    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));

    test_context_socket_close (socket);
}

243
typedef void (*extra_poller_func_t) (void *poller_);
244

245
void test_with_valid_poller (extra_poller_func_t extra_func_)
246
{
247
    void *socket = test_context_socket (ZMQ_PAIR);
248 249

    void *poller = zmq_poller_new ();
250 251 252 253 254
    TEST_ASSERT_NOT_NULL (poller);

    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_poller_add (poller, socket, NULL, ZMQ_POLLIN));

255
    extra_func_ (poller);
256

257
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));
258

259 260 261
    test_context_socket_close (socket);
}

262
void call_poller_wait_null_event_fails (void *poller_)
263
{
264
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_wait (poller_, NULL, 0));
265
}
266

267
void call_poller_wait_all_null_event_fails_event_count_nonzero (void *poller_)
268 269
{
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
270
                               zmq_poller_wait_all (poller_, NULL, 1, 0));
271
}
272

273
void call_poller_wait_all_null_event_fails_event_count_zero (void *poller_)
274 275
{
#if 0
276 277
    //  TODO this causes an assertion, which is not consistent if the number
    //  of events may be 0, the pointer should be allowed to by NULL in that
278
    //  case too
279
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait_all (poller, NULL, 0, 0));
280
#endif
281 282
}

283 284
#define TEST_CASE_FUNC_PARAM(name, func)                                       \
    void test_##name () { func (name); }
285

286 287 288 289 290
TEST_CASE_FUNC_PARAM (call_poller_wait_null_event_fails, test_with_valid_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_null_event_fails_event_count_nonzero,
                      test_with_valid_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_null_event_fails_event_count_zero,
                      test_with_valid_poller)
291

292
void call_poller_add_twice_fails (void *poller_, void *socket_)
293 294
{
    TEST_ASSERT_SUCCESS_ERRNO (
295
      zmq_poller_add (poller_, socket_, NULL, ZMQ_POLLIN));
296 297

    //  attempt to add the same socket twice
298
    TEST_ASSERT_FAILURE_ERRNO (
299
      EINVAL, zmq_poller_add (poller_, socket_, NULL, ZMQ_POLLIN));
300

301
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_remove (poller_, socket_));
302
}
303

304
void call_poller_remove_unregistered_fails (void *poller_, void *socket_)
305
{
306
    //  attempt to remove socket that is not present
307
    TEST_ASSERT_FAILURE_ERRNO (EINVAL, zmq_poller_remove (poller_, socket_));
308
}
309

310
void call_poller_modify_unregistered_fails (void *poller_, void *socket_)
311
{
312
    //  attempt to modify socket that is not present
313 314
    TEST_ASSERT_FAILURE_ERRNO (
      EINVAL, zmq_poller_modify (poller_, socket_, ZMQ_POLLIN));
315
}
316

317
void call_poller_add_no_events (void *poller_, void *socket_)
318
{
319 320
    //  add a socket with no events initially (may be activated later with
    //  zmq_poller_modify)
321
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_add (poller_, socket_, NULL, 0));
322 323 324
    //  TODO test that no events are signalled
}

325
void call_poller_modify_no_events (void *poller_, void *socket_)
326 327 328
{
    //  deactivates all events for a socket temporarily (may be activated again
    //  later with zmq_poller_modify)
329 330
    zmq_poller_add (poller_, socket_, NULL, ZMQ_POLLIN);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_modify (poller_, socket_, 0));
331
    //  TODO test that no events are signalled
332
}
333

334
void call_poller_add_fd_twice_fails (void *poller_, void * /*zeromq_socket*/)
335
{
336
    fd_t plain_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
337
    TEST_ASSERT_SUCCESS_ERRNO (
338
      zmq_poller_add_fd (poller_, plain_socket, NULL, ZMQ_POLLIN));
339 340

    //  attempt to add the same plain socket twice
341
    TEST_ASSERT_FAILURE_ERRNO (
342
      EINVAL, zmq_poller_add_fd (poller_, plain_socket, NULL, ZMQ_POLLIN));
343

344
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_remove_fd (poller_, plain_socket));
345

346 347 348
    TEST_ASSERT_SUCCESS_ERRNO (close (plain_socket));
}

349
void call_poller_remove_fd_unregistered_fails (void *poller_,
350 351 352 353
                                               void * /*zeromq_socket*/)
{
    fd_t plain_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

354
    //  attempt to remove plain socket that is not present
355
    TEST_ASSERT_FAILURE_ERRNO (EINVAL,
356
                               zmq_poller_remove_fd (poller_, plain_socket));
357

358 359
    TEST_ASSERT_SUCCESS_ERRNO (close (plain_socket));
}
360

361
void call_poller_modify_fd_unregistered_fails (void *poller_,
362 363 364
                                               void * /*zeromq_socket*/)
{
    fd_t plain_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
365

366 367
    //  attempt to remove plain socket that is not present
    TEST_ASSERT_FAILURE_ERRNO (
368
      EINVAL, zmq_poller_modify_fd (poller_, plain_socket, ZMQ_POLLIN));
369

370
    TEST_ASSERT_SUCCESS_ERRNO (close (plain_socket));
371 372
}

373
void call_poller_add_invalid_events_fails (void *poller_, void *zeromq_socket_)
374 375
{
    TEST_ASSERT_FAILURE_ERRNO (
376
      EINVAL, zmq_poller_add (poller_, zeromq_socket_, NULL, SHRT_MAX));
377 378
}

379 380
void call_poller_modify_invalid_events_fails (void *poller_,
                                              void *zeromq_socket_)
381
{
382 383
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_poller_add (poller_, zeromq_socket_, NULL, 0));
384 385

    TEST_ASSERT_FAILURE_ERRNO (
386
      EINVAL, zmq_poller_modify (poller_, zeromq_socket_, SHRT_MAX));
387 388
}

389
void call_poller_add_fd_invalid_events_fails (void *poller_,
390 391 392 393
                                              void * /*zeromq_socket*/)
{
    fd_t plain_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    TEST_ASSERT_FAILURE_ERRNO (
394
      EINVAL, zmq_poller_add_fd (poller_, plain_socket, NULL, SHRT_MAX));
395 396 397 398

    TEST_ASSERT_SUCCESS_ERRNO (close (plain_socket));
}

399
void call_poller_modify_fd_invalid_events_fails (void *poller_,
400 401 402 403
                                                 void * /*zeromq_socket*/)
{
    fd_t plain_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    TEST_ASSERT_SUCCESS_ERRNO (
404
      zmq_poller_add_fd (poller_, plain_socket, NULL, 0));
405
    TEST_ASSERT_FAILURE_ERRNO (
406
      EINVAL, zmq_poller_modify_fd (poller_, plain_socket, SHRT_MAX));
407 408 409 410

    TEST_ASSERT_SUCCESS_ERRNO (close (plain_socket));
}

411 412 413 414 415 416
TEST_CASE_FUNC_PARAM (call_poller_add_twice_fails, test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_remove_unregistered_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_modify_unregistered_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_add_no_events, test_with_empty_poller)
417
TEST_CASE_FUNC_PARAM (call_poller_modify_no_events, test_with_empty_poller)
418 419 420 421 422 423
TEST_CASE_FUNC_PARAM (call_poller_add_fd_twice_fails, test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_remove_fd_unregistered_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_modify_fd_unregistered_fails,
                      test_with_empty_poller)

424 425 426 427 428 429 430 431 432
TEST_CASE_FUNC_PARAM (call_poller_add_invalid_events_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_modify_invalid_events_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_add_fd_invalid_events_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_modify_fd_invalid_events_fails,
                      test_with_empty_poller)

433 434
void call_poller_wait_empty_with_timeout_fails (void *poller_,
                                                void * /*socket*/)
435 436
{
    zmq_poller_event_t event;
437
    // waiting on poller with no registered sockets should report error
438
    TEST_ASSERT_FAILURE_ERRNO (EAGAIN, zmq_poller_wait (poller_, &event, 0));
439
}
440

441
void call_poller_wait_empty_without_timeout_fails (void *poller_,
442 443 444
                                                   void * /*socket*/)
{
    zmq_poller_event_t event;
445
    //  this would never be able to return since no socket was registered, and should yield an error
446
    TEST_ASSERT_FAILURE_ERRNO (EFAULT, zmq_poller_wait (poller_, &event, -1));
447
}
448

449
void call_poller_wait_all_empty_negative_count_fails (void *poller_,
450 451 452
                                                      void * /*socket*/)
{
    zmq_poller_event_t event;
453
    TEST_ASSERT_FAILURE_ERRNO (EINVAL,
454
                               zmq_poller_wait_all (poller_, &event, -1, 0));
455
}
456

457
void call_poller_wait_all_empty_without_timeout_fails (void *poller_,
458 459 460
                                                       void * /*socket*/)
{
    zmq_poller_event_t event;
461
    TEST_ASSERT_FAILURE_ERRNO (EAGAIN,
462
                               zmq_poller_wait_all (poller_, &event, 0, 0));
463
}
464

465
void call_poller_wait_all_empty_with_timeout_fails (void *poller_,
466 467 468
                                                    void * /*socket*/)
{
    zmq_poller_event_t event;
469 470
    //  this would never be able to return since no socket was registered, and should yield an error
    TEST_ASSERT_FAILURE_ERRNO (EFAULT,
471
                               zmq_poller_wait_all (poller_, &event, 0, -1));
472 473
}

474 475 476 477 478 479 480 481 482 483 484
TEST_CASE_FUNC_PARAM (call_poller_wait_empty_with_timeout_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_empty_without_timeout_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_negative_count_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_without_timeout_fails,
                      test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_with_timeout_fails,
                      test_with_empty_poller)

485 486
void test_poll_basic ()
{
487
    //  Create few sockets
488 489
    void *vent = test_context_socket (ZMQ_PUSH);

490 491 492
    size_t len = MAX_SOCKET_STRING;
    char my_endpoint[MAX_SOCKET_STRING];
    bind_loopback_ipv4 (vent, my_endpoint, len);
493

494 495
    void *sink = test_context_socket (ZMQ_PULL);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sink, my_endpoint));
496 497

    //  Set up poller
498
    void *poller = zmq_poller_new ();
499 500

    // register sink
501
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_add (poller, sink, sink, ZMQ_POLLIN));
502

503
    //  Send a message
504 505
    const char *vent_sink_msg = "H";
    send_string_expect_success (vent, vent_sink_msg, 0);
506 507

    //  We expect a message only on the sink
508
    zmq_poller_event_t event;
509 510 511 512
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, -1));
    TEST_ASSERT_EQUAL_PTR (sink, event.socket);
    TEST_ASSERT_EQUAL_PTR (sink, event.user_data);
    recv_string_expect_success (sink, vent_sink_msg, 0);
513 514

    //  We expect timed out
515
    TEST_ASSERT_FAILURE_ERRNO (EAGAIN, zmq_poller_wait (poller, &event, 0));
516

517
    //  Stop polling sink
518
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_remove (poller, sink));
519

520 521 522 523 524
    //  Clean up
    test_context_socket_close (vent);
    test_context_socket_close (sink);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));
}
525

526 527 528 529 530 531 532 533 534 535 536
void test_poll_fd ()
{
    //  Create sockets
    void *vent = test_context_socket (ZMQ_PUSH);

    size_t len = MAX_SOCKET_STRING;
    char my_endpoint[MAX_SOCKET_STRING];
    bind_loopback_ipv4 (vent, my_endpoint, len);

    void *bowl = test_context_socket (ZMQ_PULL);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (bowl, my_endpoint));
537

538 539 540 541 542
    //  Set up poller
    void *poller = zmq_poller_new ();

    //  Check we can poll an FD
    const fd_t fd = get_fd (bowl);
543 544
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_poller_add_fd (poller, fd, bowl, ZMQ_POLLIN));
545 546

    zmq_poller_event_t event;
547 548 549 550 551
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 500));
    TEST_ASSERT_NULL (event.socket);
    TEST_ASSERT_EQUAL (fd, event.fd);
    TEST_ASSERT_EQUAL_PTR (bowl, event.user_data);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_remove_fd (poller, fd));
552

553 554 555 556 557 558 559 560 561
    //  Clean up
    test_context_socket_close (vent);
    test_context_socket_close (bowl);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));
}

void test_poll_client_server ()
{
562
#if defined(ZMQ_SERVER) && defined(ZMQ_CLIENT)
563 564 565 566 567 568 569 570 571 572 573 574
    //  Create sockets
    void *server = test_context_socket (ZMQ_SERVER);

    size_t len = MAX_SOCKET_STRING;
    char my_endpoint[MAX_SOCKET_STRING];
    bind_loopback_ipv4 (server, my_endpoint, len);

    void *client = test_context_socket (ZMQ_CLIENT);

    //  Set up poller
    void *poller = zmq_poller_new ();

575
    //  Polling on thread safe sockets
576 577
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_poller_add (poller, server, NULL, ZMQ_POLLIN));
578
    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (client, my_endpoint));
579 580 581

    const char *client_server_msg = "I";
    send_string_expect_success (client, client_server_msg, 0);
582 583

    zmq_poller_event_t event;
584 585 586 587
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 500));
    TEST_ASSERT_EQUAL_PTR (server, event.socket);
    TEST_ASSERT_NULL (event.user_data);
    recv_string_expect_success (server, client_server_msg, 0);
588

589
    //  Polling on pollout
590 591 592 593 594 595
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_poller_modify (poller, server, ZMQ_POLLOUT | ZMQ_POLLIN));
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 0));
    TEST_ASSERT_EQUAL_PTR (server, event.socket);
    TEST_ASSERT_NULL (event.user_data);
    TEST_ASSERT_EQUAL_INT (ZMQ_POLLOUT, event.events);
596 597

    //  Stop polling server
598
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_remove (poller, server));
599

600
    //  Clean up
601 602
    test_context_socket_close (server);
    test_context_socket_close (client);
603

604
    TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_destroy (&poller));
605
#endif
606
}
607

608 609 610
int main (void)
{
    setup_test_environment ();
611

612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
    UNITY_BEGIN ();
    RUN_TEST (test_null_poller_pointers_destroy_direct);
    RUN_TEST (test_null_poller_pointers_destroy_indirect);
    RUN_TEST (test_null_poller_pointers_add_direct);
    RUN_TEST (test_null_poller_pointers_add_indirect);
    RUN_TEST (test_null_poller_pointers_modify_direct);
    RUN_TEST (test_null_poller_pointers_modify_indirect);
    RUN_TEST (test_null_poller_pointers_remove_direct);
    RUN_TEST (test_null_poller_pointers_remove_indirect);
    RUN_TEST (test_null_poller_pointers_add_fd_direct);
    RUN_TEST (test_null_poller_pointers_add_fd_indirect);
    RUN_TEST (test_null_poller_pointers_modify_fd_direct);
    RUN_TEST (test_null_poller_pointers_modify_fd_indirect);
    RUN_TEST (test_null_poller_pointers_remove_fd_direct);
    RUN_TEST (test_null_poller_pointers_remove_fd_indirect);
    RUN_TEST (test_null_poller_pointers_wait_direct);
    RUN_TEST (test_null_poller_pointers_wait_indirect);
    RUN_TEST (test_null_poller_pointers_wait_all_direct);
    RUN_TEST (test_null_poller_pointers_wait_all_indirect);

    RUN_TEST (test_null_socket_pointers);

634 635 636 637 638 639 640 641
    RUN_TEST (test_call_poller_wait_null_event_fails);
    RUN_TEST (test_call_poller_wait_all_null_event_fails_event_count_nonzero);
    RUN_TEST (test_call_poller_wait_all_null_event_fails_event_count_zero);

    RUN_TEST (test_call_poller_add_twice_fails);
    RUN_TEST (test_call_poller_remove_unregistered_fails);
    RUN_TEST (test_call_poller_modify_unregistered_fails);
    RUN_TEST (test_call_poller_add_no_events);
642
    RUN_TEST (test_call_poller_modify_no_events);
643 644 645
    RUN_TEST (test_call_poller_add_fd_twice_fails);
    RUN_TEST (test_call_poller_remove_fd_unregistered_fails);
    RUN_TEST (test_call_poller_modify_fd_unregistered_fails);
646 647 648 649
    RUN_TEST (test_call_poller_add_invalid_events_fails);
    RUN_TEST (test_call_poller_modify_invalid_events_fails);
    RUN_TEST (test_call_poller_add_fd_invalid_events_fails);
    RUN_TEST (test_call_poller_modify_fd_invalid_events_fails);
650

651 652 653 654 655
    RUN_TEST (test_call_poller_wait_empty_with_timeout_fails);
    RUN_TEST (test_call_poller_wait_empty_without_timeout_fails);
    RUN_TEST (test_call_poller_wait_all_empty_negative_count_fails);
    RUN_TEST (test_call_poller_wait_all_empty_without_timeout_fails);
    RUN_TEST (test_call_poller_wait_all_empty_with_timeout_fails);
656

657 658 659
    RUN_TEST (test_poll_basic);
    RUN_TEST (test_poll_fd);
    RUN_TEST (test_poll_client_server);
660 661

    return UNITY_END ();
662
}