From 7bc7395a2ad1fef1f17cff4294533c6d4d631874 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 18:46:21 +0100 Subject: [PATCH 1/6] Problem: test_reqrep_tcp is too limited Solution: refactor it to allow for multiple functionalities to be tested --- tests/test_reqrep_tcp.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index f1475a35..dc2294bb 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -29,9 +29,8 @@ #include "testutil.hpp" -int main (void) +void test_single_connect_ipv4 (void) { - setup_test_environment(); void *ctx = zmq_ctx_new (); assert (ctx); @@ -55,6 +54,13 @@ int main (void) rc = zmq_ctx_term (ctx); assert (rc == 0); +} + +int main (void) +{ + setup_test_environment (); + + test_single_connect_ipv4 (); return 0 ; } From 9c350937822ce408b31037709742e1faf11c64f8 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 18:51:11 +0100 Subject: [PATCH 2/6] Problem: test_reqrep_tcp does not test disconnect/unbind Solution: add disconnect and unbind calls to the test --- tests/test_reqrep_tcp.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index dc2294bb..2b229235 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -46,6 +46,12 @@ void test_single_connect_ipv4 (void) 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); From 67d60b1909958ceb16615962251de6651dbfe7ca Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 18:55:25 +0100 Subject: [PATCH 3/6] Problem: test_reqrep_tcp does not test multiple endpoints Solution: add a test for this use case --- tests/test_reqrep_tcp.cpp | 71 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index 2b229235..7978d8e4 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -62,11 +62,82 @@ void test_single_connect_ipv4 (void) 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: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: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); +} + int main (void) { setup_test_environment (); test_single_connect_ipv4 (); + test_multi_connect_ipv4 (); + return 0 ; } From 8ddf198256a2ca83eca57df4f47cdb14e42d8b1f Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 19:08:53 +0100 Subject: [PATCH 4/6] Problem: test_reqrep_tcp does not have IPv6 tests Solution: add them --- tests/test_reqrep_tcp.cpp | 130 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index 7978d8e4..ecdf2537 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -131,6 +131,132 @@ void test_multi_connect_ipv4 (void) assert (rc == 0); } +void test_single_connect_ipv6 (void) +{ + void *ctx = zmq_ctx_new (); + assert (ctx); + + if (!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"); + 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"); + assert (rc == 0); + + bounce (sb, sc); + + rc = zmq_disconnect (sc, "tcp://[::1]:5560"); + assert (rc == 0); + + rc = zmq_unbind (sb, "tcp://[::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_ipv6 (void) +{ + void *ctx = zmq_ctx_new (); + assert (ctx); + + if (!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"); + 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"); + 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"); + 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"); + assert (rc == 0); + rc = zmq_connect (sc, "tcp://[::1]:5561"); + assert (rc == 0); + rc = zmq_connect (sc, "tcp://[::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://[::1]:5560"); + assert (rc == 0); + rc = zmq_disconnect (sc, "tcp://[::1]:5562"); + assert (rc == 0); + rc = zmq_disconnect (sc, "tcp://[::1]:5561"); + assert (rc == 0); + + rc = zmq_unbind (sb0, "tcp://[::1]:5560"); + assert (rc == 0); + + rc = zmq_unbind (sb1, "tcp://[::1]:5561"); + assert (rc == 0); + + rc = zmq_unbind (sb2, "tcp://[::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); +} + int main (void) { setup_test_environment (); @@ -139,5 +265,9 @@ int main (void) test_multi_connect_ipv4 (); + test_single_connect_ipv6 (); + + test_multi_connect_ipv6 (); + return 0 ; } From acab1f487bfaca026715c19cb2816c0cc1e60f7f Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 19:18:09 +0100 Subject: [PATCH 5/6] Problem: zmq_connect with IPv6 "source:port;dest:port" format is broken Solution: allow for '[' character when doing the basic sanity check on the TCP endpoint. Also add unit tests for both IPv4 and IPv6 source;dest format. --- src/socket_base.cpp | 2 +- tests/test_reqrep_tcp.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 9d34d7ea..8ef8176a 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -610,7 +610,7 @@ int zmq::socket_base_t::connect (const char *addr_) while (isalnum (*check) || isxdigit (*check) || *check == '.' || *check == '-' || *check == ':'|| *check == ';' - || *check == ']') + || *check == '[' || *check == ']') check++; } // Assume the worst, now look for success diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp index ecdf2537..7baca689 100644 --- a/tests/test_reqrep_tcp.cpp +++ b/tests/test_reqrep_tcp.cpp @@ -88,7 +88,7 @@ void test_multi_connect_ipv4 (void) 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:5562"); + rc = zmq_connect (sc, "tcp://127.0.0.1:5564;127.0.0.1:5562"); assert (rc == 0); bounce (sb0, sc); @@ -101,7 +101,7 @@ void test_multi_connect_ipv4 (void) rc = zmq_disconnect (sc, "tcp://127.0.0.1:5560"); assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://127.0.0.1:5562"); + 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); @@ -214,7 +214,7 @@ void test_multi_connect_ipv6 (void) assert (rc == 0); rc = zmq_connect (sc, "tcp://[::1]:5561"); assert (rc == 0); - rc = zmq_connect (sc, "tcp://[::1]:5562"); + rc = zmq_connect (sc, "tcp://[::1]:5564;[::1]:5562"); assert (rc == 0); bounce (sb0, sc); @@ -227,7 +227,7 @@ void test_multi_connect_ipv6 (void) rc = zmq_disconnect (sc, "tcp://[::1]:5560"); assert (rc == 0); - rc = zmq_disconnect (sc, "tcp://[::1]:5562"); + rc = zmq_disconnect (sc, "tcp://[::1]:5564;[::1]:5562"); assert (rc == 0); rc = zmq_disconnect (sc, "tcp://[::1]:5561"); assert (rc == 0); From 1a51f726a8cbbccccb5799162a1850a95b46ede5 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Sat, 17 Sep 2016 20:01:35 +0100 Subject: [PATCH 6/6] Update NEWS for #2107 --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index d0a0e549..7401b49d 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ * Fixed #2096 - add tests/CMakeLists.in and version.rc.in to dist tar +* Fixed #2107 - zmq_connect with IPv6 "source:port;dest:port" broken + 0MQ version 4.1.5 stable, released on 2016/06/17 ================================================