Index: remoting/host/security_key/security_key_auth_handler_posix_unittest.cc |
diff --git a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc |
index 6f1259d8872d6199588256da2b2aa35b41041d5a..7af8a3abeb4cb312638c95b29038e53a69c6addd 100644 |
--- a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc |
+++ b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include <stddef.h> |
+#include <sys/socket.h> |
#include <cstdint> |
#include <memory> |
@@ -17,7 +18,9 @@ |
#include "base/threading/thread.h" |
#include "net/base/io_buffer.h" |
#include "net/base/net_errors.h" |
+#include "net/base/sockaddr_storage.h" |
#include "net/base/test_completion_callback.h" |
+#include "net/socket/socket_posix.h" |
#include "net/socket/unix_domain_client_socket_posix.h" |
#include "remoting/host/security_key/security_key_auth_handler.h" |
#include "remoting/host/security_key/security_key_socket.h" |
@@ -46,6 +49,8 @@ const uint8_t kRequestData[] = { |
0x5e, 0xa3, 0xbc, 0x02, 0x5b, 0xec, 0xe4, 0x4b, 0xae, 0x0e, 0xf2, 0xbd, |
0xc8, 0xaa}; |
+const uint8_t kResponseData[] = {0x00, 0x00, 0x00, 0x01, 0x42}; |
+ |
const uint8_t kSshErrorData[] = {0x00, 0x00, 0x00, 0x01, 0x05}; |
void RunUntilIdle() { |
@@ -61,7 +66,9 @@ class SecurityKeyAuthHandlerPosixTest : public testing::Test { |
: run_loop_(new base::RunLoop()), |
file_thread_("SecurityKeyAuthHandlerPosixTest_FileThread"), |
expected_request_data_(reinterpret_cast<const char*>(kRequestData + 4), |
- sizeof(kRequestData) - 4) { |
+ sizeof(kRequestData) - 4), |
+ client_response_data_(reinterpret_cast<const char*>(kResponseData + 4), |
+ sizeof(kResponseData) - 4) { |
EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); |
socket_path_ = temp_dir_.GetPath().Append(kSocketFilename); |
remoting::SecurityKeyAuthHandler::SetSecurityKeySocketName(socket_path_); |
@@ -131,8 +138,7 @@ class SecurityKeyAuthHandlerPosixTest : public testing::Test { |
} |
void WaitForResponseData(net::UnixDomainClientSocket* client_socket) { |
- // The request data is reused for the response data. |
- WaitForData(client_socket, sizeof(kRequestData)); |
+ WaitForData(client_socket, sizeof(kResponseData)); |
} |
void WaitForErrorData(net::UnixDomainClientSocket* client_socket) { |
@@ -174,6 +180,8 @@ class SecurityKeyAuthHandlerPosixTest : public testing::Test { |
const std::string expected_request_data_; |
+ const std::string client_response_data_; |
+ |
base::ScopedTempDir temp_dir_; |
base::FilePath socket_path_; |
base::Closure accept_callback_; |
@@ -182,7 +190,7 @@ class SecurityKeyAuthHandlerPosixTest : public testing::Test { |
DISALLOW_COPY_AND_ASSIGN(SecurityKeyAuthHandlerPosixTest); |
}; |
-TEST_F(SecurityKeyAuthHandlerPosixTest, NotClosedAfterRequest) { |
+TEST_F(SecurityKeyAuthHandlerPosixTest, HandleSingleRequest) { |
CreateSocketAndWait(); |
net::UnixDomainClientSocket client_socket(socket_path_.value(), false); |
@@ -196,14 +204,63 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, NotClosedAfterRequest) { |
WaitForSendMessageToClient(); |
CheckHostDataMessage(1); |
- auth_handler_->SendClientResponse(1, expected_request_data_); |
- WaitForResponseData(&client_socket); |
- |
// Verify the connection is now valid. |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
// Verify that completing a request/response cycle didn't close the socket. |
ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
+ |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
+ WaitForResponseData(&client_socket); |
+ |
+ // Verify that completing a request/response cycle didn't close the socket. |
+ ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
+ ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
+} |
+ |
+TEST_F(SecurityKeyAuthHandlerPosixTest, HandleSingleRequestWithEof) { |
+ CreateSocketAndWait(); |
+ |
+ 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. |
+ WriteRequestData(&client_socket); |
+ WaitForSendMessageToClient(); |
+ |
+ // Verify the connection is valid. |
+ ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
+ ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
+ |
+ net::SocketPosix raw_socket; |
+ net::SockaddrStorage address; |
+ ASSERT_TRUE(net::UnixDomainClientSocket::FillAddress(socket_path_.value(), |
+ false, &address)); |
+ raw_socket.AdoptConnectedSocket(client_socket.ReleaseConnectedSocket(), |
+ address); |
+ |
+ // Close the write end of the socket. |
+ ASSERT_EQ(shutdown(raw_socket.socket_fd(), SHUT_WR), 0); |
+ |
+ // Verify that socket has not been closed yet. |
+ ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
+ ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
+ |
+ // Wait for the response to be received. |
+ CheckHostDataMessage(1); |
+ |
+ // Verify that socket has not been closed yet. |
+ ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
+ ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
+ |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
+ |
+ // Verify the connection has been closed and is no longer valid. |
+ ASSERT_FALSE(auth_handler_->IsValidConnectionId(1)); |
+ ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest()); |
} |
TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoRequests) { |
@@ -224,7 +281,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoRequests) { |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
// Send a 'client' response to the socket and verify the data is received. |
- auth_handler_->SendClientResponse(1, expected_request_data_); |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
WaitForResponseData(&client_socket); |
// Verify the connection is still valid. |
@@ -238,7 +295,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoRequests) { |
// Verify the connection is still valid. |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
- auth_handler_->SendClientResponse(1, expected_request_data_); |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
WaitForResponseData(&client_socket); |
// Verify the connection is still valid. |
@@ -267,7 +324,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoIndependentRequests) { |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |
// Send a 'client' response to the socket and verify the data is received. |
- auth_handler_->SendClientResponse(1, expected_request_data_); |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
WaitForResponseData(&client_socket); |
// Verify the connection is still valid. |
@@ -288,7 +345,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoIndependentRequests) { |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(2)); |
// Send a 'client' response to the socket and verify the data is received. |
- auth_handler_->SendClientResponse(2, expected_request_data_); |
+ auth_handler_->SendClientResponse(2, client_response_data_); |
WaitForResponseData(&client_socket); |
// Verify the second connection is valid and the first is not. |
@@ -297,7 +354,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, HandleTwoIndependentRequests) { |
ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest()); |
} |
-TEST_F(SecurityKeyAuthHandlerPosixTest, DoReadTimeout) { |
+TEST_F(SecurityKeyAuthHandlerPosixTest, HandleReadTimeout) { |
CreateSocketAndWait(); |
auth_handler_->SetRequestTimeoutForTest(base::TimeDelta()); |
@@ -315,7 +372,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, DoReadTimeout) { |
ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest()); |
} |
-TEST_F(SecurityKeyAuthHandlerPosixTest, ClientErrorMessageDelivered) { |
+TEST_F(SecurityKeyAuthHandlerPosixTest, HandleClientErrorMessage) { |
CreateSocketAndWait(); |
net::UnixDomainClientSocket client_socket(socket_path_.value(), false); |
@@ -330,7 +387,7 @@ TEST_F(SecurityKeyAuthHandlerPosixTest, ClientErrorMessageDelivered) { |
CheckHostDataMessage(1); |
// Send a 'client' response to the socket and verify the data is received. |
- auth_handler_->SendClientResponse(1, expected_request_data_); |
+ auth_handler_->SendClientResponse(1, client_response_data_); |
WaitForResponseData(&client_socket); |
ASSERT_TRUE(auth_handler_->IsValidConnectionId(1)); |