diff options
author | Eugene Ostroukhov <eostroukhov@chromium.org> | 2017-05-09 15:21:20 -0700 |
---|---|---|
committer | Eugene Ostroukhov <eostroukhov@chromium.org> | 2017-05-12 16:07:16 -0700 |
commit | 7c3a23b9c121b816c551d2560df9ee2bc63f2555 (patch) | |
tree | bc6db0e50fcca2de43393696fcd78b55daf25261 /test/cctest | |
parent | 642bd4dd6dd16221f910538b03046542711361c3 (diff) | |
download | android-node-v8-7c3a23b9c121b816c551d2560df9ee2bc63f2555.tar.gz android-node-v8-7c3a23b9c121b816c551d2560df9ee2bc63f2555.tar.bz2 android-node-v8-7c3a23b9c121b816c551d2560df9ee2bc63f2555.zip |
inspector: handle socket close before close frame
This change handles clients that respond to close request with a TCP
close instead of close response.
PR-URL: https://github.com/nodejs/node/pull/12937
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'test/cctest')
-rw-r--r-- | test/cctest/test_inspector_socket.cc | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/test/cctest/test_inspector_socket.cc b/test/cctest/test_inspector_socket.cc index b61fbd2cd6..609053a6cd 100644 --- a/test/cctest/test_inspector_socket.cc +++ b/test/cctest/test_inspector_socket.cc @@ -35,6 +35,8 @@ static std::string last_path; // NOLINT(runtime/string) static void (*handshake_delegate)(enum inspector_handshake_event state, const std::string& path, bool* should_continue); +static const char SERVER_CLOSE_FRAME[] = {'\x88', '\x00'}; + struct read_expects { const char* expected; @@ -879,7 +881,6 @@ TEST_F(InspectorSocketTest, Send1Mb) { // 3. Close const char CLIENT_CLOSE_FRAME[] = {'\x88', '\x80', '\x2D', '\x0E', '\x1E', '\xFA'}; - const char SERVER_CLOSE_FRAME[] = {'\x88', '\x00'}; do_write(CLIENT_CLOSE_FRAME, sizeof(CLIENT_CLOSE_FRAME)); expect_on_client(SERVER_CLOSE_FRAME, sizeof(SERVER_CLOSE_FRAME)); GTEST_ASSERT_EQ(0, uv_is_active( @@ -906,4 +907,33 @@ TEST_F(InspectorSocketTest, ErrorCleansUpTheSocket) { EXPECT_EQ(UV_EPROTO, err); } +static void ServerClosedByClient_cb(InspectorSocket* socket, int code) { + *static_cast<bool*>(socket->data) = true; +} + +TEST_F(InspectorSocketTest, NoCloseResponseFromClinet) { + ASSERT_TRUE(connected); + ASSERT_FALSE(inspector_ready); + do_write(const_cast<char*>(HANDSHAKE_REQ), sizeof(HANDSHAKE_REQ) - 1); + SPIN_WHILE(!inspector_ready); + expect_handshake(); + + // 2. Brief exchange + const char SERVER_MESSAGE[] = "abcd"; + const char CLIENT_FRAME[] = {'\x81', '\x04', 'a', 'b', 'c', 'd'}; + inspector_write(&inspector, SERVER_MESSAGE, sizeof(SERVER_MESSAGE) - 1); + expect_on_client(CLIENT_FRAME, sizeof(CLIENT_FRAME)); + + bool closed = false; + + inspector.data = &closed; + inspector_close(&inspector, ServerClosedByClient_cb); + expect_on_client(SERVER_CLOSE_FRAME, sizeof(SERVER_CLOSE_FRAME)); + uv_close(reinterpret_cast<uv_handle_t*>(&client_socket), nullptr); + SPIN_WHILE(!closed); + inspector.data = nullptr; + GTEST_ASSERT_EQ(0, uv_is_active( + reinterpret_cast<uv_handle_t*>(&client_socket))); +} + } // anonymous namespace |