summaryrefslogtreecommitdiff
path: root/test/cctest
diff options
context:
space:
mode:
authorEugene Ostroukhov <eostroukhov@chromium.org>2017-05-09 15:21:20 -0700
committerEugene Ostroukhov <eostroukhov@chromium.org>2017-05-12 16:07:16 -0700
commit7c3a23b9c121b816c551d2560df9ee2bc63f2555 (patch)
treebc6db0e50fcca2de43393696fcd78b55daf25261 /test/cctest
parent642bd4dd6dd16221f910538b03046542711361c3 (diff)
downloadandroid-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.cc32
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