From 272d340c1fb52c769952291f1d61817fa31a0250 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 15 Dec 2016 11:54:27 +0000 Subject: [PATCH] Problem: no mixed FD and zmq socket zmq_poll test Solution: add one --- .gitignore | 1 + Makefile.am | 4 ++ tests/test_zmq_poll_fd.cpp | 98 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 tests/test_zmq_poll_fd.cpp diff --git a/.gitignore b/.gitignore index 4f1ee274..9d5a668d 100644 --- a/.gitignore +++ b/.gitignore @@ -138,6 +138,7 @@ test_dgram test_base85 test_bind_after_connect_tcp test_sodium +test_zmq_poll_fd tests/test*.log tests/test*.trs src/platform.hpp* diff --git a/Makefile.am b/Makefile.am index 7de23913..73cef335 100644 --- a/Makefile.am +++ b/Makefile.am @@ -629,6 +629,7 @@ test_apps += \ tests/test_reqrep_ipc \ tests/test_use_fd_ipc \ tests/test_use_fd_tcp \ + tests/test_zmq_poll_fd \ tests/test_timeo \ tests/test_filter_ipc @@ -664,6 +665,9 @@ tests_test_use_fd_tcp_SOURCES = \ tests/testutil.hpp tests_test_use_fd_tcp_LDADD = src/libzmq.la +tests_test_zmq_poll_fd_SOURCES = tests/test_zmq_poll_fd.cpp +tests_test_zmq_poll_fd_LDADD = src/libzmq.la + if HAVE_FORK if !VALGRIND_ENABLED test_apps += tests/test_fork diff --git a/tests/test_zmq_poll_fd.cpp b/tests/test_zmq_poll_fd.cpp new file mode 100644 index 00000000..48c47d2a --- /dev/null +++ b/tests/test_zmq_poll_fd.cpp @@ -0,0 +1,98 @@ +/* + Copyright (c) 2016 Contributors as noted in the AUTHORS file + + 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 . +*/ + +#include "testutil.hpp" +#include + + +int main (void) +{ + struct addrinfo *addr, hint; + hint.ai_flags=AI_NUMERICHOST; + hint.ai_family=AF_INET; + hint.ai_socktype=SOCK_DGRAM; + hint.ai_protocol=IPPROTO_UDP; + hint.ai_addrlen=0; + hint.ai_canonname=NULL; + hint.ai_addr=NULL; + hint.ai_next=NULL; + + int rc = getaddrinfo ("127.0.0.1", "6650", &hint, &addr); + assert (rc == 0); + + int recv_socket = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); + assert (recv_socket != -1); + + int flag = 1; + rc = setsockopt (recv_socket, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof (int)); + assert (rc == 0); + + rc = bind (recv_socket, addr->ai_addr, addr->ai_addrlen); + assert (rc == 0); + + void *ctx = zmq_ctx_new (); + assert (ctx); + + void *sb = zmq_socket (ctx, ZMQ_REP); + assert (sb); + + rc = zmq_bind (sb, "tcp://127.0.0.1:*"); + assert (rc == 0); + + zmq_pollitem_t pollitems [] = { + { sb, 0, ZMQ_POLLIN, 0 }, + { NULL, recv_socket, ZMQ_POLLIN, 0 }, + }; + + int send_socket = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); + assert (send_socket != -1); + + char buf[10]; + memset (buf, 1, 10); + + rc = sendto (send_socket, buf, 10, 0, addr->ai_addr, addr->ai_addrlen); + assert (rc >= 0); + + assert (zmq_poll (pollitems, 2, 1) == 1); + assert ((pollitems [0].revents & ZMQ_POLLIN) == 0); + assert (pollitems [1].revents & ZMQ_POLLIN); + + rc = zmq_close (sb); + assert (rc == 0); + + rc = zmq_ctx_term (ctx); + assert (rc == 0); + + close (send_socket); + close (recv_socket); + + freeaddrinfo(addr); + + return 0 ; +}