Index: remoting/host/gnubby_auth_handler_posix_unittest.cc |
diff --git a/remoting/host/gnubby_auth_handler_posix_unittest.cc b/remoting/host/gnubby_auth_handler_posix_unittest.cc |
index 9c32a015eb94dde90b55960233ba9f3f5dc20a1a..e55ca9a0b74b8f95465b4a83bda0533534ac2a07 100644 |
--- a/remoting/host/gnubby_auth_handler_posix_unittest.cc |
+++ b/remoting/host/gnubby_auth_handler_posix_unittest.cc |
@@ -48,7 +48,7 @@ const unsigned char kRequestData[] = { |
class TestClientStub : public protocol::ClientStub { |
public: |
- TestClientStub() {} |
+ TestClientStub() : loop_(new base::RunLoop) {} |
~TestClientStub() override {} |
// protocol::ClientStub implementation. |
@@ -59,7 +59,7 @@ class TestClientStub : public protocol::ClientStub { |
void DeliverHostMessage(const protocol::ExtensionMessage& message) override { |
message_ = message; |
- loop_.Quit(); |
+ loop_->Quit(); |
} |
// protocol::ClipboardStub implementation. |
@@ -68,7 +68,10 @@ class TestClientStub : public protocol::ClientStub { |
// protocol::CursorShapeStub implementation. |
void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override {} |
- void WaitForDeliverHostMessage() { loop_.Run(); } |
+ void WaitForDeliverHostMessage() { |
+ loop_->Run(); |
+ loop_.reset(new base::RunLoop); |
+ } |
void CheckHostDataMessage(int id, const std::string& data) { |
std::string connection_id = base::StringPrintf("\"connectionId\":%d", id); |
@@ -83,7 +86,7 @@ class TestClientStub : public protocol::ClientStub { |
private: |
protocol::ExtensionMessage message_; |
- base::RunLoop loop_; |
+ scoped_ptr<base::RunLoop> loop_; |
DISALLOW_COPY_AND_ASSIGN(TestClientStub); |
}; |
@@ -98,6 +101,41 @@ class GnubbyAuthHandlerPosixTest : public testing::Test { |
auth_handler_->SetGnubbySocketName(socket_path_); |
} |
+ void WriteRequestData(net::UnixDomainClientSocket* client_socket) { |
+ int request_len = sizeof(kRequestData); |
+ scoped_refptr<net::DrainableIOBuffer> request_buffer( |
+ new net::DrainableIOBuffer( |
+ new net::WrappedIOBuffer( |
+ reinterpret_cast<const char*>(kRequestData)), |
+ request_len)); |
+ net::TestCompletionCallback write_callback; |
+ int bytes_written = 0; |
+ while (bytes_written < request_len) { |
+ int write_result = client_socket->Write(request_buffer.get(), |
+ request_buffer->BytesRemaining(), |
+ write_callback.callback()); |
+ write_result = write_callback.GetResult(write_result); |
+ ASSERT_GT(write_result, 0); |
+ bytes_written += write_result; |
+ ASSERT_LE(bytes_written, request_len); |
+ request_buffer->DidConsume(write_result); |
+ } |
+ ASSERT_EQ(request_len, bytes_written); |
+ } |
+ |
+ void WaitForAndVerifyHostMessage() { |
+ client_stub_.WaitForDeliverHostMessage(); |
+ base::ListValue expected_data; |
+ // Skip first four bytes. |
+ for (size_t i = 4; i < sizeof(kRequestData); ++i) { |
+ expected_data.AppendInteger(kRequestData[i]); |
+ } |
+ |
+ std::string expected_data_json; |
+ base::JSONWriter::Write(expected_data, &expected_data_json); |
+ client_stub_.CheckHostDataMessage(1, expected_data_json); |
+ } |
+ |
protected: |
// Object under test. |
scoped_ptr<GnubbyAuthHandlerPosix> auth_handler_posix_; |
@@ -119,45 +157,48 @@ TEST_F(GnubbyAuthHandlerPosixTest, HostDataMessageDelivered) { |
client_stub_.CheckHostDataMessage(42, "[116,101,115,116,95,109,115,103]"); |
} |
-TEST_F(GnubbyAuthHandlerPosixTest, DidReadAndClose) { |
- std::string message_json = "{\"type\":\"control\",\"option\":\"auth-v1\"}"; |
- |
+TEST_F(GnubbyAuthHandlerPosixTest, NotClosedAfterRequest) { |
ASSERT_EQ(0u, auth_handler_posix_->GetActiveSocketsMapSizeForTest()); |
+ |
+ const char message_json[] = "{\"type\":\"control\",\"option\":\"auth-v1\"}"; |
auth_handler_->DeliverClientMessage(message_json); |
+ |
net::UnixDomainClientSocket client_socket(socket_path_.value(), false); |
net::TestCompletionCallback connect_callback; |
+ |
int rv = client_socket.Connect(connect_callback.callback()); |
ASSERT_EQ(net::OK, connect_callback.GetResult(rv)); |
- int request_len = sizeof(kRequestData); |
- scoped_refptr<net::DrainableIOBuffer> request_buffer( |
- new net::DrainableIOBuffer( |
- new net::WrappedIOBuffer(reinterpret_cast<const char*>(kRequestData)), |
- request_len)); |
- net::TestCompletionCallback write_callback; |
- int bytes_written = 0; |
- while (bytes_written < request_len) { |
- int write_result = client_socket.Write(request_buffer.get(), |
- request_buffer->BytesRemaining(), |
- write_callback.callback()); |
- write_result = write_callback.GetResult(write_result); |
- ASSERT_GT(write_result, 0); |
- bytes_written += write_result; |
- ASSERT_LE(bytes_written, request_len); |
- request_buffer->DidConsume(write_result); |
- } |
- ASSERT_EQ(request_len, bytes_written); |
- client_stub_.WaitForDeliverHostMessage(); |
- base::ListValue expected_data; |
- // Skip first four bytes. |
- for (size_t i = 4; i < sizeof(kRequestData); ++i) { |
- expected_data.AppendInteger(kRequestData[i]); |
- } |
+ // Write the request and verify the response. |
+ WriteRequestData(&client_socket); |
+ WaitForAndVerifyHostMessage(); |
- std::string expected_data_json; |
- base::JSONWriter::Write(expected_data, &expected_data_json); |
- client_stub_.CheckHostDataMessage(1, expected_data_json); |
+ // Verify that completing a request/response cycle didn't close the socket. |
+ ASSERT_EQ(1u, auth_handler_posix_->GetActiveSocketsMapSizeForTest()); |
+} |
+ |
+TEST_F(GnubbyAuthHandlerPosixTest, HandleTwoRequests) { |
ASSERT_EQ(0u, auth_handler_posix_->GetActiveSocketsMapSizeForTest()); |
+ |
+ const char message_json[] = "{\"type\":\"control\",\"option\":\"auth-v1\"}"; |
+ auth_handler_->DeliverClientMessage(message_json); |
+ |
+ net::UnixDomainClientSocket client_socket(socket_path_.value(), false); |
+ net::TestCompletionCallback connect_callback; |
+ |
+ int rv = client_socket.Connect(connect_callback.callback()); |
+ ASSERT_EQ(net::OK, connect_callback.GetResult(rv)); |
+ |
+ // Write the request and verify the response. |
+ WriteRequestData(&client_socket); |
+ WaitForAndVerifyHostMessage(); |
+ |
+ // Repeat the request/response cycle. |
+ WriteRequestData(&client_socket); |
+ WaitForAndVerifyHostMessage(); |
+ |
+ // Verify that completing two request/response cycles didn't close the socket. |
+ ASSERT_EQ(1u, auth_handler_posix_->GetActiveSocketsMapSizeForTest()); |
} |
TEST_F(GnubbyAuthHandlerPosixTest, DidReadTimeout) { |