From 4f668ad60a7fa6c6000a5f7d94731a42ea295513 Mon Sep 17 00:00:00 2001 From: Sergey KHripchenko Date: Sat, 21 Apr 2012 18:39:19 +0400 Subject: [PATCH] added zmq_unbind() / zmq_disconnect() test script. it works but rises very serious questions. Please add license header by your choice. This file for 99% resemble crossroads-io/tests/shutdown.cpp --- tests/Makefile.am | 4 +- tests/test_term_endpoint.cpp | 97 ++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 tests/test_term_endpoint.cpp diff --git a/tests/Makefile.am b/tests/Makefile.am index 6c270163..81bedeee 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -13,7 +13,8 @@ noinst_PROGRAMS = test_pair_inproc \ test_invalid_rep \ test_msg_flags \ test_connect_resolve \ - test_last_endpoint + test_last_endpoint \ + test_term_endpoint if !ON_MINGW noinst_PROGRAMS += test_shutdown_stress \ @@ -33,6 +34,7 @@ test_invalid_rep_SOURCES = test_invalid_rep.cpp test_msg_flags_SOURCES = test_msg_flags.cpp test_connect_resolve_SOURCES = test_connect_resolve.cpp test_last_endpoint_SOURCES = test_last_endpoint.cpp +test_term_endpoint_SOURCES = test_term_endpoint.cpp if !ON_MINGW test_shutdown_stress_SOURCES = test_shutdown_stress.cpp diff --git a/tests/test_term_endpoint.cpp b/tests/test_term_endpoint.cpp new file mode 100644 index 00000000..6e501d73 --- /dev/null +++ b/tests/test_term_endpoint.cpp @@ -0,0 +1,97 @@ +#include +#include +#include + +#include "../include/zmq.h" +#include "../include/zmq_utils.h" + + +int main (int argc, char *argv []) +{ + int rc; + char buf[32]; + const char *ep = "tcp://127.0.0.1:5560"; + + fprintf (stderr, "unbind endpoint test running...\n"); + + // Create infrastructure. + void *ctx = zmq_init (1); + assert (ctx); + void *push = zmq_socket (ctx, ZMQ_PUSH); + assert (push); + rc = zmq_bind (push, ep); + assert (rc == 0); + void *pull = zmq_socket (ctx, ZMQ_PULL); + assert (pull); + rc = zmq_connect (pull, ep); + assert (rc == 0); + + // Pass one message through to ensure the connection is established. + rc = zmq_send (push, "ABC", 3, 0); + assert (rc == 3); + rc = zmq_recv (pull, buf, sizeof (buf), 0); + assert (rc == 3); + + // Unbind the lisnening endpoint + rc = zmq_unbind (push, ep); + assert (rc == 0); + + // Let events some time + zmq_sleep (1); + + // Check that sending would block (there's no outbound connection). + rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT); + assert (rc == -1 && zmq_errno () == EAGAIN); + + // Clean up. + rc = zmq_close (pull); + assert (rc == 0); + rc = zmq_close (push); + assert (rc == 0); + rc = zmq_term (ctx); + assert (rc == 0); + + + // Now the other way round. + fprintf (stderr, "disconnect endpoint test running...\n"); + + + // Create infrastructure. + ctx = zmq_init (1); + 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); + assert (rc == 0); + + // Pass one message through to ensure the connection is established. + rc = zmq_send (push, "ABC", 3, 0); + assert (rc == 3); + rc = zmq_recv (pull, buf, sizeof (buf), 0); + assert (rc == 3); + + // Disconnect the bound endpoint + rc = zmq_disconnect (push, ep); + assert (rc == 0); + + // Let events some time + zmq_sleep (1); + + // Check that sending would block (there's no inbound connections). + rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT); + assert (rc == -1 && zmq_errno () == EAGAIN); + + // Clean up. + rc = zmq_close (pull); + assert (rc == 0); + rc = zmq_close (push); + assert (rc == 0); + rc = zmq_term (ctx); + assert (rc == 0); + + return 0; +}