diff --git a/.gitignore b/.gitignore index 4a089fac..3e8c1652 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ autom4te.cache .*~ tools/curve_keygen.o tools/curve_keygen +tests/test_stream_empty tests/test_issue_566 tests/test_ctx_destroy tests/test_term_endpoint diff --git a/src/stream.cpp b/src/stream.cpp index 0b495a58..987a2679 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -142,6 +142,8 @@ int zmq::stream_t::xsend (msg_t *msg_) current_out->terminate (false); int rc = msg_->close (); errno_assert (rc == 0); + rc = msg_->init (); + errno_assert (rc == 0); current_out = NULL; return 0; } diff --git a/tests/Makefile.am b/tests/Makefile.am index 696c2eea..170696b5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,9 +20,9 @@ noinst_PROGRAMS = test_system \ test_linger \ test_monitor \ test_router_mandatory \ - test_router_raw_empty \ test_probe_router \ test_stream \ + test_stream_empty \ test_disconnect_inproc \ test_ctx_options \ test_ctx_destroy \ diff --git a/tests/test_router_raw_empty.cpp b/tests/test_router_raw_empty.cpp deleted file mode 100644 index 83dc10cd..00000000 --- a/tests/test_router_raw_empty.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file - - This file is part of 0MQ. - - 0MQ is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - 0MQ is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#include "testutil.hpp" - -int main (void) { - setup_test_environment(); - void *ctx = zmq_ctx_new(); - assert(ctx); - - void *router = zmq_socket(ctx, ZMQ_ROUTER); - assert(router); - void *dealer = zmq_socket(ctx, ZMQ_DEALER); - assert(dealer); - - int one=1; - int rc = zmq_setsockopt(router, ZMQ_ROUTER_RAW, &one, sizeof(int)); - assert(rc >= 0); - rc = zmq_setsockopt(router, ZMQ_ROUTER_MANDATORY, &one, sizeof(int)); - assert(rc >= 0); - - rc = zmq_bind(router, "tcp://127.0.0.1:5555"); - rc = zmq_connect(dealer, "tcp://127.0.0.1:5555"); - zmq_send(dealer, "", 0, 0); - - - zmq_msg_t ident, empty; - zmq_msg_init(&ident); - rc = zmq_msg_recv(&ident, router, 0); - assert(rc >= 0); - rc = zmq_msg_init_data(&empty, (void*)"", 0, NULL, NULL); - assert(rc >= 0); - - rc = zmq_msg_send(&ident, router, ZMQ_SNDMORE); - assert(rc >= 0); - rc = zmq_msg_close(&ident); - assert(rc >= 0); - - rc = zmq_msg_send(&empty, router, 0); - assert(rc >= 0); - - // This close used to fail with Bad Address - rc = zmq_msg_close(&empty); - assert(rc >= 0); - - close_zero_linger(dealer); - close_zero_linger(router); - zmq_ctx_term(ctx); -} diff --git a/tests/test_stream_empty.cpp b/tests/test_stream_empty.cpp new file mode 100644 index 00000000..a4b875e3 --- /dev/null +++ b/tests/test_stream_empty.cpp @@ -0,0 +1,60 @@ +/* + Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "testutil.hpp" + +int main (void) { + setup_test_environment (); + void *ctx = zmq_ctx_new (); + assert (ctx); + + void *stream = zmq_socket (ctx, ZMQ_STREAM); + assert (stream); + void *dealer = zmq_socket (ctx, ZMQ_DEALER); + assert (dealer); + + int rc = zmq_bind (stream, "tcp://127.0.0.1:5555"); + assert (rc >= 0); + rc = zmq_connect (dealer, "tcp://127.0.0.1:5555"); + assert (rc >= 0); + zmq_send (dealer, "", 0, 0); + + zmq_msg_t ident, empty; + zmq_msg_init (&ident); + rc = zmq_msg_recv (&ident, stream, 0); + assert (rc >= 0); + rc = zmq_msg_init_data (&empty, (void *) "", 0, NULL, NULL); + assert (rc >= 0); + + rc = zmq_msg_send (&ident, stream, ZMQ_SNDMORE); + assert (rc >= 0); + rc = zmq_msg_close (&ident); + assert (rc >= 0); + + rc = zmq_msg_send (&empty, stream, 0); + assert (rc >= 0); + + // This close used to fail with Bad Address + rc = zmq_msg_close (&empty); + assert (rc >= 0); + + close_zero_linger (dealer); + close_zero_linger (stream); + zmq_ctx_term (ctx); +}