From 562d7a49ac206dab2a830aad612d995a8c6fbd97 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Fri, 20 Dec 2013 19:38:37 -0800 Subject: [PATCH 1/3] code style: strip trailing whitespace --- test/test-ipc.c | 2 +- test/test-poll-close.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-ipc.c b/test/test-ipc.c index 40a48b73..ef27cc77 100644 --- a/test/test-ipc.c +++ b/test/test-ipc.c @@ -439,7 +439,7 @@ static void on_tcp_child_process_read(uv_stream_t* tcp, ssize_t nread, uv_buf_t return; } - printf("error recving on tcp connection: %s\n", + printf("error recving on tcp connection: %s\n", uv_strerror(uv_last_error(tcp->loop))); abort(); } diff --git a/test/test-poll-close.c b/test/test-poll-close.c index 70b775f2..2eccddf5 100644 --- a/test/test-poll-close.c +++ b/test/test-poll-close.c @@ -59,7 +59,7 @@ TEST_IMPL(poll_close) { uv_poll_init_socket(uv_default_loop(), &poll_handles[i], sockets[i]); uv_poll_start(&poll_handles[i], UV_READABLE | UV_WRITABLE, NULL); } - + for (i = 0; i < NUM_SOCKETS; i++) { uv_close((uv_handle_t*) &poll_handles[i], close_cb); } From c66340d59b8b35399831fb1c3a12c1efdbd91a53 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Fri, 20 Dec 2013 19:40:02 -0800 Subject: [PATCH 2/3] test: add pipe-server-close test Add a regression test for the pipe server close issue on Windows, which was reported in joyent/node#6749 and fixed in 7b16a3f. --- build.mk | 1 + checksparse.sh | 1 + test/test-list.h | 2 + test/test-pipe-server-close.c | 88 +++++++++++++++++++++++++++++++++++ uv.gyp | 1 + 5 files changed, 93 insertions(+) create mode 100644 test/test-pipe-server-close.c diff --git a/build.mk b/build.mk index 2de7961e..5077929d 100644 --- a/build.mk +++ b/build.mk @@ -98,6 +98,7 @@ TESTS= \ test/test-ping-pong.o \ test/test-pipe-bind-error.o \ test/test-pipe-connect-error.o \ + test/test-pipe-server-close.o \ test/test-platform-output.o \ test/test-poll.o \ test/test-poll-close.o \ diff --git a/checksparse.sh b/checksparse.sh index 43c9441e..01fac07a 100755 --- a/checksparse.sh +++ b/checksparse.sh @@ -116,6 +116,7 @@ test/test-pass-always.c test/test-ping-pong.c test/test-pipe-bind-error.c test/test-pipe-connect-error.c +test/test-pipe-server-close.c test/test-platform-output.c test/test-poll-close.c test/test-poll.c diff --git a/test/test-list.h b/test/test-list.h index 92732626..11fc4983 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -88,6 +88,7 @@ TEST_DECLARE (pipe_bind_error_inval) TEST_DECLARE (pipe_listen_without_bind) TEST_DECLARE (pipe_connect_bad_name) TEST_DECLARE (pipe_connect_to_file) +TEST_DECLARE (pipe_server_close) TEST_DECLARE (connection_fail) TEST_DECLARE (connection_fail_doesnt_auto_close) TEST_DECLARE (shutdown_close_tcp) @@ -257,6 +258,7 @@ TASK_LIST_START TEST_ENTRY (pipe_connect_bad_name) TEST_ENTRY (pipe_connect_to_file) + TEST_ENTRY (pipe_server_close) TEST_ENTRY (tty) TEST_ENTRY (stdio_over_pipes) TEST_ENTRY (ipc_listen_before_write) diff --git a/test/test-pipe-server-close.c b/test/test-pipe-server-close.c new file mode 100644 index 00000000..6547695d --- /dev/null +++ b/test/test-pipe-server-close.c @@ -0,0 +1,88 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "task.h" + +#include +#include + + +static uv_pipe_t pipe_client; +static uv_pipe_t pipe_server; +static uv_connect_t connect_req; + +static int pipe_close_cb_called = 0; +static int pipe_client_connect_cb_called = 0; + + +static void pipe_close_cb(uv_handle_t* handle) { + ASSERT(handle == (uv_handle_t*) &pipe_client || + handle == (uv_handle_t*) &pipe_server); + pipe_close_cb_called++; +} + + +static void pipe_client_connect_cb(uv_connect_t* req, int status) { + ASSERT(req == &connect_req); + ASSERT(status == 0); + + pipe_client_connect_cb_called++; + + uv_close((uv_handle_t*) &pipe_client, pipe_close_cb); + uv_close((uv_handle_t*) &pipe_server, pipe_close_cb); +} + + +static void pipe_server_connection_cb(uv_stream_t* handle, int status) { + ASSERT(0 && "pipe_server_connection_cb should never be called"); +} + + +TEST_IMPL(pipe_server_close) { + uv_loop_t* loop; + int r; + + loop = uv_default_loop(); + ASSERT(loop != NULL); + + r = uv_pipe_init(loop, &pipe_server, 0); + ASSERT(r == 0); + + r = uv_pipe_bind(&pipe_server, TEST_PIPENAME); + ASSERT(r == 0); + + r = uv_listen((uv_stream_t*) &pipe_server, 0, pipe_server_connection_cb); + ASSERT(r == 0); + + r = uv_pipe_init(loop, &pipe_client, 0); + ASSERT(r == 0); + + uv_pipe_connect(&connect_req, &pipe_client, TEST_PIPENAME, pipe_client_connect_cb); + + r = uv_run(loop, UV_RUN_DEFAULT); + ASSERT(r == 0); + ASSERT(pipe_client_connect_cb_called == 1); + ASSERT(pipe_close_cb_called == 2); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/uv.gyp b/uv.gyp index 1f3e19ad..ea8707b7 100644 --- a/uv.gyp +++ b/uv.gyp @@ -318,6 +318,7 @@ 'test/test-ping-pong.c', 'test/test-pipe-bind-error.c', 'test/test-pipe-connect-error.c', + 'test/test-pipe-server-close.c', 'test/test-platform-output.c', 'test/test-poll.c', 'test/test-poll-close.c', From 16c4b21e4dad4624a5a4c23f8e1cff6da0b1ba1c Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sat, 21 Dec 2013 11:32:22 +0100 Subject: [PATCH 3/3] test: make test-pipe-server-close pass on linux When a server and a client are both part of the same event loop, and the client connects to the server, the order in which the connect callback and the connection callback are called is unspecified. Apparently on linux the connection callback sometimes happens first, which is not a bug, and should not make this test fail. --- test/test-pipe-server-close.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/test-pipe-server-close.c b/test/test-pipe-server-close.c index 6547695d..1dcdfffa 100644 --- a/test/test-pipe-server-close.c +++ b/test/test-pipe-server-close.c @@ -53,7 +53,10 @@ static void pipe_client_connect_cb(uv_connect_t* req, int status) { static void pipe_server_connection_cb(uv_stream_t* handle, int status) { - ASSERT(0 && "pipe_server_connection_cb should never be called"); + /* This function *may* be called, depending on whether accept or the + * connection callback is called first. + */ + ASSERT(status == 0); }