From 5e2a6f8c46ed2f13883b9f731bb181dc64a62a63 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 15 Jul 2009 07:54:01 +0200 Subject: [PATCH] Upgrade evnet to fix close() bug. Add test for bug. evnet wasn't properly closing sockets if they didn't have data to write. --- deps/evnet/evnet.c | 1 + test/mjsunit/test-tcp-pingpong-delay.js | 92 +++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 test/mjsunit/test-tcp-pingpong-delay.js diff --git a/deps/evnet/evnet.c b/deps/evnet/evnet.c index 3bbc49e35d..1ab1a40602 100644 --- a/deps/evnet/evnet.c +++ b/deps/evnet/evnet.c @@ -198,6 +198,7 @@ change_state_for_empty_out_stream (evnet_socket *socket) #else socket->write_action = half_close; #endif + ev_io_start(SOCKET_LOOP_ &socket->write_watcher); } } } diff --git a/test/mjsunit/test-tcp-pingpong-delay.js b/test/mjsunit/test-tcp-pingpong-delay.js new file mode 100644 index 0000000000..07624d15df --- /dev/null +++ b/test/mjsunit/test-tcp-pingpong-delay.js @@ -0,0 +1,92 @@ +include("mjsunit.js"); + + +var tests_run = 0; + +function pingPongTest (port, host, on_complete) { + var N = 100; + var DELAY = 1; + var count = 0; + var client_closed = false; + + var server = node.tcp.createServer(function (socket) { + socket.setEncoding("utf8"); + + socket.addListener("receive", function (data) { + puts(data); + assertEquals("PING", data); + assertEquals("open", socket.readyState); + assertTrue(count <= N); + setTimeout(function () { + assertEquals("open", socket.readyState); + socket.send("PONG"); + }, DELAY); + }); + + socket.addListener("timeout", function () { + node.debug("server-side timeout!!"); + assertFalse(true); + }); + + socket.addListener("eof", function () { + puts("server-side socket EOF"); + assertEquals("writeOnly", socket.readyState); + socket.close(); + }); + + socket.addListener("disconnect", function (had_error) { + puts("server-side socket disconnect"); + assertFalse(had_error); + assertEquals("closed", socket.readyState); + socket.server.close(); + }); + }); + server.listen(port, host); + + var client = node.tcp.createConnection(port, host); + + client.setEncoding("utf8"); + + client.addListener("connect", function () { + assertEquals("open", client.readyState); + client.send("PING"); + }); + + client.addListener("receive", function (data) { + puts(data); + assertEquals("PONG", data); + assertEquals("open", client.readyState); + + setTimeout(function () { + assertEquals("open", client.readyState); + if (count++ < N) { + client.send("PING"); + } else { + puts("closing client"); + client.close(); + client_closed = true; + } + }, DELAY); + }); + + client.addListener("timeout", function () { + node.debug("client-side timeout!!"); + assertFalse(true); + }); + + client.addListener("disconnect", function () { + puts("client disconnect"); + assertEquals(N+1, count); + assertTrue(client_closed); + if (on_complete) on_complete(); + tests_run += 1; + }); +} + +function onLoad () { + pingPongTest(21988); +} + +function onExit () { + assertEquals(1, tests_run); +}