From 5934919f3ec9d688ffe0a5997f9b111e8e4ddeb2 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Mon, 1 May 2017 12:11:11 +0100 Subject: [PATCH] Problem: tests bind to hardcoded TCP ports Solution: use ZMQ_LAST_ENDPOINT in most places. This alllows running tests in paralle, and on over-booked shared machines where many of the ports would be already in use. Keep 3 tests with an hardcoded port, as there are some code paths that require it (eg: connect before bind), but list those ports in tests/testutil.hpp as macros so that they do not overlap and still allow parallel runs. These changes were inspired by a patch uploaded to Ubuntu by the package maintainer, Steve Langasek . Thank you Steve! --- tests/test_bind_after_connect_tcp.cpp | 4 +- tests/test_conflate.cpp | 10 +- tests/test_connect_rid.cpp | 22 +- tests/test_dgram.cpp | 12 +- tests/test_diffserv.cpp | 11 +- tests/test_fork.cpp | 10 +- tests/test_heartbeats.cpp | 27 ++- tests/test_hwm_pubsub.cpp | 10 +- tests/test_immediate.cpp | 26 +- tests/test_issue_566.cpp | 10 +- tests/test_last_endpoint.cpp | 6 +- tests/test_metadata.cpp | 10 +- tests/test_monitor.cpp | 12 +- tests/test_msg_ffn.cpp | 11 +- tests/test_pair_tcp.cpp | 10 +- tests/test_poller.cpp | 21 +- tests/test_probe_router.cpp | 10 +- tests/test_proxy.cpp | 72 +++++- tests/test_proxy_single_socket.cpp | 36 +-- tests/test_proxy_terminate.cpp | 27 ++- tests/test_radio_dish.cpp | 8 +- tests/test_req_correlate.cpp | 10 +- tests/test_req_relaxed.cpp | 14 +- tests/test_reqrep_device.cpp | 18 +- tests/test_reqrep_tcp.cpp | 335 ++++++++++---------------- tests/test_router_handover.cpp | 13 +- tests/test_router_mandatory.cpp | 11 +- tests/test_router_mandatory_hwm.cpp | 10 +- tests/test_security_curve.cpp | 27 ++- tests/test_security_gssapi.cpp | 40 +-- tests/test_security_null.cpp | 36 ++- tests/test_security_plain.cpp | 20 +- tests/test_shutdown_stress.cpp | 45 ++-- tests/test_spec_dealer.cpp | 17 +- tests/test_spec_pushpull.cpp | 17 +- tests/test_spec_rep.cpp | 12 +- tests/test_spec_req.cpp | 17 +- tests/test_spec_router.cpp | 14 +- tests/test_srcfd.cpp | 11 +- tests/test_stream.cpp | 19 +- tests/test_stream_disconnect.cpp | 20 +- tests/test_stream_empty.cpp | 10 +- tests/test_stream_timeout.cpp | 21 +- tests/test_sub_forward.cpp | 18 +- tests/test_system.cpp | 4 +- tests/test_term_endpoint.cpp | 31 ++- tests/test_thread_safe.cpp | 10 +- tests/test_unbind_wildcard.cpp | 110 ++------- tests/test_use_fd_tcp.cpp | 35 ++- tests/test_xpub_manual.cpp | 69 +++--- tests/testutil.hpp | 13 +- 51 files changed, 792 insertions(+), 600 deletions(-) diff --git a/tests/test_bind_after_connect_tcp.cpp b/tests/test_bind_after_connect_tcp.cpp index a4f5ffdc..a0c1f62e 100644 --- a/tests/test_bind_after_connect_tcp.cpp +++ b/tests/test_bind_after_connect_tcp.cpp @@ -41,7 +41,7 @@ int main (void) void *sc = zmq_socket (ctx, ZMQ_DEALER); assert (sc); - int rc = zmq_connect (sc, "tcp://127.0.0.1:7722"); + int rc = zmq_connect (sc, ENDPOINT_3); assert (rc == 0); rc = zmq_send_const (sc, "foobar", 6, 0); @@ -53,7 +53,7 @@ int main (void) rc = zmq_send_const (sc, "buzz", 4, 0); assert (rc == 4); - rc = zmq_bind (sb, "tcp://127.0.0.1:7722"); + rc = zmq_bind (sb, ENDPOINT_3); assert (rc == 0); zmq_msg_t msg; diff --git a/tests/test_conflate.cpp b/tests/test_conflate.cpp index 5e13a948..8fc7ada2 100644 --- a/tests/test_conflate.cpp +++ b/tests/test_conflate.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -31,7 +31,9 @@ int main (int, char *[]) { - const char *bind_to = "tcp://127.0.0.1:5555"; + const char *bind_to = "tcp://127.0.0.1:*"; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; int rc; @@ -47,11 +49,13 @@ int main (int, char *[]) rc = zmq_bind (s_in, bind_to); assert (rc == 0); + rc = zmq_getsockopt (s_in, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); void* s_out = zmq_socket (ctx, ZMQ_PUSH); assert (s_out); - rc = zmq_connect (s_out, bind_to); + rc = zmq_connect (s_out, my_endpoint); assert (rc == 0); int message_count = 20; diff --git a/tests/test_connect_rid.cpp b/tests/test_connect_rid.cpp index 7c2b01c5..dc3e7f48 100644 --- a/tests/test_connect_rid.cpp +++ b/tests/test_connect_rid.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -35,9 +35,11 @@ void test_stream_2_stream(){ int ret; char buff[256]; char msg[] = "hi 1"; - const char *bindip = "tcp://127.0.0.1:5556"; + const char *bindip = "tcp://127.0.0.1:*"; int disabled = 0; int zero = 0; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); // Set up listener STREAM. @@ -49,6 +51,8 @@ void test_stream_2_stream(){ assert (0 == ret); ret = zmq_bind (rbind, bindip); assert(0 == ret); + ret = zmq_getsockopt (rbind, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (0 == ret); // Set up connection stream. rconn1 = zmq_socket (ctx, ZMQ_STREAM); @@ -59,7 +63,7 @@ void test_stream_2_stream(){ // Do the connection. ret = zmq_setsockopt (rconn1, ZMQ_CONNECT_RID, "conn1", 6); assert (0 == ret); - ret = zmq_connect (rconn1, bindip); + ret = zmq_connect (rconn1, my_endpoint); /* Uncomment to test assert on duplicate rid. // Test duplicate connect attempt. @@ -83,7 +87,7 @@ void test_stream_2_stream(){ assert ('h' == buff[128]); // Handle close of the socket. - ret = zmq_unbind (rbind, bindip); + ret = zmq_unbind (rbind, my_endpoint); assert(0 == ret); ret = zmq_close (rbind); assert(0 == ret); @@ -98,8 +102,10 @@ void test_router_2_router(bool named){ int ret; char buff[256]; char msg[] = "hi 1"; - const char *bindip = "tcp://127.0.0.1:5556"; + const char *bindip = "tcp://127.0.0.1:*"; int zero = 0; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); // Create bind socket. @@ -109,6 +115,8 @@ void test_router_2_router(bool named){ assert (0 == ret); ret = zmq_bind (rbind, bindip); assert (0 == ret); + ret = zmq_getsockopt (rbind, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (0 == ret); // Create connection socket. rconn1 = zmq_socket (ctx, ZMQ_ROUTER); @@ -125,7 +133,7 @@ void test_router_2_router(bool named){ // Make call to connect using a connect_rid. ret = zmq_setsockopt (rconn1, ZMQ_CONNECT_RID, "conn1", 6); assert (0 == ret); - ret = zmq_connect (rconn1, bindip); + ret = zmq_connect (rconn1, my_endpoint); assert (0 == ret); /* Uncomment to test assert on duplicate rid // Test duplicate connect attempt. @@ -169,7 +177,7 @@ void test_router_2_router(bool named){ ret = zmq_recv (rconn1, buff+128, 128, 0); assert (3 == ret && 'o' == buff[128]); - ret = zmq_unbind (rbind, bindip); + ret = zmq_unbind (rbind, my_endpoint); assert(0 == ret); ret = zmq_close (rbind); assert(0 == ret); diff --git a/tests/test_dgram.cpp b/tests/test_dgram.cpp index 8dd94add..04e080b6 100644 --- a/tests/test_dgram.cpp +++ b/tests/test_dgram.cpp @@ -61,20 +61,20 @@ int main (void) void *listener = zmq_socket (ctx, ZMQ_DGRAM); // Connecting dgram shoudl fail - int rc = zmq_connect (listener, "udp://127.0.0.1:5556"); + int rc = zmq_connect (listener, ENDPOINT_4); assert (rc == -1); - rc = zmq_bind (listener, "udp://*:5556"); + rc = zmq_bind (listener, ENDPOINT_4); assert (rc == 0); - rc = zmq_bind (sender, "udp://*:5557"); + rc = zmq_bind (sender, ENDPOINT_5); assert (rc == 0); - str_send_to (sender, "Is someone there ?", "127.0.0.1:5556"); + str_send_to (sender, "Is someone there ?", strrchr (ENDPOINT_4, '/') + 1); str_recv_from (listener, &message_string, &address); assert (strcmp(message_string, "Is someone there ?") == 0); - assert (strcmp(address, "127.0.0.1:5557") == 0); + assert (strcmp(address, strrchr (ENDPOINT_5, '/') + 1) == 0); free (message_string); str_send_to (listener, "Yes, there is !", address); @@ -82,7 +82,7 @@ int main (void) str_recv_from (sender, &message_string, &address); assert (strcmp(message_string, "Yes, there is !") == 0); - assert (strcmp(address, "127.0.0.1:5556") == 0); + assert (strcmp(address, strrchr (ENDPOINT_4, '/') + 1) == 0); free (message_string); free (address); diff --git a/tests/test_diffserv.cpp b/tests/test_diffserv.cpp index d19613ed..244b82b9 100644 --- a/tests/test_diffserv.cpp +++ b/tests/test_diffserv.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -35,6 +35,8 @@ int main (void) int tos = 0x28; int o_tos; size_t tos_size = sizeof(tos); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; setup_test_environment(); void *ctx = zmq_ctx_new (); @@ -44,8 +46,11 @@ int main (void) assert (sb); rc = zmq_setsockopt (sb, ZMQ_TOS, &tos, tos_size); assert (rc == 0); - rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); + rc = zmq_bind (sb, "tcp://127.0.0.1:*"); assert (rc == 0); + rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_getsockopt (sb, ZMQ_TOS, &o_tos, &tos_size); assert (rc == 0); assert (o_tos == tos); @@ -55,7 +60,7 @@ int main (void) tos = 0x58; rc = zmq_setsockopt (sc, ZMQ_TOS, &tos, tos_size); assert (rc == 0); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); rc = zmq_getsockopt (sc, ZMQ_TOS, &o_tos, &tos_size); assert (rc == 0); diff --git a/tests/test_fork.cpp b/tests/test_fork.cpp index 5370f583..4b9fbc2c 100644 --- a/tests/test_fork.cpp +++ b/tests/test_fork.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -29,7 +29,8 @@ #include "testutil.hpp" -const char *address = "tcp://127.0.0.1:6571"; +const char *address = "tcp://127.0.0.1:*"; +char connect_address[MAX_SOCKET_STRING]; #define NUM_MESSAGES 5 @@ -45,6 +46,9 @@ int main (void) assert (pull); int rc = zmq_bind (pull, address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (pull, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); int pid = fork (); if (pid == 0) { @@ -58,7 +62,7 @@ int main (void) assert (child_ctx); void *push = zmq_socket (child_ctx, ZMQ_PUSH); assert (push); - rc = zmq_connect (push, address); + rc = zmq_connect (push, connect_address); assert (rc == 0); int count; for (count = 0; count < NUM_MESSAGES; count++) diff --git a/tests/test_heartbeats.cpp b/tests/test_heartbeats.cpp index 20400f94..ed251cc8 100644 --- a/tests/test_heartbeats.cpp +++ b/tests/test_heartbeats.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of 0MQ. @@ -102,7 +102,8 @@ mock_handshake (raw_socket fd) { } static void -prep_server_socket(void * ctx, int set_heartbeats, void ** server_out, void ** mon_out) +prep_server_socket(void * ctx, int set_heartbeats, void ** server_out, void ** mon_out, + char *endpoint, size_t ep_length) { int rc; // We'll be using this socket in raw mode @@ -119,7 +120,9 @@ prep_server_socket(void * ctx, int set_heartbeats, void ** server_out, void ** m assert (rc == 0); } - rc = zmq_bind (server, "tcp://127.0.0.1:5556"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, endpoint, &ep_length); assert (rc == 0); // Create and connect a socket for collecting monitor events on dealer @@ -145,19 +148,21 @@ static void test_heartbeat_timeout (void) { int rc; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); assert (ctx); void * server, * server_mon; - prep_server_socket (ctx, 1, &server, &server_mon); + prep_server_socket (ctx, 1, &server, &server_mon, my_endpoint, + MAX_SOCKET_STRING); struct sockaddr_in ip4addr; raw_socket s; ip4addr.sin_family = AF_INET; - ip4addr.sin_port = htons (5556); + ip4addr.sin_port = htons (atoi (strrchr (my_endpoint, ':') + 1)); #if defined (ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600) ip4addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); #else @@ -200,13 +205,15 @@ static void test_heartbeat_ttl (void) { int rc, value; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); assert (ctx); void * server, * server_mon, *client; - prep_server_socket (ctx, 0, &server, &server_mon); + prep_server_socket (ctx, 0, &server, &server_mon, my_endpoint, + MAX_SOCKET_STRING); client = zmq_socket (ctx, ZMQ_DEALER); assert (client != NULL); @@ -222,7 +229,7 @@ test_heartbeat_ttl (void) rc = zmq_setsockopt (client, ZMQ_HEARTBEAT_IVL, &value, sizeof (value)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:5556"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); // By now everything should report as connected @@ -255,16 +262,18 @@ static void test_heartbeat_notimeout (void) { int rc; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); assert (ctx); void * server, * server_mon; - prep_server_socket(ctx, 1, &server, &server_mon); + prep_server_socket(ctx, 1, &server, &server_mon, my_endpoint, + MAX_SOCKET_STRING); void * client = zmq_socket (ctx, ZMQ_DEALER); - rc = zmq_connect (client, "tcp://127.0.0.1:5556"); + rc = zmq_connect (client, my_endpoint); // Give it a sec to connect and handshake msleep (SETTLE_TIME); diff --git a/tests/test_hwm_pubsub.cpp b/tests/test_hwm_pubsub.cpp index 91810aa2..70e8f9ad 100644 --- a/tests/test_hwm_pubsub.cpp +++ b/tests/test_hwm_pubsub.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -157,6 +157,8 @@ void test_reset_hwm () int first_count = 9999; int second_count = 1100; int hwm = 11024; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -167,7 +169,9 @@ void test_reset_hwm () assert (pub_socket); rc = zmq_setsockopt (pub_socket, ZMQ_SNDHWM, &hwm, sizeof (hwm)); assert (rc == 0); - rc = zmq_bind (pub_socket, "tcp://127.0.0.1:1234"); + rc = zmq_bind (pub_socket, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (pub_socket, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Set up connect socket @@ -175,7 +179,7 @@ void test_reset_hwm () assert (sub_socket); rc = zmq_setsockopt (sub_socket, ZMQ_RCVHWM, &hwm, sizeof (hwm)); assert (rc == 0); - rc = zmq_connect (sub_socket, "tcp://127.0.0.1:1234"); + rc = zmq_connect (sub_socket, my_endpoint); assert (rc == 0); rc = zmq_setsockopt( sub_socket, ZMQ_SUBSCRIBE, 0, 0); assert (rc == 0); diff --git a/tests/test_immediate.cpp b/tests/test_immediate.cpp index d0fbaaf6..dc472255 100644 --- a/tests/test_immediate.cpp +++ b/tests/test_immediate.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -35,6 +35,8 @@ int main (void) int val; int rc; char buffer[16]; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // TEST 1. // First we're going to attempt to send messages to two // pipes, one connected, the other not. We should see @@ -51,7 +53,9 @@ int main (void) val = 0; rc = zmq_setsockopt(to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); - rc = zmq_bind (to, "tcp://127.0.0.1:6555"); + rc = zmq_bind (to, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (to, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Create a socket pushing to two endpoints - only 1 message should arrive. @@ -64,7 +68,7 @@ int main (void) rc = zmq_connect (from, "tcp://localhost:5556"); assert (rc == 0); // This pipe will - rc = zmq_connect (from, "tcp://localhost:6555"); + rc = zmq_connect (from, my_endpoint); assert (rc == 0); msleep (SETTLE_TIME); @@ -112,7 +116,10 @@ int main (void) // Bind the valid socket to = zmq_socket (context, ZMQ_PULL); assert (to); - rc = zmq_bind (to, "tcp://127.0.0.1:5560"); + rc = zmq_bind (to, "tcp://127.0.0.1:*"); + assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (to, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); val = 0; @@ -136,7 +143,7 @@ int main (void) rc = zmq_connect (from, "tcp://localhost:5561"); assert (rc == 0); // Connect to the valid socket - rc = zmq_connect (from, "tcp://localhost:5560"); + rc = zmq_connect (from, my_endpoint); assert (rc == 0); // Send 10 messages, all should be routed to the connected pipe @@ -186,9 +193,12 @@ int main (void) int on = 1; rc = zmq_setsockopt (frontend, ZMQ_IMMEDIATE, &on, sizeof (on)); assert (rc == 0); - rc = zmq_bind (backend, "tcp://127.0.0.1:5560"); + rc = zmq_bind (backend, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (frontend, "tcp://localhost:5560"); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (backend, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (frontend, my_endpoint); assert (rc == 0); // Ping backend to frontend so we know when the connection is up @@ -216,7 +226,7 @@ int main (void) assert (backend); rc = zmq_setsockopt (backend, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); - rc = zmq_bind (backend, "tcp://127.0.0.1:5560"); + rc = zmq_bind (backend, my_endpoint); assert (rc == 0); // Ping backend to frontend so we know when the connection is up diff --git a/tests/test_issue_566.cpp b/tests/test_issue_566.cpp index 1d655d50..97f64f31 100644 --- a/tests/test_issue_566.cpp +++ b/tests/test_issue_566.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -38,6 +38,8 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx1 = zmq_ctx_new (); assert (ctx1); @@ -48,8 +50,10 @@ int main (void) int on = 1; int rc = zmq_setsockopt (router, ZMQ_ROUTER_MANDATORY, &on, sizeof (on)); assert (rc == 0); - rc = zmq_bind (router, "tcp://127.0.0.1:5555"); + rc = zmq_bind (router, "tcp://127.0.0.1:*"); assert (rc != -1); + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); // Repeat often enough to be sure this works as it should for (int cycle = 0; cycle < 100; cycle++) { @@ -63,7 +67,7 @@ int main (void) int rcvtimeo = 1000; rc = zmq_setsockopt (dealer, ZMQ_RCVTIMEO, &rcvtimeo, sizeof (int)); assert (rc == 0); - rc = zmq_connect (dealer, "tcp://127.0.0.1:5555"); + rc = zmq_connect (dealer, my_endpoint); assert (rc == 0); // Router will try to send to dealer, at short intervals. diff --git a/tests/test_last_endpoint.cpp b/tests/test_last_endpoint.cpp index f0a01cb7..0c922b48 100644 --- a/tests/test_last_endpoint.cpp +++ b/tests/test_last_endpoint.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -52,8 +52,8 @@ int main (void) int rc = zmq_setsockopt (sb, ZMQ_LINGER, &val, sizeof (val)); assert (rc == 0); - do_bind_and_verify (sb, "tcp://127.0.0.1:5560"); - do_bind_and_verify (sb, "tcp://127.0.0.1:5561"); + do_bind_and_verify (sb, ENDPOINT_1); + do_bind_and_verify (sb, ENDPOINT_2); rc = zmq_close (sb); assert (rc == 0); diff --git a/tests/test_metadata.cpp b/tests/test_metadata.cpp index 57a652e4..247d35ed 100644 --- a/tests/test_metadata.cpp +++ b/tests/test_metadata.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -79,6 +79,8 @@ zap_handler (void *handler) int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -97,9 +99,11 @@ int main (void) assert (client); rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "DOMAIN", 6); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9001"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:9001"); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); s_send (client, "This is a message"); diff --git a/tests/test_monitor.cpp b/tests/test_monitor.cpp index 144dfd10..0a286260 100644 --- a/tests/test_monitor.cpp +++ b/tests/test_monitor.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -68,6 +68,8 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -78,7 +80,7 @@ int main (void) assert (server); // Socket monitoring only works over inproc:// - int rc = zmq_socket_monitor (client, "tcp://127.0.0.1:9999", 0); + int rc = zmq_socket_monitor (client, "tcp://127.0.0.1:*", 0); assert (rc == -1); assert (zmq_errno () == EPROTONOSUPPORT); @@ -101,9 +103,11 @@ int main (void) assert (rc == 0); // Now do a basic ping test - rc = zmq_bind (server, "tcp://127.0.0.1:9998"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:9998"); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); bounce (server, client); diff --git a/tests/test_msg_ffn.cpp b/tests/test_msg_ffn.cpp index 0208036b..2cab9d66 100644 --- a/tests/test_msg_ffn.cpp +++ b/tests/test_msg_ffn.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -41,16 +41,21 @@ int main (void) { void *ctx = zmq_ctx_new (); assert (ctx); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; + void *router = zmq_socket (ctx, ZMQ_ROUTER); assert (router); - int rc = zmq_bind (router, "tcp://127.0.0.1:5555"); + int rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *dealer = zmq_socket (ctx, ZMQ_DEALER); assert (dealer); - rc = zmq_connect (dealer, "tcp://127.0.0.1:5555"); + rc = zmq_connect (dealer, my_endpoint); assert (rc == 0); // Test that creating and closing a message triggers ffn diff --git a/tests/test_pair_tcp.cpp b/tests/test_pair_tcp.cpp index 8903aa08..1a7bb02c 100644 --- a/tests/test_pair_tcp.cpp +++ b/tests/test_pair_tcp.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,17 +32,21 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *sb = zmq_socket (ctx, ZMQ_PAIR); assert (sb); - int rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (sb, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_PAIR); assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); bounce (sb, sc); diff --git a/tests/test_poller.cpp b/tests/test_poller.cpp index aba36e10..4ad524d3 100644 --- a/tests/test_poller.cpp +++ b/tests/test_poller.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -31,6 +31,10 @@ int main (void) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint_0[MAX_SOCKET_STRING]; + char my_endpoint_1[MAX_SOCKET_STRING]; + setup_test_environment (); void *ctx = zmq_ctx_new (); @@ -39,12 +43,14 @@ int main (void) // Create few sockets void *vent = zmq_socket (ctx, ZMQ_PUSH); assert (vent); - int rc = zmq_bind (vent, "tcp://127.0.0.1:55556"); + int rc = zmq_bind (vent, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (vent, ZMQ_LAST_ENDPOINT, my_endpoint_0, &len); assert (rc == 0); void *sink = zmq_socket (ctx, ZMQ_PULL); assert (sink); - rc = zmq_connect (sink, "tcp://127.0.0.1:55556"); + rc = zmq_connect (sink, my_endpoint_0); assert (rc == 0); void *bowl = zmq_socket (ctx, ZMQ_PULL); @@ -53,7 +59,10 @@ int main (void) #if defined(ZMQ_SERVER) && defined(ZMQ_CLIENT) void *server = zmq_socket (ctx, ZMQ_SERVER); assert (server); - rc = zmq_bind (server, "tcp://127.0.0.1:55557"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint_1, &len); assert (rc == 0); void *client = zmq_socket (ctx, ZMQ_CLIENT); @@ -96,7 +105,7 @@ int main (void) assert (rc == 0); // Check we can poll an FD - rc = zmq_connect (bowl, "tcp://127.0.0.1:55556"); + rc = zmq_connect (bowl, my_endpoint_0); assert (rc == 0); #if defined _WIN32 @@ -122,7 +131,7 @@ int main (void) // Polling on thread safe sockets rc = zmq_poller_add (poller, server, NULL, ZMQ_POLLIN); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:55557"); + rc = zmq_connect (client, my_endpoint_1); assert (rc == 0); rc = zmq_send_const (client, data, 1, 0); assert (rc == 1); diff --git a/tests/test_probe_router.cpp b/tests/test_probe_router.cpp index 94b262e4..a964e57c 100644 --- a/tests/test_probe_router.cpp +++ b/tests/test_probe_router.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,13 +32,17 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); // Create server and bind to endpoint void *server = zmq_socket (ctx, ZMQ_ROUTER); assert (server); - int rc = zmq_bind (server, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Create client and connect to server, doing a probe @@ -49,7 +53,7 @@ int main (void) int probe = 1; rc = zmq_setsockopt (client, ZMQ_PROBE_ROUTER, &probe, sizeof (probe)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:5560"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); // We expect an identity=X + empty message from client diff --git a/tests/test_proxy.cpp b/tests/test_proxy.cpp index 8502fce3..f00f502b 100644 --- a/tests/test_proxy.cpp +++ b/tests/test_proxy.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -50,18 +50,36 @@ #define QT_CLIENTS 3 #define is_verbose 0 +struct thread_data { + void *ctx; + int id; +}; + static void -client_task (void *ctx) +client_task (void *db) { - void *client = zmq_socket (ctx, ZMQ_DEALER); + struct thread_data *databag = (struct thread_data *)db; + // Endpoint socket gets random port to avoid test failing when port in use + void *endpoint = zmq_socket (databag->ctx, ZMQ_PAIR); + assert (endpoint); + int linger = 0; + int rc = zmq_setsockopt (endpoint, ZMQ_LINGER, &linger, sizeof (linger)); + assert (rc == 0); + char endpoint_source [256]; + sprintf (endpoint_source, "inproc://endpoint%d", databag->id); + rc = zmq_connect (endpoint, endpoint_source); + assert (rc == 0); + char *my_endpoint = s_recv (endpoint); + assert (my_endpoint); + + void *client = zmq_socket (databag->ctx, ZMQ_DEALER); assert (client); // Control socket receives terminate command from main over inproc - void *control = zmq_socket (ctx, ZMQ_SUB); + void *control = zmq_socket (databag->ctx, ZMQ_SUB); assert (control); - int rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0); + rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0); assert (rc == 0); - int linger = 0; rc = zmq_setsockopt (control, ZMQ_LINGER, &linger, sizeof (linger)); assert (rc == 0); rc = zmq_connect (control, "inproc://control"); @@ -76,7 +94,7 @@ client_task (void *ctx) linger = 0; rc = zmq_setsockopt (client, ZMQ_LINGER, &linger, sizeof (linger)); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:5563"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); zmq_pollitem_t items [] = { { client, 0, ZMQ_POLLIN, 0 }, { control, 0, ZMQ_POLLIN, 0 } }; @@ -117,6 +135,9 @@ client_task (void *ctx) assert (rc == 0); rc = zmq_close (control); assert (rc == 0); + rc = zmq_close (endpoint); + assert (rc == 0); + free (my_endpoint); } // This is our server task. @@ -131,12 +152,16 @@ void server_task (void *ctx) { // Frontend socket talks to clients over TCP + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *frontend = zmq_socket (ctx, ZMQ_ROUTER); assert (frontend); int linger = 0; int rc = zmq_setsockopt (frontend, ZMQ_LINGER, &linger, sizeof (linger)); assert (rc == 0); - rc = zmq_bind (frontend, "tcp://127.0.0.1:5563"); + rc = zmq_bind (frontend, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (frontend, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Backend socket talks to workers over inproc @@ -163,6 +188,25 @@ server_task (void *ctx) for (thread_nbr = 0; thread_nbr < QT_WORKERS; thread_nbr++) threads[thread_nbr] = zmq_threadstart (&server_worker, ctx); + // Endpoint socket sends random port to avoid test failing when port in use + void *endpoint_receivers [QT_CLIENTS]; + char endpoint_source [256]; + for (int i = 0; i < QT_CLIENTS; ++i) { + endpoint_receivers [i] = zmq_socket (ctx, ZMQ_PAIR); + assert (endpoint_receivers [i]); + rc = zmq_setsockopt (endpoint_receivers [i], ZMQ_LINGER, &linger, + sizeof (linger)); + assert (rc == 0); + sprintf (endpoint_source, "inproc://endpoint%d", i); + rc = zmq_bind (endpoint_receivers [i], endpoint_source); + assert (rc == 0); + } + + for (int i = 0; i < QT_CLIENTS; ++i) { + rc = s_send (endpoint_receivers [i], my_endpoint); + assert (rc > 0); + } + // Connect backend to frontend via a proxy rc = zmq_proxy_steerable (frontend, backend, NULL, control); assert (rc == 0); @@ -176,6 +220,10 @@ server_task (void *ctx) assert (rc == 0); rc = zmq_close (control); assert (rc == 0); + for (int i = 0; i < QT_CLIENTS; ++i) { + rc = zmq_close(endpoint_receivers [i]); + assert (rc == 0); + } } // Each worker task works on one request at a time and sends a random number @@ -262,8 +310,12 @@ int main (void) assert (rc == 0); void *threads [QT_CLIENTS + 1]; - for (int i = 0; i < QT_CLIENTS; i++) - threads[i] = zmq_threadstart (&client_task, ctx); + struct thread_data databags [QT_CLIENTS + 1]; + for (int i = 0; i < QT_CLIENTS; i++) { + databags [i].ctx = ctx; + databags [i].id = i; + threads[i] = zmq_threadstart (&client_task, &databags [i]); + } threads[QT_CLIENTS] = zmq_threadstart (&server_task, ctx); msleep (500); // Run for 500 ms then quit diff --git a/tests/test_proxy_single_socket.cpp b/tests/test_proxy_single_socket.cpp index 02fe7c05..bd17f8f7 100644 --- a/tests/test_proxy_single_socket.cpp +++ b/tests/test_proxy_single_socket.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -37,18 +37,22 @@ void server_task (void *ctx) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *rep = zmq_socket (ctx, ZMQ_REP); assert (rep); - int rc = zmq_bind (rep, "tcp://127.0.0.1:5563"); + int rc = zmq_bind (rep, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (rep, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Control socket receives terminate command from main over inproc - void *control = zmq_socket (ctx, ZMQ_SUB); + void *control = zmq_socket (ctx, ZMQ_REQ); assert (control); - rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0); - assert (rc == 0); rc = zmq_connect (control, "inproc://control"); assert (rc == 0); + rc = s_send (control, my_endpoint); + assert (rc > 0); // Use rep as both frontend and backend rc = zmq_proxy_steerable (rep, rep, NULL, control); @@ -70,20 +74,23 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); + + void *server_thread = zmq_threadstart(&server_task, ctx); + + // Control socket receives terminate command from main over inproc + void *control = zmq_socket (ctx, ZMQ_REP); + assert (control); + int rc = zmq_bind (control, "inproc://control"); + assert (rc == 0); + char *my_endpoint = s_recv (control); + assert (my_endpoint); + // client socket pings proxy over tcp void *req = zmq_socket (ctx, ZMQ_REQ); assert (req); - int rc = zmq_connect (req, "tcp://127.0.0.1:5563"); + rc = zmq_connect (req, my_endpoint); assert (rc == 0); - // Control socket receives terminate command from main over inproc - void *control = zmq_socket (ctx, ZMQ_PUB); - assert (control); - rc = zmq_bind (control, "inproc://control"); - assert (rc == 0); - - void *server_thread = zmq_threadstart(&server_task, ctx); - char buf[255]; rc = zmq_send(req, "msg1", 4, 0); assert (rc == 4); @@ -104,6 +111,7 @@ int main (void) assert (rc == 0); rc = zmq_close (req); assert (rc == 0); + free (my_endpoint); zmq_threadclose (server_thread); diff --git a/tests/test_proxy_terminate.cpp b/tests/test_proxy_terminate.cpp index b4e19ae5..f9fcef07 100644 --- a/tests/test_proxy_terminate.cpp +++ b/tests/test_proxy_terminate.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -37,27 +37,31 @@ void server_task (void *ctx) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // Frontend socket talks to main process void *frontend = zmq_socket (ctx, ZMQ_SUB); assert (frontend); int rc = zmq_setsockopt (frontend, ZMQ_SUBSCRIBE, "", 0); assert (rc == 0); - rc = zmq_bind (frontend, "tcp://127.0.0.1:15564"); + rc = zmq_bind (frontend, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (frontend, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Nice socket which is never read void *backend = zmq_socket (ctx, ZMQ_PUSH); assert (backend); - rc = zmq_bind (backend, "tcp://127.0.0.1:15563"); + rc = zmq_bind (backend, "tcp://127.0.0.1:*"); assert (rc == 0); // Control socket receives terminate command from main over inproc - void *control = zmq_socket (ctx, ZMQ_SUB); + void *control = zmq_socket (ctx, ZMQ_REQ); assert (control); - rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0); - assert (rc == 0); rc = zmq_connect (control, "inproc://control"); assert (rc == 0); + rc = s_send (control, my_endpoint); + assert (rc > 0); // Connect backend to frontend via a proxy rc = zmq_proxy_steerable (frontend, backend, NULL, control); @@ -81,19 +85,23 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); + + void *thread = zmq_threadstart(&server_task, ctx); + // Control socket receives terminate command from main over inproc - void *control = zmq_socket (ctx, ZMQ_PUB); + void *control = zmq_socket (ctx, ZMQ_REP); assert (control); int rc = zmq_bind (control, "inproc://control"); assert (rc == 0); + char *my_endpoint = s_recv (control); + assert (my_endpoint); - void *thread = zmq_threadstart(&server_task, ctx); msleep (500); // Run for 500 ms // Start a secondary publisher which writes data to the SUB-PUSH server socket void *publisher = zmq_socket (ctx, ZMQ_PUB); assert (publisher); - rc = zmq_connect (publisher, "tcp://127.0.0.1:15564"); + rc = zmq_connect (publisher, my_endpoint); assert (rc == 0); msleep (SETTLE_TIME); @@ -114,6 +122,7 @@ int main (void) assert (rc == 0); rc = zmq_close (control); assert (rc == 0); + free (my_endpoint); zmq_threadclose (thread); diff --git a/tests/test_radio_dish.cpp b/tests/test_radio_dish.cpp index c11ac943..9374388d 100644 --- a/tests/test_radio_dish.cpp +++ b/tests/test_radio_dish.cpp @@ -83,6 +83,8 @@ int msg_recv_cmp (zmq_msg_t *msg_, void *s_, const char* group_, const char* bod int main (void) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; setup_test_environment (); void *ctx = zmq_ctx_new (); assert (ctx); @@ -90,7 +92,9 @@ int main (void) void *radio = zmq_socket (ctx, ZMQ_RADIO); void *dish = zmq_socket (ctx, ZMQ_DISH); - int rc = zmq_bind (radio, "tcp://127.0.0.1:5556"); + int rc = zmq_bind (radio, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (radio, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Leaving a group which we didn't join @@ -114,7 +118,7 @@ int main (void) assert (rc == -1); // Connecting - rc = zmq_connect (dish, "tcp://127.0.0.1:5556"); + rc = zmq_connect (dish, my_endpoint); assert (rc == 0); msleep (SETTLE_TIME); diff --git a/tests/test_req_correlate.cpp b/tests/test_req_correlate.cpp index 0466becf..4f0d9115 100644 --- a/tests/test_req_correlate.cpp +++ b/tests/test_req_correlate.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,6 +32,8 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -49,10 +51,12 @@ int main (void) rc = zmq_setsockopt (req, ZMQ_RCVTIMEO, &rcvtimeo, sizeof (int)); assert (rc == 0); - rc = zmq_connect (req, "tcp://localhost:5555"); + rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); - rc = zmq_bind (router, "tcp://127.0.0.1:5555"); + rc = zmq_connect (req, my_endpoint); assert (rc == 0); // Send a multi-part request. diff --git a/tests/test_req_relaxed.cpp b/tests/test_req_relaxed.cpp index c530ad13..9ba35fe2 100644 --- a/tests/test_req_relaxed.cpp +++ b/tests/test_req_relaxed.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -57,6 +57,8 @@ static void bounce (void *socket) int main (void) { setup_test_environment (); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -70,7 +72,9 @@ int main (void) rc = zmq_setsockopt (req, ZMQ_REQ_CORRELATE, &enabled, sizeof (int)); assert (rc == 0); - rc = zmq_bind (req, "tcp://127.0.0.1:5555"); + rc = zmq_bind (req, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (req, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); const size_t services = 5; @@ -83,7 +87,7 @@ int main (void) rc = zmq_setsockopt (rep [peer], ZMQ_RCVTIMEO, &timeout, sizeof (int)); assert (rc == 0); - rc = zmq_connect (rep [peer], "tcp://localhost:5555"); + rc = zmq_connect (rep [peer], my_endpoint); assert (rc == 0); } // We have to give the connects time to finish otherwise the requests @@ -162,7 +166,7 @@ int main (void) rc = zmq_setsockopt (req, ZMQ_REQ_CORRELATE, &enabled, sizeof (int)); assert (rc == 0); - rc = zmq_connect (req, "tcp://localhost:5555"); + rc = zmq_connect (req, ENDPOINT_0); assert (rc == 0); // Setup ROUTER socket as server but do not bind it just yet @@ -174,7 +178,7 @@ int main (void) s_send_seq (req, "TO_BE_ANSWERED", SEQ_END); // Bind server allowing it to receive messages - rc = zmq_bind (router, "tcp://127.0.0.1:5555"); + rc = zmq_bind (router, ENDPOINT_0); assert (rc == 0); // Read the two messages and send them back as is diff --git a/tests/test_reqrep_device.cpp b/tests/test_reqrep_device.cpp index 115acbf5..c663a29a 100644 --- a/tests/test_reqrep_device.cpp +++ b/tests/test_reqrep_device.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,29 +32,37 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char endpoint1[MAX_SOCKET_STRING]; + char endpoint2[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); // Create a req/rep device. void *dealer = zmq_socket (ctx, ZMQ_DEALER); assert (dealer); - int rc = zmq_bind (dealer, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (dealer, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (dealer, ZMQ_LAST_ENDPOINT, endpoint1, &len); assert (rc == 0); void *router = zmq_socket (ctx, ZMQ_ROUTER); assert (router); - rc = zmq_bind (router, "tcp://127.0.0.1:5561"); + rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, endpoint2, &len); assert (rc == 0); // Create a worker. void *rep = zmq_socket (ctx, ZMQ_REP); assert (rep); - rc = zmq_connect (rep, "tcp://127.0.0.1:5560"); + rc = zmq_connect (rep, endpoint1); assert (rc == 0); // Create a client. void *req = zmq_socket (ctx, ZMQ_REQ); assert (req); - rc = zmq_connect (req, "tcp://127.0.0.1:5561"); + rc = zmq_connect (req, endpoint2); assert (rc == 0); // Send a request. diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index 36707c87..2b65e5ea 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -29,206 +29,48 @@ #include "testutil.hpp" -void test_single_connect_ipv4 (void) +void test_single_connect (const char *address) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); - void *sb = zmq_socket (ctx, ZMQ_REP); - assert (sb); - int rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); - assert (rc == 0); + int ipv6; + if (streq(address, "tcp://127.0.0.1:*")) + ipv6 = 0; + else if (streq(address, "tcp://[::1]:*")) + ipv6 = 1; + else + assert (false); - void *sc = zmq_socket (ctx, ZMQ_REQ); - assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - bounce (sb, sc); - - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - rc = zmq_unbind (sb, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - rc = zmq_close (sc); - assert (rc == 0); - - rc = zmq_close (sb); - assert (rc == 0); - - rc = zmq_ctx_term (ctx); - assert (rc == 0); -} - -void test_multi_connect_ipv4 (void) -{ - void *ctx = zmq_ctx_new (); - assert (ctx); - - void *sb0 = zmq_socket (ctx, ZMQ_REP); - assert (sb0); - int rc = zmq_bind (sb0, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - void *sb1 = zmq_socket (ctx, ZMQ_REP); - assert (sb1); - rc = zmq_bind (sb1, "tcp://127.0.0.1:5561"); - assert (rc == 0); - - void *sb2 = zmq_socket (ctx, ZMQ_REP); - assert (sb2); - rc = zmq_bind (sb2, "tcp://127.0.0.1:5562"); - assert (rc == 0); - - void *sc = zmq_socket (ctx, ZMQ_REQ); - assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_connect (sc, "tcp://127.0.0.1:5561"); - assert (rc == 0); - rc = zmq_connect (sc, "tcp://127.0.0.1:5564;127.0.0.1:5562"); - assert (rc == 0); - - bounce (sb0, sc); - bounce (sb1, sc); - bounce (sb2, sc); - bounce (sb0, sc); - bounce (sb1, sc); - bounce (sb2, sc); - bounce (sb0, sc); - - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5564;127.0.0.1:5562"); - assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5561"); - assert (rc == 0); - - rc = zmq_unbind (sb0, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - rc = zmq_unbind (sb1, "tcp://127.0.0.1:5561"); - assert (rc == 0); - - rc = zmq_unbind (sb2, "tcp://127.0.0.1:5562"); - assert (rc == 0); - - rc = zmq_close (sc); - assert (rc == 0); - - rc = zmq_close (sb0); - assert (rc == 0); - - rc = zmq_close (sb1); - assert (rc == 0); - - rc = zmq_close (sb2); - assert (rc == 0); - - rc = zmq_ctx_term (ctx); - assert (rc == 0); -} - -void test_multi_connect_ipv4_same_port (void) -{ - void *ctx = zmq_ctx_new (); - assert (ctx); - - void *sb0 = zmq_socket (ctx, ZMQ_REP); - assert (sb0); - int rc = zmq_bind (sb0, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - void *sb1 = zmq_socket (ctx, ZMQ_REP); - assert (sb1); - rc = zmq_bind (sb1, "tcp://127.0.0.1:5561"); - assert (rc == 0); - - void *sc0 = zmq_socket (ctx, ZMQ_REQ); - assert (sc0); - rc = zmq_connect (sc0, "tcp://127.0.0.1:5564;127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_connect (sc0, "tcp://127.0.0.1:5565;127.0.0.1:5561"); - assert (rc == 0); - - void *sc1 = zmq_socket (ctx, ZMQ_REQ); - assert (sc1); - rc = zmq_connect (sc1, "tcp://127.0.0.1:5565;127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_connect (sc1, "tcp://127.0.0.1:5564;127.0.0.1:5561"); - assert (rc == 0); - - bounce (sb0, sc0); - bounce (sb1, sc0); - bounce (sb0, sc1); - bounce (sb1, sc1); - bounce (sb0, sc0); - bounce (sb1, sc0); - - rc = zmq_disconnect (sc1, "tcp://127.0.0.1:5565;127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_disconnect (sc1, "tcp://127.0.0.1:5564;127.0.0.1:5561"); - assert (rc == 0); - rc = zmq_disconnect (sc0, "tcp://127.0.0.1:5564;127.0.0.1:5560"); - assert (rc == 0); - rc = zmq_disconnect (sc0, "tcp://127.0.0.1:5565;127.0.0.1:5561"); - assert (rc == 0); - - rc = zmq_unbind (sb0, "tcp://127.0.0.1:5560"); - assert (rc == 0); - - rc = zmq_unbind (sb1, "tcp://127.0.0.1:5561"); - assert (rc == 0); - - rc = zmq_close (sc0); - assert (rc == 0); - - rc = zmq_close (sc1); - assert (rc == 0); - - rc = zmq_close (sb0); - assert (rc == 0); - - rc = zmq_close (sb1); - assert (rc == 0); - - rc = zmq_ctx_term (ctx); - assert (rc == 0); -} - -void test_single_connect_ipv6 (void) -{ - void *ctx = zmq_ctx_new (); - assert (ctx); - - if (!is_ipv6_available ()) { + if (ipv6 && !is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); - int ipv6 = 1; int rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb, "tcp://[::1]:5560"); + rc = zmq_bind (sb, address); + assert (rc == 0); + rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); bounce (sb, sc); - rc = zmq_disconnect (sc, "tcp://[::1]:5560"); + rc = zmq_disconnect (sc, my_endpoint); assert (rc == 0); - rc = zmq_unbind (sb, "tcp://[::1]:5560"); + rc = zmq_unbind (sb, my_endpoint); assert (rc == 0); rc = zmq_close (sc); @@ -241,47 +83,73 @@ void test_single_connect_ipv6 (void) assert (rc == 0); } -void test_multi_connect_ipv6 (void) +void test_multi_connect (const char *address) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint_0[MAX_SOCKET_STRING]; + char my_endpoint_1[MAX_SOCKET_STRING]; + char my_endpoint_2[MAX_SOCKET_STRING]; + char my_endpoint_3[MAX_SOCKET_STRING * 2]; void *ctx = zmq_ctx_new (); assert (ctx); - if (!is_ipv6_available ()) { + int ipv6; + if (streq(address, "tcp://127.0.0.1:*")) + ipv6 = 0; + else if (streq(address, "tcp://[::1]:*")) + ipv6 = 1; + else + assert (false); + + if (ipv6 && !is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb0 = zmq_socket (ctx, ZMQ_REP); assert (sb0); - int ipv6 = 1; int rc = zmq_setsockopt (sb0, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb0, "tcp://[::1]:5560"); + rc = zmq_bind (sb0, address); assert (rc == 0); + rc = zmq_getsockopt (sb0, ZMQ_LAST_ENDPOINT, my_endpoint_0, &len); + assert (rc == 0); void *sb1 = zmq_socket (ctx, ZMQ_REP); assert (sb1); rc = zmq_setsockopt (sb1, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb1, "tcp://[::1]:5561"); + rc = zmq_bind (sb1, address); assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (sb1, ZMQ_LAST_ENDPOINT, my_endpoint_1, &len); + assert (rc == 0); void *sb2 = zmq_socket (ctx, ZMQ_REP); assert (sb2); rc = zmq_setsockopt (sb2, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb2, "tcp://[::1]:5562"); + rc = zmq_bind (sb2, address); assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (sb2, ZMQ_LAST_ENDPOINT, my_endpoint_2, &len); + assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5560"); + rc = zmq_connect (sc, my_endpoint_0); assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5561"); + rc = zmq_connect (sc, my_endpoint_1); assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5564;[::1]:5562"); + if (!ipv6) + sprintf (my_endpoint_3, "tcp://127.0.0.1:5564;%s", + strrchr(my_endpoint_2, '/') + 1); + else + sprintf (my_endpoint_3, "tcp://[::1]:5564;%s", + strrchr(my_endpoint_2, '/') + 1); + rc = zmq_connect (sc, my_endpoint_3); assert (rc == 0); bounce (sb0, sc); @@ -292,20 +160,20 @@ void test_multi_connect_ipv6 (void) bounce (sb2, sc); bounce (sb0, sc); - rc = zmq_disconnect (sc, "tcp://[::1]:5560"); + rc = zmq_disconnect (sc, my_endpoint_0); assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://[::1]:5564;[::1]:5562"); + rc = zmq_disconnect (sc, my_endpoint_3); assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://[::1]:5561"); + rc = zmq_disconnect (sc, my_endpoint_1); assert (rc == 0); - rc = zmq_unbind (sb0, "tcp://[::1]:5560"); + rc = zmq_unbind (sb0, my_endpoint_0); assert (rc == 0); - rc = zmq_unbind (sb1, "tcp://[::1]:5561"); + rc = zmq_unbind (sb1, my_endpoint_1); assert (rc == 0); - rc = zmq_unbind (sb2, "tcp://[::1]:5562"); + rc = zmq_unbind (sb2, my_endpoint_2); assert (rc == 0); rc = zmq_close (sc); @@ -324,47 +192,90 @@ void test_multi_connect_ipv6 (void) assert (rc == 0); } -void test_multi_connect_ipv6_same_port (void) +void test_multi_connect_same_port (const char *address) { + size_t len = MAX_SOCKET_STRING; + char my_endpoint_0[MAX_SOCKET_STRING]; + char my_endpoint_1[MAX_SOCKET_STRING]; + char my_endpoint_2[MAX_SOCKET_STRING * 2]; + char my_endpoint_3[MAX_SOCKET_STRING * 2]; + char my_endpoint_4[MAX_SOCKET_STRING * 2]; + char my_endpoint_5[MAX_SOCKET_STRING * 2]; void *ctx = zmq_ctx_new (); assert (ctx); - if (!is_ipv6_available ()) { + int ipv6; + if (streq(address, "tcp://127.0.0.1:*")) + ipv6 = 0; + else if (streq(address, "tcp://[::1]:*")) + ipv6 = 1; + else + assert (false); + + if (ipv6 && !is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb0 = zmq_socket (ctx, ZMQ_REP); assert (sb0); - int ipv6 = 1; int rc = zmq_setsockopt (sb0, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb0, "tcp://[::1]:5560"); + rc = zmq_bind (sb0, address); assert (rc == 0); + rc = zmq_getsockopt (sb0, ZMQ_LAST_ENDPOINT, my_endpoint_0, &len); + assert (rc == 0); void *sb1 = zmq_socket (ctx, ZMQ_REP); assert (sb1); rc = zmq_setsockopt (sb1, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb1, "tcp://[::1]:5561"); + rc = zmq_bind (sb1, address); assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (sb1, ZMQ_LAST_ENDPOINT, my_endpoint_1, &len); + assert (rc == 0); void *sc0 = zmq_socket (ctx, ZMQ_REQ); assert (sc0); rc = zmq_setsockopt (sc0, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_connect (sc0, "tcp://[::1]:5564;[::1]:5560"); + if (!ipv6) + sprintf (my_endpoint_2, "tcp://127.0.0.1:5564;%s", + strrchr(my_endpoint_0, '/') + 1); + else + sprintf (my_endpoint_2, "tcp://[::1]:5564;%s", + strrchr(my_endpoint_0, '/') + 1); + rc = zmq_connect (sc0, my_endpoint_2); assert (rc == 0); - rc = zmq_connect (sc0, "tcp://[::1]:5565;[::1]:5561"); + if (!ipv6) + sprintf (my_endpoint_3, "tcp://127.0.0.1:5565;%s", + strrchr(my_endpoint_1, '/') + 1); + else + sprintf (my_endpoint_3, "tcp://[::1]:5565;%s", + strrchr(my_endpoint_1, '/') + 1); + rc = zmq_connect (sc0, my_endpoint_3); assert (rc == 0); void *sc1 = zmq_socket (ctx, ZMQ_REQ); assert (sc1); rc = zmq_setsockopt (sc1, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_connect (sc1, "tcp://[::1]:5565;[::1]:5560"); + if (!ipv6) + sprintf (my_endpoint_4, "tcp://127.0.0.1:5565;%s", + strrchr(my_endpoint_0, '/') + 1); + else + sprintf (my_endpoint_4, "tcp://[::1]:5565;%s", + strrchr(my_endpoint_0, '/') + 1); + rc = zmq_connect (sc1, my_endpoint_4); assert (rc == 0); - rc = zmq_connect (sc1, "tcp://[::1]:5564;[::1]:5561"); + if (!ipv6) + sprintf (my_endpoint_5, "tcp://127.0.0.1:5564;%s", + strrchr(my_endpoint_1, '/') + 1); + else + sprintf (my_endpoint_5, "tcp://[::1]:5564;%s", + strrchr(my_endpoint_1, '/') + 1); + rc = zmq_connect (sc1, my_endpoint_5); assert (rc == 0); bounce (sb0, sc0); @@ -374,19 +285,19 @@ void test_multi_connect_ipv6_same_port (void) bounce (sb0, sc0); bounce (sb1, sc0); - rc = zmq_disconnect (sc1, "tcp://[::1]:5565;[::1]:5560"); + rc = zmq_disconnect (sc1, my_endpoint_4); assert (rc == 0); - rc = zmq_disconnect (sc1, "tcp://[::1]:5564;[::1]:5561"); + rc = zmq_disconnect (sc1, my_endpoint_5); assert (rc == 0); - rc = zmq_disconnect (sc0, "tcp://[::1]:5564;[::1]:5560"); + rc = zmq_disconnect (sc0, my_endpoint_2); assert (rc == 0); - rc = zmq_disconnect (sc0, "tcp://[::1]:5565;[::1]:5561"); + rc = zmq_disconnect (sc0, my_endpoint_3); assert (rc == 0); - rc = zmq_unbind (sb0, "tcp://[::1]:5560"); + rc = zmq_unbind (sb0, my_endpoint_0); assert (rc == 0); - rc = zmq_unbind (sb1, "tcp://[::1]:5561"); + rc = zmq_unbind (sb1, my_endpoint_1); assert (rc == 0); rc = zmq_close (sc0); @@ -409,17 +320,17 @@ int main (void) { setup_test_environment (); - test_single_connect_ipv4 (); + test_single_connect ("tcp://127.0.0.1:*"); - test_multi_connect_ipv4 (); + test_multi_connect ("tcp://127.0.0.1:*"); - test_multi_connect_ipv4_same_port (); + test_multi_connect_same_port ("tcp://127.0.0.1:*"); - test_single_connect_ipv6 (); + test_single_connect ("tcp://[::1]:*"); - test_multi_connect_ipv6 (); + test_multi_connect ("tcp://[::1]:*"); - test_multi_connect_ipv6_same_port (); + test_multi_connect_same_port ("tcp://[::1]:*"); return 0 ; } diff --git a/tests/test_router_handover.cpp b/tests/test_router_handover.cpp index 4a9123b4..8ded7622 100644 --- a/tests/test_router_handover.cpp +++ b/tests/test_router_handover.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,12 +32,17 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *router = zmq_socket (ctx, ZMQ_ROUTER); assert (router); - int rc = zmq_bind (router, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Enable the handover flag @@ -50,7 +55,7 @@ int main (void) assert (dealer_one); rc = zmq_setsockopt (dealer_one, ZMQ_IDENTITY, "X", 1); assert (rc == 0); - rc = zmq_connect (dealer_one, "tcp://127.0.0.1:5560"); + rc = zmq_connect (dealer_one, my_endpoint); assert (rc == 0); // Get message from dealer to know when connection is ready @@ -68,7 +73,7 @@ int main (void) assert (dealer_two); rc = zmq_setsockopt (dealer_two, ZMQ_IDENTITY, "X", 1); assert (rc == 0); - rc = zmq_connect (dealer_two, "tcp://127.0.0.1:5560"); + rc = zmq_connect (dealer_two, my_endpoint); assert (rc == 0); // Get message from dealer to know when connection is ready diff --git a/tests/test_router_mandatory.cpp b/tests/test_router_mandatory.cpp index 9d1efc04..40325625 100644 --- a/tests/test_router_mandatory.cpp +++ b/tests/test_router_mandatory.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,12 +32,17 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *router = zmq_socket (ctx, ZMQ_ROUTER); assert (router); - int rc = zmq_bind (router, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Send a message to an unknown peer with the default setting @@ -60,7 +65,7 @@ int main (void) assert (dealer); rc = zmq_setsockopt (dealer, ZMQ_IDENTITY, "X", 1); assert (rc == 0); - rc = zmq_connect (dealer, "tcp://127.0.0.1:5560"); + rc = zmq_connect (dealer, my_endpoint); assert (rc == 0); // Get message from dealer to know when connection is ready diff --git a/tests/test_router_mandatory_hwm.cpp b/tests/test_router_mandatory_hwm.cpp index c2c529a0..a697b47e 100644 --- a/tests/test_router_mandatory_hwm.cpp +++ b/tests/test_router_mandatory_hwm.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -41,6 +41,8 @@ int main (void) int rc; if (TRACE_ENABLED) fprintf(stderr, "Staring router mandatory HWM test ...\n"); setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *router = zmq_socket (ctx, ZMQ_ROUTER); @@ -57,7 +59,9 @@ int main (void) rc = zmq_setsockopt (router, ZMQ_LINGER, &linger, sizeof (linger)); assert (rc == 0); - rc = zmq_bind (router, "tcp://127.0.0.1:5560"); + rc = zmq_bind (router, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (router, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Create dealer called "X" and connect it to our router, configure HWM @@ -69,7 +73,7 @@ int main (void) rc = zmq_setsockopt (dealer, ZMQ_RCVHWM, &rcvhwm, sizeof (rcvhwm)); assert (rc == 0); - rc = zmq_connect (dealer, "tcp://127.0.0.1:5560"); + rc = zmq_connect (dealer, my_endpoint); assert (rc == 0); // Get message from dealer to know when connection is ready diff --git a/tests/test_security_curve.cpp b/tests/test_security_curve.cpp index 624baaf7..ccfad10c 100644 --- a/tests/test_security_curve.cpp +++ b/tests/test_security_curve.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -173,7 +173,12 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (server, ZMQ_IDENTITY, "IDENT", 6); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9998"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); #ifdef ZMQ_BUILD_DRAFT_API @@ -200,7 +205,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, client_secret, 41); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); bounce (server, client); rc = zmq_close (client); @@ -222,7 +227,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, client_secret, 41); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -242,7 +247,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, client_secret, 41); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -262,7 +267,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, garbage_key, 41); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -286,7 +291,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, bogus_secret, 41); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -300,7 +305,7 @@ int main (void) // This must be caught by the curve_server class, not passed to ZAP client = zmq_socket (ctx, ZMQ_DEALER); assert (client); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -325,8 +330,12 @@ int main (void) struct sockaddr_in ip4addr; int s; + unsigned short int port; + rc = sscanf(my_endpoint, "tcp://127.0.0.1:%hu", &port); + assert (rc == 1); + ip4addr.sin_family = AF_INET; - ip4addr.sin_port = htons (9998); + ip4addr.sin_port = htons (port); #if defined (ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600) ip4addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); #else diff --git a/tests/test_security_gssapi.cpp b/tests/test_security_gssapi.cpp index 32fa0016..71e8e0bc 100644 --- a/tests/test_security_gssapi.cpp +++ b/tests/test_security_gssapi.cpp @@ -141,7 +141,7 @@ static void zap_handler (void *handler) zmq_close (handler); } -void test_valid_creds (void *ctx, void *server, void *server_mon) +void test_valid_creds (void *ctx, void *server, void *server_mon, char *endpoint) { void *client = zmq_socket (ctx, ZMQ_DEALER); assert (client); @@ -155,7 +155,7 @@ void test_valid_creds (void *ctx, void *server, void *server_mon) rc = zmq_setsockopt (client, ZMQ_GSSAPI_PRINCIPAL_NAMETYPE, &name_type, sizeof (name_type)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, endpoint); assert (rc == 0); bounce (server, client); @@ -169,7 +169,7 @@ void test_valid_creds (void *ctx, void *server, void *server_mon) // Check security with valid but unauthorized credentials // Note: ZAP may see multiple requests - after a failure, client will // fall back to other crypto types for principal, if available. -void test_unauth_creds (void *ctx, void *server, void *server_mon) +void test_unauth_creds (void *ctx, void *server, void *server_mon, char *endpoint) { void *client = zmq_socket (ctx, ZMQ_DEALER); assert (client); @@ -184,7 +184,7 @@ void test_unauth_creds (void *ctx, void *server, void *server_mon) &name_type, sizeof (name_type)); assert (rc == 0); zap_deny_all = 1; - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, endpoint); assert (rc == 0); expect_bounce_fail (server, client); @@ -196,11 +196,11 @@ void test_unauth_creds (void *ctx, void *server, void *server_mon) // Check GSSAPI security with NULL client credentials // This must be caught by the gssapi_server class, not passed to ZAP -void test_null_creds (void *ctx, void *server, void *server_mon) +void test_null_creds (void *ctx, void *server, void *server_mon, char *endpoint) { void *client = zmq_socket (ctx, ZMQ_DEALER); assert (client); - int rc = zmq_connect (client, "tcp://localhost:9998"); + int rc = zmq_connect (client, endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -211,7 +211,7 @@ void test_null_creds (void *ctx, void *server, void *server_mon) // Check GSSAPI security with PLAIN client credentials // This must be caught by the curve_server class, not passed to ZAP -void test_plain_creds (void *ctx, void *server, void *server_mon) +void test_plain_creds (void *ctx, void *server, void *server_mon, char *endpoint) { void *client = zmq_socket (ctx, ZMQ_DEALER); assert (client); @@ -219,17 +219,22 @@ void test_plain_creds (void *ctx, void *server, void *server_mon) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_PLAIN_PASSWORD, "password", 8); assert (rc == 0); + rc = zmq_connect (client, endpoint); + assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); } // Unauthenticated messages from a vanilla socket shouldn't be received -void test_vanilla_socket (void *ctx, void *server, void *server_mon) +void test_vanilla_socket (void *ctx, void *server, void *server_mon, char *endpoint) { struct sockaddr_in ip4addr; int s; + unsigned short int port; + int rc = sscanf(endpoint, "tcp://127.0.0.1:%hu", &port); + assert (rc == 1); ip4addr.sin_family = AF_INET; - ip4addr.sin_port = htons (9998); + ip4addr.sin_port = htons (port); #if defined (ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600) ip4addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); #else @@ -266,6 +271,9 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; + // Spawn ZAP handler // We create and bind ZAP socket in main thread to avoid case // where child thread does not start up fast enough. @@ -288,7 +296,9 @@ int main (void) rc = zmq_setsockopt (server, ZMQ_GSSAPI_PRINCIPAL_NAMETYPE, &name_type, sizeof (name_type)); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9998"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // Monitor handshake events on the server @@ -305,11 +315,11 @@ int main (void) assert (rc == 0); // Attempt various connections - test_valid_creds (ctx, server, server_mon); - test_null_creds (ctx, server, server_mon); - test_plain_creds (ctx, server, server_mon); - test_vanilla_socket (ctx, server, server_mon); - test_unauth_creds (ctx, server, server_mon); + test_valid_creds (ctx, server, server_mon, my_endpoint); + test_null_creds (ctx, server, server_mon, my_endpoint); + test_plain_creds (ctx, server, server_mon, my_endpoint); + test_vanilla_socket (ctx, server, server_mon, my_endpoint); + test_unauth_creds (ctx, server, server_mon, my_endpoint); // Shutdown close_zero_linger (server_mon); diff --git a/tests/test_security_null.cpp b/tests/test_security_null.cpp index 7874aa75..4e4b3ac9 100644 --- a/tests/test_security_null.cpp +++ b/tests/test_security_null.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -85,6 +85,8 @@ zap_handler (void *handler) int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -105,9 +107,11 @@ int main (void) assert (server); void *client = zmq_socket (ctx, ZMQ_DEALER); assert (client); - rc = zmq_bind (server, "tcp://127.0.0.1:9000"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:9000"); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); bounce (server, client); close_zero_linger (client); @@ -122,9 +126,12 @@ int main (void) assert (client); rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "WRONG", 5); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9001"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:9001"); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -137,9 +144,12 @@ int main (void) assert (client); rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "TEST", 4); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9002"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect (client, "tcp://127.0.0.1:9002"); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); bounce (server, client); close_zero_linger (client); @@ -150,14 +160,22 @@ int main (void) assert (server); rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "WRONG", 5); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9003"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); struct sockaddr_in ip4addr; int s; + unsigned short int port; + rc = sscanf(my_endpoint, "tcp://127.0.0.1:%hu", &port); + assert (rc == 1); + ip4addr.sin_family = AF_INET; - ip4addr.sin_port = htons(9003); + ip4addr.sin_port = htons(port); #if defined (ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600) ip4addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); #else diff --git a/tests/test_security_plain.cpp b/tests/test_security_plain.cpp index a0337f0a..c587cf2b 100644 --- a/tests/test_security_plain.cpp +++ b/tests/test_security_plain.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -97,6 +97,8 @@ zap_handler (void *ctx) int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -111,7 +113,9 @@ int main (void) int as_server = 1; rc = zmq_setsockopt (server, ZMQ_PLAIN_SERVER, &as_server, sizeof (int)); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9998"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); char username [256]; @@ -126,7 +130,7 @@ int main (void) strcpy (password, "password"); rc = zmq_setsockopt (client, ZMQ_PLAIN_PASSWORD, password, strlen (password)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); bounce (server, client); rc = zmq_close (client); @@ -139,7 +143,7 @@ int main (void) as_server = 1; rc = zmq_setsockopt (client, ZMQ_PLAIN_SERVER, &as_server, sizeof (int)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -153,7 +157,7 @@ int main (void) assert (rc == 0); rc = zmq_setsockopt (client, ZMQ_PLAIN_PASSWORD, password, strlen (password)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9998"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); expect_bounce_fail (server, client); close_zero_linger (client); @@ -162,8 +166,12 @@ int main (void) struct sockaddr_in ip4addr; int s; + unsigned short int port; + rc = sscanf(my_endpoint, "tcp://127.0.0.1:%hu", &port); + assert (rc == 1); + ip4addr.sin_family = AF_INET; - ip4addr.sin_port = htons (9998); + ip4addr.sin_port = htons (port); #if defined (ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600) ip4addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); #else diff --git a/tests/test_shutdown_stress.cpp b/tests/test_shutdown_stress.cpp index 6e9968fb..d34f3577 100644 --- a/tests/test_shutdown_stress.cpp +++ b/tests/test_shutdown_stress.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -31,17 +31,27 @@ #define THREAD_COUNT 100 +struct thread_data { + void *ctx; + char endpoint[MAX_SOCKET_STRING]; +}; + extern "C" { - static void worker (void *s) + static void worker (void *data) { int rc; + void *socket; + struct thread_data *tdata = (struct thread_data *)data; - rc = zmq_connect (s, "tcp://127.0.0.1:5560"); + socket = zmq_socket (tdata->ctx, ZMQ_SUB); + assert (socket); + + rc = zmq_connect (socket, tdata->endpoint); assert (rc == 0); // Start closing the socket while the connecting process is underway. - rc = zmq_close (s); + rc = zmq_close (socket); assert (rc == 0); } } @@ -49,8 +59,7 @@ extern "C" int main (void) { setup_test_environment(); - void *s1; - void *s2; + void *socket; int i; int j; int rc; @@ -59,30 +68,32 @@ int main (void) for (j = 0; j != 10; j++) { // Check the shutdown with many parallel I/O threads. - void *ctx = zmq_ctx_new (); - assert (ctx); - zmq_ctx_set (ctx, ZMQ_IO_THREADS, 7); + struct thread_data tdata; + tdata.ctx = zmq_ctx_new (); + assert (tdata.ctx); + zmq_ctx_set (tdata.ctx, ZMQ_IO_THREADS, 7); - s1 = zmq_socket (ctx, ZMQ_PUB); - assert (s1); + socket = zmq_socket (tdata.ctx, ZMQ_PUB); + assert (socket); - rc = zmq_bind (s1, "tcp://127.0.0.1:5560"); + rc = zmq_bind (socket, "tcp://127.0.0.1:*"); + assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (socket, ZMQ_LAST_ENDPOINT, tdata.endpoint, &len); assert (rc == 0); for (i = 0; i != THREAD_COUNT; i++) { - s2 = zmq_socket (ctx, ZMQ_SUB); - assert (s2); - threads [i] = zmq_threadstart(&worker, s2); + threads [i] = zmq_threadstart(&worker, &tdata); } for (i = 0; i != THREAD_COUNT; i++) { zmq_threadclose(threads [i]); } - rc = zmq_close (s1); + rc = zmq_close (socket); assert (rc == 0); - rc = zmq_ctx_term (ctx); + rc = zmq_ctx_term (tdata.ctx); assert (rc == 0); } diff --git a/tests/test_spec_dealer.cpp b/tests/test_spec_dealer.cpp index 92f1923e..67652225 100644 --- a/tests/test_spec_dealer.cpp +++ b/tests/test_spec_dealer.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -30,7 +30,7 @@ #include "testutil.hpp" const char *bind_address = 0; -const char *connect_address = 0; +char connect_address[MAX_SOCKET_STRING]; void test_round_robin_out (void *ctx) { @@ -39,6 +39,9 @@ void test_round_robin_out (void *ctx) int rc = zmq_bind (dealer, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (dealer, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *rep [services]; @@ -91,6 +94,9 @@ void test_fair_queue_in (void *ctx) rc = zmq_bind (receiver, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (receiver, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *senders [services]; @@ -145,6 +151,9 @@ void test_destroy_queue_on_disconnect (void *ctx) int rc = zmq_bind (A, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (A, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); void *B = zmq_socket (ctx, ZMQ_DEALER); assert (B); @@ -227,12 +236,10 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); - const char *binds [] = { "inproc://a", "tcp://127.0.0.1:5555" }; - const char *connects [] = { "inproc://a", "tcp://localhost:5555" }; + const char *binds [] = { "inproc://a", "tcp://127.0.0.1:*" }; for (int transports = 0; transports < 2; ++transports) { bind_address = binds [transports]; - connect_address = connects [transports]; // SHALL route outgoing messages to available peers using a round-robin // strategy. diff --git a/tests/test_spec_pushpull.cpp b/tests/test_spec_pushpull.cpp index 1cfa7f63..43b6b342 100644 --- a/tests/test_spec_pushpull.cpp +++ b/tests/test_spec_pushpull.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -30,7 +30,7 @@ #include "testutil.hpp" const char *bind_address = 0; -const char *connect_address = 0; +char connect_address[MAX_SOCKET_STRING]; void test_push_round_robin_out (void *ctx) { @@ -39,6 +39,9 @@ void test_push_round_robin_out (void *ctx) int rc = zmq_bind (push, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (push, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *pulls [services]; @@ -85,6 +88,9 @@ void test_pull_fair_queue_in (void *ctx) int rc = zmq_bind (pull, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (pull, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *pushs [services]; @@ -187,6 +193,9 @@ void test_destroy_queue_on_disconnect (void *ctx) rc = zmq_bind (A, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (A, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); void *B = zmq_socket (ctx, ZMQ_PULL); assert (B); @@ -264,12 +273,10 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); - const char *binds [] = { "inproc://a", "tcp://127.0.0.1:5555" }; - const char *connects [] = { "inproc://a", "tcp://localhost:5555" }; + const char *binds [] = { "inproc://a", "tcp://127.0.0.1:*" }; for (int transport = 0; transport < 2; ++transport) { bind_address = binds [transport]; - connect_address = connects [transport]; // PUSH: SHALL route outgoing messages to connected peers using a // round-robin strategy. diff --git a/tests/test_spec_rep.cpp b/tests/test_spec_rep.cpp index 1b2de517..815e848e 100644 --- a/tests/test_spec_rep.cpp +++ b/tests/test_spec_rep.cpp @@ -30,7 +30,7 @@ #include "testutil.hpp" const char *bind_address = 0; -const char *connect_address = 0; +char connect_address[MAX_SOCKET_STRING]; void test_fair_queue_in (void *ctx) { @@ -43,6 +43,9 @@ void test_fair_queue_in (void *ctx) rc = zmq_bind (rep, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (rep, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *reqs [services]; @@ -106,6 +109,9 @@ void test_envelope (void *ctx) int rc = zmq_bind (rep, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (rep, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); void *dealer = zmq_socket (ctx, ZMQ_DEALER); assert (dealer); @@ -138,12 +144,10 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); - const char *binds [] = { "inproc://a", "tcp://127.0.0.1:5555" }; - const char *connects [] = { "inproc://a", "tcp://localhost:5555" }; + const char *binds [] = { "inproc://a", "tcp://127.0.0.1:*" }; for (int transport = 0; transport < 2; ++transport) { bind_address = binds [transport]; - connect_address = connects [transport]; // SHALL receive incoming messages from its peers using a fair-queuing // strategy. diff --git a/tests/test_spec_req.cpp b/tests/test_spec_req.cpp index 1cec67f9..25059826 100644 --- a/tests/test_spec_req.cpp +++ b/tests/test_spec_req.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -30,7 +30,7 @@ #include "testutil.hpp" const char *bind_address = 0; -const char *connect_address = 0; +char connect_address[MAX_SOCKET_STRING]; void test_round_robin_out (void *ctx) { @@ -39,6 +39,9 @@ void test_round_robin_out (void *ctx) int rc = zmq_bind (req, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (req, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *rep [services]; @@ -84,6 +87,9 @@ void test_req_only_listens_to_current_peer (void *ctx) rc = zmq_bind (req, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (req, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 3; void *router [services]; @@ -148,6 +154,9 @@ void test_req_message_format (void *ctx) int rc = zmq_bind (req, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (req, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); rc = zmq_connect (router, connect_address); assert (rc == 0); @@ -223,12 +232,10 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); - const char *binds [] = { "inproc://a", "tcp://127.0.0.1:5555" }; - const char *connects [] = { "inproc://a", "tcp://localhost:5555" }; + const char *binds [] = { "inproc://a", "tcp://127.0.0.1:*" }; for (int transport = 0; transport < 2; transport++) { bind_address = binds [transport]; - connect_address = connects [transport]; // SHALL route outgoing messages to connected peers using a round-robin // strategy. diff --git a/tests/test_spec_router.cpp b/tests/test_spec_router.cpp index fadecdfe..697e401f 100644 --- a/tests/test_spec_router.cpp +++ b/tests/test_spec_router.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -30,7 +30,7 @@ #include "testutil.hpp" const char *bind_address = 0; -const char *connect_address = 0; +char connect_address[MAX_SOCKET_STRING]; void test_fair_queue_in (void *ctx) { @@ -43,6 +43,9 @@ void test_fair_queue_in (void *ctx) rc = zmq_bind (receiver, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (receiver, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); const size_t services = 5; void *senders [services]; @@ -120,6 +123,9 @@ void test_destroy_queue_on_disconnect (void *ctx) rc = zmq_bind (A, bind_address); assert (rc == 0); + size_t len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (A, ZMQ_LAST_ENDPOINT, connect_address, &len); + assert (rc == 0); void *B = zmq_socket (ctx, ZMQ_DEALER); assert (B); @@ -188,12 +194,10 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); - const char *binds [] = { "inproc://a", "tcp://127.0.0.1:5555" }; - const char *connects [] = { "inproc://a", "tcp://localhost:5555" }; + const char *binds [] = { "inproc://a", "tcp://127.0.0.1:*" }; for (int transport = 0; transport < 2; ++transport) { bind_address = binds [transport]; - connect_address = connects [transport]; // SHALL receive incoming messages from its peers using a fair-queuing // strategy. diff --git a/tests/test_srcfd.cpp b/tests/test_srcfd.cpp index 26c00ff3..89fbebc5 100644 --- a/tests/test_srcfd.cpp +++ b/tests/test_srcfd.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -43,6 +43,8 @@ int main (void) { int rc; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; setup_test_environment(); // Create the infrastructure @@ -54,10 +56,13 @@ int main (void) void *req = zmq_socket (ctx, ZMQ_REQ); assert (req); - rc = zmq_bind(rep, "tcp://127.0.0.1:5560"); + rc = zmq_bind(rep, "tcp://127.0.0.1:*"); assert (rc == 0); - rc = zmq_connect(req, "tcp://127.0.0.1:5560"); + rc = zmq_getsockopt(rep, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + + rc = zmq_connect(req, my_endpoint); assert (rc == 0); char tmp[MSG_SIZE]; diff --git a/tests/test_stream.cpp b/tests/test_stream.cpp index 00474989..7f794674 100644 --- a/tests/test_stream.cpp +++ b/tests/test_stream.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -57,6 +57,8 @@ static void test_stream_to_dealer (void) { int rc; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); @@ -72,15 +74,18 @@ test_stream_to_dealer (void) int enabled = 1; rc = zmq_setsockopt (stream, ZMQ_STREAM_NOTIFY, &enabled, sizeof (enabled)); assert (rc == 0); - rc = zmq_bind (stream, "tcp://127.0.0.1:5556"); + rc = zmq_bind (stream, "tcp://127.0.0.1:*"); assert (rc == 0); + rc = zmq_getsockopt (stream, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + // We'll be using this socket as the other peer void *dealer = zmq_socket (ctx, ZMQ_DEALER); assert (dealer); rc = zmq_setsockopt (dealer, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); - rc = zmq_connect (dealer, "tcp://localhost:5556"); + rc = zmq_connect (dealer, my_endpoint); // Send a message on the dealer socket rc = zmq_send (dealer, "Hello", 5, 0); @@ -232,6 +237,8 @@ static void test_stream_to_stream (void) { int rc; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // Set-up our context and sockets void *ctx = zmq_ctx_new (); assert (ctx); @@ -241,14 +248,16 @@ test_stream_to_stream (void) int enabled = 1; rc = zmq_setsockopt (server, ZMQ_STREAM_NOTIFY, &enabled, sizeof (enabled)); assert (rc == 0); - rc = zmq_bind (server, "tcp://127.0.0.1:9070"); + rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *client = zmq_socket (ctx, ZMQ_STREAM); assert (client); rc = zmq_setsockopt (client, ZMQ_STREAM_NOTIFY, &enabled, sizeof (enabled)); assert (rc == 0); - rc = zmq_connect (client, "tcp://localhost:9070"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); uint8_t id [256]; size_t id_size = 256; diff --git a/tests/test_stream_disconnect.cpp b/tests/test_stream_disconnect.cpp index d9ce260a..aae9d87f 100644 --- a/tests/test_stream_disconnect.cpp +++ b/tests/test_stream_disconnect.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -65,6 +65,9 @@ int main(int, char**) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char bind_endpoint[MAX_SOCKET_STRING]; + char connect_endpoint[MAX_SOCKET_STRING]; void *context = zmq_ctx_new (); void *sockets [2]; int rc = 0; @@ -73,13 +76,24 @@ int main(int, char**) int enabled = 1; rc = zmq_setsockopt (sockets [SERVER], ZMQ_STREAM_NOTIFY, &enabled, sizeof (enabled)); assert (rc == 0); - rc = zmq_bind (sockets [SERVER], "tcp://0.0.0.0:6666"); + rc = zmq_bind (sockets [SERVER], "tcp://0.0.0.0:*"); assert (rc == 0); + rc = zmq_getsockopt (sockets [SERVER], ZMQ_LAST_ENDPOINT, bind_endpoint, + &len); + assert (rc == 0); + + // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome. +#ifdef ZMQ_HAVE_WINDOWS + sprintf (connect_endpoint, "tcp://127.0.0.1:%s", + strrchr(bind_endpoint, ':') + 1); +#else + strcpy (connect_endpoint, bind_endpoint); +#endif sockets [CLIENT] = zmq_socket (context, ZMQ_STREAM); rc = zmq_setsockopt (sockets [CLIENT], ZMQ_STREAM_NOTIFY, &enabled, sizeof (enabled)); assert (rc == 0); - rc = zmq_connect (sockets [CLIENT], "tcp://localhost:6666"); + rc = zmq_connect (sockets [CLIENT], connect_endpoint); assert (rc == 0); // wait for connect notification diff --git a/tests/test_stream_empty.cpp b/tests/test_stream_empty.cpp index 1287d840..23a7b501 100644 --- a/tests/test_stream_empty.cpp +++ b/tests/test_stream_empty.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -31,6 +31,8 @@ int main (void) { setup_test_environment (); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); @@ -39,9 +41,11 @@ int main (void) { void *dealer = zmq_socket (ctx, ZMQ_DEALER); assert (dealer); - int rc = zmq_bind (stream, "tcp://127.0.0.1:5555"); + int rc = zmq_bind (stream, "tcp://127.0.0.1:*"); assert (rc >= 0); - rc = zmq_connect (dealer, "tcp://127.0.0.1:5555"); + rc = zmq_getsockopt (stream, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + rc = zmq_connect (dealer, my_endpoint); assert (rc >= 0); zmq_send (dealer, "", 0, 0); diff --git a/tests/test_stream_timeout.cpp b/tests/test_stream_timeout.cpp index 2b6ce11f..d1421e94 100644 --- a/tests/test_stream_timeout.cpp +++ b/tests/test_stream_timeout.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -68,6 +68,8 @@ static void test_stream_handshake_timeout_accept (void) { int rc; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); @@ -80,8 +82,6 @@ test_stream_handshake_timeout_accept (void) int zero = 0; rc = zmq_setsockopt (stream, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); - rc = zmq_connect (stream, "tcp://localhost:5557"); - assert (rc == 0); // We'll be using this socket to test TCP stream handshake timeout void *dealer = zmq_socket (ctx, ZMQ_DEALER); @@ -119,7 +119,12 @@ test_stream_handshake_timeout_accept (void) assert (rc == 0); // bind dealer socket to accept connection from non-sending stream socket - rc = zmq_bind (dealer, "tcp://127.0.0.1:5557"); + rc = zmq_bind (dealer, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (dealer, ZMQ_LAST_ENDPOINT, my_endpoint, &len); + assert (rc == 0); + + rc = zmq_connect (stream, my_endpoint); assert (rc == 0); // we should get ZMQ_EVENT_ACCEPTED and then ZMQ_EVENT_DISCONNECTED @@ -145,6 +150,8 @@ static void test_stream_handshake_timeout_connect (void) { int rc; + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; // Set up our context and sockets void *ctx = zmq_ctx_new (); @@ -157,7 +164,9 @@ test_stream_handshake_timeout_connect (void) int zero = 0; rc = zmq_setsockopt (stream, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); - rc = zmq_bind (stream, "tcp://127.0.0.1:5556"); + rc = zmq_bind (stream, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (stream, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); // We'll be using this socket to test TCP stream handshake timeout @@ -196,7 +205,7 @@ test_stream_handshake_timeout_connect (void) assert (rc == 0); // connect dealer socket to non-sending stream socket - rc = zmq_connect (dealer, "tcp://localhost:5556"); + rc = zmq_connect (dealer, my_endpoint); assert (rc == 0); // we should get ZMQ_EVENT_CONNECTED and then ZMQ_EVENT_DISCONNECTED diff --git a/tests/test_sub_forward.cpp b/tests/test_sub_forward.cpp index 19b57e55..ccf3e770 100644 --- a/tests/test_sub_forward.cpp +++ b/tests/test_sub_forward.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,29 +32,37 @@ int main (void) { setup_test_environment(); + size_t len = MAX_SOCKET_STRING; + char endpoint1[MAX_SOCKET_STRING]; + char endpoint2[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); // First, create an intermediate device void *xpub = zmq_socket (ctx, ZMQ_XPUB); assert (xpub); - int rc = zmq_bind (xpub, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (xpub, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (xpub, ZMQ_LAST_ENDPOINT, endpoint1, &len); assert (rc == 0); void *xsub = zmq_socket (ctx, ZMQ_XSUB); assert (xsub); - rc = zmq_bind (xsub, "tcp://127.0.0.1:5561"); + rc = zmq_bind (xsub, "tcp://127.0.0.1:*"); + assert (rc == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (xsub, ZMQ_LAST_ENDPOINT, endpoint2, &len); assert (rc == 0); // Create a publisher void *pub = zmq_socket (ctx, ZMQ_PUB); assert (pub); - rc = zmq_connect (pub, "tcp://127.0.0.1:5561"); + rc = zmq_connect (pub, endpoint2); assert (rc == 0); // Create a subscriber void *sub = zmq_socket (ctx, ZMQ_SUB); assert (sub); - rc = zmq_connect (sub, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sub, endpoint1); assert (rc == 0); // Subscribe for all messages. diff --git a/tests/test_system.cpp b/tests/test_system.cpp index 8b09204c..68f79b58 100644 --- a/tests/test_system.cpp +++ b/tests/test_system.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -72,7 +72,7 @@ int main (void) void *ctx = zmq_ctx_new (); assert (ctx); void *dealer = zmq_socket (ctx, ZMQ_DEALER); - if (zmq_bind (dealer, "tcp://127.0.0.1:5670") == -1) { + if (zmq_bind (dealer, "tcp://127.0.0.1:*") == -1) { printf ("E: Cannot find 127.0.0.1 -- your system does not have local\n"); printf ("E: networking. Please fix this before running libzmq checks.\n"); return -1; diff --git a/tests/test_term_endpoint.cpp b/tests/test_term_endpoint.cpp index f3272588..d02c8e95 100644 --- a/tests/test_term_endpoint.cpp +++ b/tests/test_term_endpoint.cpp @@ -39,7 +39,6 @@ int main (void) int rc; char buf[BUF_SIZE]; size_t buf_size; - const char *ep = "tcp://127.0.0.1:5560"; const char *ep_wc_tcp = "tcp://127.0.0.1:*"; #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS const char *ep_wc_ipc = "ipc://*"; @@ -53,11 +52,14 @@ int main (void) assert (ctx); void *push = zmq_socket (ctx, ZMQ_PUSH); assert (push); - rc = zmq_bind (push, ep); + rc = zmq_bind (push, ep_wc_tcp); + assert (rc == 0); + buf_size = sizeof(buf); + rc = zmq_getsockopt (push, ZMQ_LAST_ENDPOINT, buf, &buf_size); assert (rc == 0); void *pull = zmq_socket (ctx, ZMQ_PULL); assert (pull); - rc = zmq_connect (pull, ep); + rc = zmq_connect (pull, buf); assert (rc == 0); // Pass one message through to ensure the connection is established @@ -67,7 +69,10 @@ int main (void) assert (rc == 3); // Unbind the listening endpoint - rc = zmq_unbind (push, ep); + buf_size = sizeof(buf); + rc = zmq_getsockopt (push, ZMQ_LAST_ENDPOINT, buf, &buf_size); + assert (rc == 0); + rc = zmq_unbind (push, buf); assert (rc == 0); // Allow unbind to settle @@ -88,13 +93,16 @@ int main (void) // Create infrastructure ctx = zmq_ctx_new (); assert (ctx); - push = zmq_socket (ctx, ZMQ_PUSH); - assert (push); - rc = zmq_connect (push, ep); - assert (rc == 0); pull = zmq_socket (ctx, ZMQ_PULL); assert (pull); - rc = zmq_bind (pull, ep); + rc = zmq_bind (pull, ep_wc_tcp); + assert (rc == 0); + buf_size = sizeof(buf); + rc = zmq_getsockopt (pull, ZMQ_LAST_ENDPOINT, buf, &buf_size); + assert (rc == 0); + push = zmq_socket (ctx, ZMQ_PUSH); + assert (push); + rc = zmq_connect (push, buf); assert (rc == 0); // Pass one message through to ensure the connection is established. @@ -104,7 +112,10 @@ int main (void) assert (rc == 3); // Disconnect the bound endpoint - rc = zmq_disconnect (push, ep); + buf_size = sizeof(buf); + rc = zmq_getsockopt (pull, ZMQ_LAST_ENDPOINT, buf, &buf_size); + assert (rc == 0); + rc = zmq_disconnect (push, buf); assert (rc == 0); // Allow disconnect to settle diff --git a/tests/test_thread_safe.cpp b/tests/test_thread_safe.cpp index 4660ca4b..bd9976e5 100644 --- a/tests/test_thread_safe.cpp +++ b/tests/test_thread_safe.cpp @@ -1,5 +1,5 @@ /*: - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -45,11 +45,15 @@ void client_thread (void *client) int main (void) { setup_test_environment (); + size_t len = MAX_SOCKET_STRING; + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *server = zmq_socket (ctx, ZMQ_SERVER); - int rc = zmq_bind (server, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (server, "tcp://127.0.0.1:*"); + assert (rc == 0); + rc = zmq_getsockopt (server, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *client = zmq_socket (ctx, ZMQ_CLIENT); @@ -57,7 +61,7 @@ int main (void) size_t size = sizeof (int); zmq_getsockopt (client, ZMQ_THREAD_SAFE, &thread_safe, &size); assert (thread_safe == 1); - rc = zmq_connect (client, "tcp://127.0.0.1:5560"); + rc = zmq_connect (client, my_endpoint); assert (rc == 0); void *t1 = zmq_threadstart (client_thread, client); diff --git a/tests/test_unbind_wildcard.cpp b/tests/test_unbind_wildcard.cpp index 8ca80a1c..12088c5b 100644 --- a/tests/test_unbind_wildcard.cpp +++ b/tests/test_unbind_wildcard.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of 0MQ. @@ -32,20 +32,21 @@ int main (void) void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); - int rc = zmq_bind (sb, "tcp://*:5555"); + int rc = zmq_bind (sb, "tcp://*:*"); assert (rc == 0); char bindEndpoint[256]; + char connectEndpoint[256]; size_t endpoint_len = sizeof (bindEndpoint); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len); assert (rc == 0); - char connectEndpoint[256]; - + // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome. #ifdef ZMQ_HAVE_WINDOWS - strcpy(connectEndpoint, "tcp://127.0.0.1:5555"); + sprintf (connectEndpoint, "tcp://127.0.0.1:%s", + strrchr(bindEndpoint, ':') + 1); #else - strcpy(connectEndpoint, bindEndpoint); + strcpy (connectEndpoint, bindEndpoint); #endif rc = zmq_connect (sc, connectEndpoint); @@ -74,21 +75,23 @@ int main (void) rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); - rc = zmq_bind (sb, "tcp://*:5556"); + rc = zmq_bind (sb, "tcp://*:*"); assert (rc == 0); - + endpoint_len = sizeof (bindEndpoint); memset(bindEndpoint, 0, endpoint_len); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len); - assert (rc == 0); + assert (rc == 0); #ifdef ZMQ_HAVE_WINDOWS if (ipv6) - strcpy(connectEndpoint, "tcp://[::1]:5556"); - else - strcpy(connectEndpoint, "tcp://127.0.0.1:5556"); + sprintf (connectEndpoint, "tcp://[::1]:%s", + strrchr(bindEndpoint, ':') + 1); + else + sprintf (connectEndpoint, "tcp://127.0.0.1:%s", + strrchr(bindEndpoint, ':') + 1); #else - strcpy(connectEndpoint, bindEndpoint); + strcpy (connectEndpoint, bindEndpoint); #endif rc = zmq_connect (sc, connectEndpoint); @@ -206,87 +209,6 @@ int main (void) assert (rc == 0); } - /* No wildcard, IPv4 address, IPv6 disabled */ - sb = zmq_socket (ctx, ZMQ_REP); - assert (sb); - sc = zmq_socket (ctx, ZMQ_REQ); - assert (sc); - - rc = zmq_bind (sb, "tcp://127.0.0.1:5557"); - assert (rc == 0); - rc = zmq_connect (sc, "tcp://127.0.0.1:5557"); - assert (rc == 0); - - bounce (sb, sc); - - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5557"); - assert (rc == 0); - rc = zmq_unbind (sb, "tcp://127.0.0.1:5557"); - assert (rc == 0); - - rc = zmq_close (sc); - assert (rc == 0); - rc = zmq_close (sb); - assert (rc == 0); - - /* No wildcard, IPv4 address, IPv6 enabled */ - sb = zmq_socket (ctx, ZMQ_REP); - assert (sb); - sc = zmq_socket (ctx, ZMQ_REQ); - assert (sc); - - rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); - assert (rc == 0); - rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); - assert (rc == 0); - - rc = zmq_bind (sb, "tcp://127.0.0.1:5558"); - assert (rc == 0); - rc = zmq_connect (sc, "tcp://127.0.0.1:5558"); - assert (rc == 0); - - bounce (sb, sc); - - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5558"); - assert (rc == 0); - rc = zmq_unbind (sb, "tcp://127.0.0.1:5558"); - assert (rc == 0); - - rc = zmq_close (sc); - assert (rc == 0); - rc = zmq_close (sb); - assert (rc == 0); - - if (ipv6) { - /* No wildcard, IPv6 address, IPv6 enabled */ - sb = zmq_socket (ctx, ZMQ_REP); - assert (sb); - sc = zmq_socket (ctx, ZMQ_REQ); - assert (sc); - - rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); - assert (rc == 0); - rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); - assert (rc == 0); - - rc = zmq_bind (sb, "tcp://[::1]:5559"); - assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5559"); - assert (rc == 0); - - bounce (sb, sc); - - rc = zmq_disconnect (sc, "tcp://[::1]:5559"); - assert (rc == 0); - rc = zmq_unbind (sb, "tcp://[::1]:5559"); - assert (rc == 0); - - rc = zmq_close (sc); - assert (rc == 0); - rc = zmq_close (sb); - assert (rc == 0); - } - rc = zmq_ctx_term (ctx); assert (rc == 0); diff --git a/tests/test_use_fd_tcp.cpp b/tests/test_use_fd_tcp.cpp index 2cafb996..e4404f7f 100644 --- a/tests/test_use_fd_tcp.cpp +++ b/tests/test_use_fd_tcp.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2016 Contributors as noted in the AUTHORS file + Copyright (c) 2016-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -32,7 +32,7 @@ #if !defined (ZMQ_HAVE_WINDOWS) #include -void pre_allocate_sock (void *zmq_socket, const char *address, +uint16_t pre_allocate_sock (void *zmq_socket, const char *address, const char *port) { struct addrinfo *addr, hint; @@ -65,25 +65,34 @@ void pre_allocate_sock (void *zmq_socket, const char *address, sizeof (s_pre)); assert(rc == 0); + struct sockaddr_in sin; + socklen_t len = sizeof(sin); + rc = getsockname(s_pre, (struct sockaddr *)&sin, &len); + assert (rc != -1); + freeaddrinfo(addr); + + return ntohs(sin.sin_port); } void test_req_rep () { + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); - pre_allocate_sock(sb, "127.0.0.1", "5560"); + uint16_t port = pre_allocate_sock(sb, "127.0.0.1", "0"); + sprintf (my_endpoint, "tcp://127.0.0.1:%u", port); - int rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (sb, my_endpoint); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); bounce (sb, sc); @@ -100,20 +109,22 @@ void test_req_rep () void test_pair () { + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *sb = zmq_socket (ctx, ZMQ_PAIR); assert (sb); - pre_allocate_sock(sb, "127.0.0.1", "5560"); + uint16_t port = pre_allocate_sock(sb, "127.0.0.1", "0"); + sprintf (my_endpoint, "tcp://127.0.0.1:%u", port); - int rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (sb, my_endpoint); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_PAIR); assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); bounce (sb, sc); @@ -131,20 +142,22 @@ void test_pair () void test_client_server () { #if defined(ZMQ_SERVER) && defined(ZMQ_CLIENT) + char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); void *sb = zmq_socket (ctx, ZMQ_SERVER); assert (sb); - pre_allocate_sock(sb, "127.0.0.1", "5560"); + uint16_t port = pre_allocate_sock(sb, "127.0.0.1", "0"); + sprintf (my_endpoint, "tcp://127.0.0.1:%u", port); - int rc = zmq_bind (sb, "tcp://127.0.0.1:5560"); + int rc = zmq_bind (sb, my_endpoint); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_CLIENT); assert (sc); - rc = zmq_connect (sc, "tcp://127.0.0.1:5560"); + rc = zmq_connect (sc, my_endpoint); assert (rc == 0); zmq_msg_t msg; diff --git a/tests/test_xpub_manual.cpp b/tests/test_xpub_manual.cpp index 1aa53288..9593affd 100644 --- a/tests/test_xpub_manual.cpp +++ b/tests/test_xpub_manual.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -196,14 +196,15 @@ int test_unsubscribe_manual() } -int test_xpub_proxy_unsubscribe_on_disconnect(const char *frontend, - const char *backend) +int test_xpub_proxy_unsubscribe_on_disconnect(void) { - assert (frontend && backend); - const char* topic = "1"; const char* payload = "X"; + size_t len = MAX_SOCKET_STRING; + char my_endpoint_backend[MAX_SOCKET_STRING]; + char my_endpoint_frontend[MAX_SOCKET_STRING]; + int manual = 1; void *ctx = zmq_ctx_new (); @@ -212,22 +213,29 @@ int test_xpub_proxy_unsubscribe_on_disconnect(const char *frontend, // proxy frontend void *xsub_proxy = zmq_socket (ctx, ZMQ_XSUB); assert (xsub_proxy); - assert (zmq_bind (xsub_proxy, frontend) == 0); + assert (zmq_bind (xsub_proxy, "tcp://127.0.0.1:*") == 0); + int rc = zmq_getsockopt (xsub_proxy, ZMQ_LAST_ENDPOINT, my_endpoint_frontend, + &len); + assert (rc == 0); // proxy backend void *xpub_proxy = zmq_socket (ctx, ZMQ_XPUB); assert (xpub_proxy); assert (zmq_setsockopt (xpub_proxy, ZMQ_XPUB_MANUAL, &manual, 4) == 0); - assert (zmq_bind (xpub_proxy, backend) == 0); + assert (zmq_bind (xpub_proxy, "tcp://127.0.0.1:*") == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (xpub_proxy, ZMQ_LAST_ENDPOINT, my_endpoint_backend, + &len); + assert (rc == 0); // publisher void *pub = zmq_socket (ctx, ZMQ_PUB); - assert (zmq_connect (pub, frontend) == 0); + assert (zmq_connect (pub, my_endpoint_frontend) == 0); // first subscriber subscribes void *sub1 = zmq_socket (ctx, ZMQ_SUB); assert (sub1); - assert (zmq_connect (sub1, backend) == 0); + assert (zmq_connect (sub1, my_endpoint_backend) == 0); assert (zmq_setsockopt (sub1, ZMQ_SUBSCRIBE, topic, 1) == 0); // wait @@ -244,7 +252,7 @@ int test_xpub_proxy_unsubscribe_on_disconnect(const char *frontend, // second subscriber subscribes void *sub2 = zmq_socket (ctx, ZMQ_SUB); assert (sub2); - assert (zmq_connect (sub2, backend) == 0); + assert (zmq_connect (sub2, my_endpoint_backend) == 0); assert (zmq_setsockopt (sub2, ZMQ_SUBSCRIBE, topic, 1) == 0); // wait @@ -335,14 +343,16 @@ int test_xpub_proxy_unsubscribe_on_disconnect(const char *frontend, return 0; } -int test_missing_subscriptions(const char *frontend, const char *backend) +int test_missing_subscriptions(void) { - assert (frontend && backend); - const char* topic1 = "1"; const char* topic2 = "2"; const char* payload = "X"; + size_t len = MAX_SOCKET_STRING; + char my_endpoint_backend[MAX_SOCKET_STRING]; + char my_endpoint_frontend[MAX_SOCKET_STRING]; + int manual = 1; void *ctx = zmq_ctx_new (); @@ -351,17 +361,24 @@ int test_missing_subscriptions(const char *frontend, const char *backend) // proxy frontend void *xsub_proxy = zmq_socket (ctx, ZMQ_XSUB); assert (xsub_proxy); - assert (zmq_bind (xsub_proxy, frontend) == 0); + assert (zmq_bind (xsub_proxy, "tcp://127.0.0.1:*") == 0); + int rc = zmq_getsockopt (xsub_proxy, ZMQ_LAST_ENDPOINT, my_endpoint_frontend, + &len); + assert (rc == 0); // proxy backend void *xpub_proxy = zmq_socket (ctx, ZMQ_XPUB); assert (xpub_proxy); assert (zmq_setsockopt (xpub_proxy, ZMQ_XPUB_MANUAL, &manual, 4) == 0); - assert (zmq_bind (xpub_proxy, backend) == 0); + assert (zmq_bind (xpub_proxy, "tcp://127.0.0.1:*") == 0); + len = MAX_SOCKET_STRING; + rc = zmq_getsockopt (xpub_proxy, ZMQ_LAST_ENDPOINT, my_endpoint_backend, + &len); + assert (rc == 0); // publisher void *pub = zmq_socket (ctx, ZMQ_PUB); - assert (zmq_connect (pub, frontend) == 0); + assert (zmq_connect (pub, my_endpoint_frontend) == 0); // Here's the problem: because subscribers subscribe in quick succession, // the proxy is unable to confirm the first subscription before receiving @@ -370,13 +387,13 @@ int test_missing_subscriptions(const char *frontend, const char *backend) // first subscriber void *sub1 = zmq_socket (ctx, ZMQ_SUB); assert (sub1); - assert (zmq_connect (sub1, backend) == 0); + assert (zmq_connect (sub1, my_endpoint_backend) == 0); assert (zmq_setsockopt (sub1, ZMQ_SUBSCRIBE, topic1, 1) == 0); // second subscriber void *sub2 = zmq_socket (ctx, ZMQ_SUB); assert (sub2); - assert (zmq_connect (sub2, backend) == 0); + assert (zmq_connect (sub2, my_endpoint_backend) == 0); assert (zmq_setsockopt (sub2, ZMQ_SUBSCRIBE, topic2, 1) == 0); // wait @@ -456,20 +473,8 @@ int main(void) setup_test_environment (); test_basic (); test_unsubscribe_manual (); - - const char *frontend; - const char *backend; - -#if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS - frontend = "ipc://frontend"; - backend = "ipc://backend"; - test_xpub_proxy_unsubscribe_on_disconnect (frontend, backend); - test_missing_subscriptions (frontend, backend); -#endif - frontend = "tcp://127.0.0.1:5560"; - backend = "tcp://127.0.0.1:5561"; - test_xpub_proxy_unsubscribe_on_disconnect (frontend, backend); - test_missing_subscriptions (frontend, backend); + test_xpub_proxy_unsubscribe_on_disconnect (); + test_missing_subscriptions (); return 0; } diff --git a/tests/testutil.hpp b/tests/testutil.hpp index d504b093..4f38212e 100644 --- a/tests/testutil.hpp +++ b/tests/testutil.hpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file + Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file This file is part of libzmq, the ZeroMQ core engine in C++. @@ -42,6 +42,17 @@ // get test failures on slower systems due to binds/connects not // settled. Tested to work reliably at 1 msec on a fast PC. #define SETTLE_TIME 300 // In msec +// Commonly used buffer size for ZMQ_LAST_ENDPOINT +#define MAX_SOCKET_STRING sizeof("tcp://127.0.0.1:65536") + +// We need to test codepaths with non-random bind ports. List them here to +// keep them unique, to allow parallel test runs. +#define ENDPOINT_0 "tcp://127.0.0.1:5555" +#define ENDPOINT_1 "tcp://127.0.0.1:5556" +#define ENDPOINT_2 "tcp://127.0.0.1:5557" +#define ENDPOINT_3 "tcp://127.0.0.1:5558" +#define ENDPOINT_4 "udp://127.0.0.1:5559" +#define ENDPOINT_5 "udp://127.0.0.1:5560" #undef NDEBUG #include