Index: net/socket/unix_domain_client_socket_posix_unittest.cc |
diff --git a/net/socket/unix_domain_client_socket_posix_unittest.cc b/net/socket/unix_domain_client_socket_posix_unittest.cc |
deleted file mode 100644 |
index 651cd72dd5bb4611443b7e1d75df5574ec86134e..0000000000000000000000000000000000000000 |
--- a/net/socket/unix_domain_client_socket_posix_unittest.cc |
+++ /dev/null |
@@ -1,446 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/socket/unix_domain_client_socket_posix.h" |
- |
-#include <unistd.h> |
- |
-#include "base/bind.h" |
-#include "base/files/file_path.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/posix/eintr_wrapper.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/test_completion_callback.h" |
-#include "net/socket/socket_libevent.h" |
-#include "net/socket/unix_domain_server_socket_posix.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace net { |
-namespace { |
- |
-const char kSocketFilename[] = "socket_for_testing"; |
- |
-bool UserCanConnectCallback( |
- bool allow_user, const UnixDomainServerSocket::Credentials& credentials) { |
- // Here peers are running in same process. |
-#if defined(OS_LINUX) || defined(OS_ANDROID) |
- EXPECT_EQ(getpid(), credentials.process_id); |
-#endif |
- EXPECT_EQ(getuid(), credentials.user_id); |
- EXPECT_EQ(getgid(), credentials.group_id); |
- return allow_user; |
-} |
- |
-UnixDomainServerSocket::AuthCallback CreateAuthCallback(bool allow_user) { |
- return base::Bind(&UserCanConnectCallback, allow_user); |
-} |
- |
-// Connects socket synchronously. |
-int ConnectSynchronously(StreamSocket* socket) { |
- TestCompletionCallback connect_callback; |
- int rv = socket->Connect(connect_callback.callback()); |
- if (rv == ERR_IO_PENDING) |
- rv = connect_callback.WaitForResult(); |
- return rv; |
-} |
- |
-// Reads data from |socket| until it fills |buf| at least up to |min_data_len|. |
-// Returns length of data read, or a net error. |
-int ReadSynchronously(StreamSocket* socket, |
- IOBuffer* buf, |
- int buf_len, |
- int min_data_len) { |
- DCHECK_LE(min_data_len, buf_len); |
- scoped_refptr<DrainableIOBuffer> read_buf( |
- new DrainableIOBuffer(buf, buf_len)); |
- TestCompletionCallback read_callback; |
- // Iterate reading several times (but not infinite) until it reads at least |
- // |min_data_len| bytes into |buf|. |
- for (int retry_count = 10; |
- retry_count > 0 && (read_buf->BytesConsumed() < min_data_len || |
- // Try at least once when min_data_len == 0. |
- min_data_len == 0); |
- --retry_count) { |
- int rv = socket->Read( |
- read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
- EXPECT_GE(read_buf->BytesRemaining(), rv); |
- if (rv == ERR_IO_PENDING) { |
- // If |min_data_len| is 0, returns ERR_IO_PENDING to distinguish the case |
- // when some data has been read. |
- if (min_data_len == 0) { |
- // No data has been read because of for-loop condition. |
- DCHECK_EQ(0, read_buf->BytesConsumed()); |
- return ERR_IO_PENDING; |
- } |
- rv = read_callback.WaitForResult(); |
- } |
- EXPECT_NE(ERR_IO_PENDING, rv); |
- if (rv < 0) |
- return rv; |
- read_buf->DidConsume(rv); |
- } |
- EXPECT_LE(0, read_buf->BytesRemaining()); |
- return read_buf->BytesConsumed(); |
-} |
- |
-// Writes data to |socket| until it completes writing |buf| up to |buf_len|. |
-// Returns length of data written, or a net error. |
-int WriteSynchronously(StreamSocket* socket, |
- IOBuffer* buf, |
- int buf_len) { |
- scoped_refptr<DrainableIOBuffer> write_buf( |
- new DrainableIOBuffer(buf, buf_len)); |
- TestCompletionCallback write_callback; |
- // Iterate writing several times (but not infinite) until it writes buf fully. |
- for (int retry_count = 10; |
- retry_count > 0 && write_buf->BytesRemaining() > 0; |
- --retry_count) { |
- int rv = socket->Write(write_buf.get(), |
- write_buf->BytesRemaining(), |
- write_callback.callback()); |
- EXPECT_GE(write_buf->BytesRemaining(), rv); |
- if (rv == ERR_IO_PENDING) |
- rv = write_callback.WaitForResult(); |
- EXPECT_NE(ERR_IO_PENDING, rv); |
- if (rv < 0) |
- return rv; |
- write_buf->DidConsume(rv); |
- } |
- EXPECT_LE(0, write_buf->BytesRemaining()); |
- return write_buf->BytesConsumed(); |
-} |
- |
-class UnixDomainClientSocketTest : public testing::Test { |
- protected: |
- UnixDomainClientSocketTest() { |
- EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- socket_path_ = temp_dir_.path().Append(kSocketFilename).value(); |
- } |
- |
- base::ScopedTempDir temp_dir_; |
- std::string socket_path_; |
-}; |
- |
-TEST_F(UnixDomainClientSocketTest, Connect) { |
- const bool kUseAbstractNamespace = false; |
- |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), |
- kUseAbstractNamespace); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- EXPECT_FALSE(accepted_socket); |
- |
- UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- // Server has not yet been notified of the connection. |
- EXPECT_FALSE(accepted_socket); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, ConnectWithSocketDescriptor) { |
- const bool kUseAbstractNamespace = false; |
- |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), |
- kUseAbstractNamespace); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- |
- SocketDescriptor accepted_socket_fd = kInvalidSocket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.AcceptSocketDescriptor(&accepted_socket_fd, |
- accept_callback.callback())); |
- EXPECT_EQ(kInvalidSocket, accepted_socket_fd); |
- |
- UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- // Server has not yet been notified of the connection. |
- EXPECT_EQ(kInvalidSocket, accepted_socket_fd); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_NE(kInvalidSocket, accepted_socket_fd); |
- |
- SocketDescriptor client_socket_fd = client_socket.ReleaseConnectedSocket(); |
- EXPECT_NE(kInvalidSocket, client_socket_fd); |
- |
- // Now, re-wrap client_socket_fd in a UnixDomainClientSocket and try a read |
- // to be sure it hasn't gotten accidentally closed. |
- SockaddrStorage addr; |
- ASSERT_TRUE(UnixDomainClientSocket::FillAddress(socket_path_, false, &addr)); |
- scoped_ptr<SocketLibevent> adopter(new SocketLibevent); |
- adopter->AdoptConnectedSocket(client_socket_fd, addr); |
- UnixDomainClientSocket rewrapped_socket(adopter.Pass()); |
- EXPECT_TRUE(rewrapped_socket.IsConnected()); |
- |
- // Try to read data. |
- const int kReadDataSize = 10; |
- scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); |
- TestCompletionCallback read_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- rewrapped_socket.Read( |
- read_buffer.get(), kReadDataSize, read_callback.callback())); |
- |
- EXPECT_EQ(0, IGNORE_EINTR(close(accepted_socket_fd))); |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, ConnectWithAbstractNamespace) { |
- const bool kUseAbstractNamespace = true; |
- |
- UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- |
-#if defined(OS_ANDROID) || defined(OS_LINUX) |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), |
- kUseAbstractNamespace); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- EXPECT_FALSE(accepted_socket); |
- |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- // Server has not yet beend notified of the connection. |
- EXPECT_FALSE(accepted_socket); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
-#else |
- EXPECT_EQ(ERR_ADDRESS_INVALID, ConnectSynchronously(&client_socket)); |
-#endif |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, ConnectToNonExistentSocket) { |
- const bool kUseAbstractNamespace = false; |
- |
- UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- EXPECT_EQ(ERR_FILE_NOT_FOUND, ConnectSynchronously(&client_socket)); |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, |
- ConnectToNonExistentSocketWithAbstractNamespace) { |
- const bool kUseAbstractNamespace = true; |
- |
- UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- |
- TestCompletionCallback connect_callback; |
-#if defined(OS_ANDROID) || defined(OS_LINUX) |
- EXPECT_EQ(ERR_CONNECTION_REFUSED, ConnectSynchronously(&client_socket)); |
-#else |
- EXPECT_EQ(ERR_ADDRESS_INVALID, ConnectSynchronously(&client_socket)); |
-#endif |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, DisconnectFromClient) { |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- UnixDomainClientSocket client_socket(socket_path_, false); |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- |
- // Try to read data. |
- const int kReadDataSize = 10; |
- scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); |
- TestCompletionCallback read_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- accepted_socket->Read( |
- read_buffer.get(), kReadDataSize, read_callback.callback())); |
- |
- // Disconnect from client side. |
- client_socket.Disconnect(); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- EXPECT_FALSE(accepted_socket->IsConnected()); |
- |
- // Connection closed by peer. |
- EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); |
- // Note that read callback won't be called when the connection is closed |
- // locally before the peer closes it. SocketLibevent just clears callbacks. |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, DisconnectFromServer) { |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- UnixDomainClientSocket client_socket(socket_path_, false); |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- |
- // Try to read data. |
- const int kReadDataSize = 10; |
- scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); |
- TestCompletionCallback read_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- client_socket.Read( |
- read_buffer.get(), kReadDataSize, read_callback.callback())); |
- |
- // Disconnect from server side. |
- accepted_socket->Disconnect(); |
- EXPECT_FALSE(accepted_socket->IsConnected()); |
- EXPECT_FALSE(client_socket.IsConnected()); |
- |
- // Connection closed by peer. |
- EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); |
- // Note that read callback won't be called when the connection is closed |
- // locally before the peer closes it. SocketLibevent just clears callbacks. |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, ReadAfterWrite) { |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- UnixDomainClientSocket client_socket(socket_path_, false); |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- |
- // Send data from client to server. |
- const int kWriteDataSize = 10; |
- scoped_refptr<IOBuffer> write_buffer( |
- new StringIOBuffer(std::string(kWriteDataSize, 'd'))); |
- EXPECT_EQ( |
- kWriteDataSize, |
- WriteSynchronously(&client_socket, write_buffer.get(), kWriteDataSize)); |
- |
- // The buffer is bigger than write data size. |
- const int kReadBufferSize = kWriteDataSize * 2; |
- scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
- EXPECT_EQ(kWriteDataSize, |
- ReadSynchronously(accepted_socket.get(), |
- read_buffer.get(), |
- kReadBufferSize, |
- kWriteDataSize)); |
- EXPECT_EQ(std::string(write_buffer->data(), kWriteDataSize), |
- std::string(read_buffer->data(), kWriteDataSize)); |
- |
- // Send data from server and client. |
- EXPECT_EQ(kWriteDataSize, |
- WriteSynchronously( |
- accepted_socket.get(), write_buffer.get(), kWriteDataSize)); |
- |
- // Read multiple times. |
- const int kSmallReadBufferSize = kWriteDataSize / 3; |
- EXPECT_EQ(kSmallReadBufferSize, |
- ReadSynchronously(&client_socket, |
- read_buffer.get(), |
- kSmallReadBufferSize, |
- kSmallReadBufferSize)); |
- EXPECT_EQ(std::string(write_buffer->data(), kSmallReadBufferSize), |
- std::string(read_buffer->data(), kSmallReadBufferSize)); |
- |
- EXPECT_EQ(kWriteDataSize - kSmallReadBufferSize, |
- ReadSynchronously(&client_socket, |
- read_buffer.get(), |
- kReadBufferSize, |
- kWriteDataSize - kSmallReadBufferSize)); |
- EXPECT_EQ(std::string(write_buffer->data() + kSmallReadBufferSize, |
- kWriteDataSize - kSmallReadBufferSize), |
- std::string(read_buffer->data(), |
- kWriteDataSize - kSmallReadBufferSize)); |
- |
- // No more data. |
- EXPECT_EQ( |
- ERR_IO_PENDING, |
- ReadSynchronously(&client_socket, read_buffer.get(), kReadBufferSize, 0)); |
- |
- // Disconnect from server side after read-write. |
- accepted_socket->Disconnect(); |
- EXPECT_FALSE(accepted_socket->IsConnected()); |
- EXPECT_FALSE(client_socket.IsConnected()); |
-} |
- |
-TEST_F(UnixDomainClientSocketTest, ReadBeforeWrite) { |
- UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); |
- EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
- scoped_ptr<StreamSocket> accepted_socket; |
- TestCompletionCallback accept_callback; |
- EXPECT_EQ(ERR_IO_PENDING, |
- server_socket.Accept(&accepted_socket, accept_callback.callback())); |
- UnixDomainClientSocket client_socket(socket_path_, false); |
- EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
- |
- EXPECT_EQ(OK, accept_callback.WaitForResult()); |
- EXPECT_TRUE(accepted_socket->IsConnected()); |
- EXPECT_TRUE(client_socket.IsConnected()); |
- |
- // Wait for data from client. |
- const int kWriteDataSize = 10; |
- const int kReadBufferSize = kWriteDataSize * 2; |
- const int kSmallReadBufferSize = kWriteDataSize / 3; |
- // Read smaller than write data size first. |
- scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
- TestCompletionCallback read_callback; |
- EXPECT_EQ( |
- ERR_IO_PENDING, |
- accepted_socket->Read( |
- read_buffer.get(), kSmallReadBufferSize, read_callback.callback())); |
- |
- scoped_refptr<IOBuffer> write_buffer( |
- new StringIOBuffer(std::string(kWriteDataSize, 'd'))); |
- EXPECT_EQ( |
- kWriteDataSize, |
- WriteSynchronously(&client_socket, write_buffer.get(), kWriteDataSize)); |
- |
- // First read completed. |
- int rv = read_callback.WaitForResult(); |
- EXPECT_LT(0, rv); |
- EXPECT_LE(rv, kSmallReadBufferSize); |
- |
- // Read remaining data. |
- const int kExpectedRemainingDataSize = kWriteDataSize - rv; |
- EXPECT_LE(0, kExpectedRemainingDataSize); |
- EXPECT_EQ(kExpectedRemainingDataSize, |
- ReadSynchronously(accepted_socket.get(), |
- read_buffer.get(), |
- kReadBufferSize, |
- kExpectedRemainingDataSize)); |
- // No more data. |
- EXPECT_EQ(ERR_IO_PENDING, |
- ReadSynchronously( |
- accepted_socket.get(), read_buffer.get(), kReadBufferSize, 0)); |
- |
- // Disconnect from server side after read-write. |
- accepted_socket->Disconnect(); |
- EXPECT_FALSE(accepted_socket->IsConnected()); |
- EXPECT_FALSE(client_socket.IsConnected()); |
-} |
- |
-} // namespace |
-} // namespace net |