1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/socket/unix_domain_client_socket_posix.h"
10 #include "base/files/file_path.h"
11 #include "base/files/scoped_temp_dir.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "net/base/io_buffer.h"
14 #include "net/base/net_errors.h"
15 #include "net/base/test_completion_callback.h"
16 #include "net/socket/unix_domain_server_socket_posix.h"
17 #include "testing/gtest/include/gtest/gtest.h"
22 const char kSocketFilename[] = "socket_for_testing";
24 bool UserCanConnectCallback(
25 bool allow_user, const UnixDomainServerSocket::Credentials& credentials) {
26 // Here peers are running in same process.
27 #if defined(OS_LINUX) || defined(OS_ANDROID)
28 EXPECT_EQ(getpid(), credentials.process_id);
30 EXPECT_EQ(getuid(), credentials.user_id);
31 EXPECT_EQ(getgid(), credentials.group_id);
35 UnixDomainServerSocket::AuthCallback CreateAuthCallback(bool allow_user) {
36 return base::Bind(&UserCanConnectCallback, allow_user);
39 // Connects socket synchronously.
40 int ConnectSynchronously(StreamSocket* socket) {
41 TestCompletionCallback connect_callback;
42 int rv = socket->Connect(connect_callback.callback());
43 if (rv == ERR_IO_PENDING)
44 rv = connect_callback.WaitForResult();
48 // Reads data from |socket| until it fills |buf| at least up to |min_data_len|.
49 // Returns length of data read, or a net error.
50 int ReadSynchronously(StreamSocket* socket,
54 DCHECK_LE(min_data_len, buf_len);
55 scoped_refptr<DrainableIOBuffer> read_buf(
56 new DrainableIOBuffer(buf, buf_len));
57 TestCompletionCallback read_callback;
58 // Iterate reading several times (but not infinite) until it reads at least
59 // |min_data_len| bytes into |buf|.
60 for (int retry_count = 10;
61 retry_count > 0 && (read_buf->BytesConsumed() < min_data_len ||
62 // Try at least once when min_data_len == 0.
65 int rv = socket->Read(read_buf, read_buf->BytesRemaining(),
66 read_callback.callback());
67 EXPECT_GE(read_buf->BytesRemaining(), rv);
68 if (rv == ERR_IO_PENDING) {
69 // If |min_data_len| is 0, returns ERR_IO_PENDING to distinguish the case
70 // when some data has been read.
71 if (min_data_len == 0) {
72 // No data has been read because of for-loop condition.
73 DCHECK_EQ(0, read_buf->BytesConsumed());
74 return ERR_IO_PENDING;
76 rv = read_callback.WaitForResult();
78 EXPECT_NE(ERR_IO_PENDING, rv);
81 read_buf->DidConsume(rv);
83 EXPECT_LE(0, read_buf->BytesRemaining());
84 return read_buf->BytesConsumed();
87 // Writes data to |socket| until it completes writing |buf| up to |buf_len|.
88 // Returns length of data written, or a net error.
89 int WriteSynchronously(StreamSocket* socket,
92 scoped_refptr<DrainableIOBuffer> write_buf(
93 new DrainableIOBuffer(buf, buf_len));
94 TestCompletionCallback write_callback;
95 // Iterate writing several times (but not infinite) until it writes buf fully.
96 for (int retry_count = 10;
97 retry_count > 0 && write_buf->BytesRemaining() > 0;
99 int rv = socket->Write(write_buf, write_buf->BytesRemaining(),
100 write_callback.callback());
101 EXPECT_GE(write_buf->BytesRemaining(), rv);
102 if (rv == ERR_IO_PENDING)
103 rv = write_callback.WaitForResult();
104 EXPECT_NE(ERR_IO_PENDING, rv);
107 write_buf->DidConsume(rv);
109 EXPECT_LE(0, write_buf->BytesRemaining());
110 return write_buf->BytesConsumed();
113 class UnixDomainClientSocketTest : public testing::Test {
115 UnixDomainClientSocketTest() {
116 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
117 socket_path_ = temp_dir_.path().Append(kSocketFilename).value();
120 base::ScopedTempDir temp_dir_;
121 std::string socket_path_;
124 TEST_F(UnixDomainClientSocketTest, Connect) {
125 const bool kUseAbstractNamespace = false;
127 UnixDomainServerSocket server_socket(CreateAuthCallback(true),
128 kUseAbstractNamespace);
129 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
131 scoped_ptr<StreamSocket> accepted_socket;
132 TestCompletionCallback accept_callback;
133 EXPECT_EQ(ERR_IO_PENDING,
134 server_socket.Accept(&accepted_socket, accept_callback.callback()));
135 EXPECT_FALSE(accepted_socket);
137 UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace);
138 EXPECT_FALSE(client_socket.IsConnected());
140 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
141 EXPECT_TRUE(client_socket.IsConnected());
142 // Server has not yet been notified of the connection.
143 EXPECT_FALSE(accepted_socket);
145 EXPECT_EQ(OK, accept_callback.WaitForResult());
146 EXPECT_TRUE(accepted_socket);
147 EXPECT_TRUE(accepted_socket->IsConnected());
150 TEST_F(UnixDomainClientSocketTest, ConnectWithAbstractNamespace) {
151 const bool kUseAbstractNamespace = true;
153 UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace);
154 EXPECT_FALSE(client_socket.IsConnected());
156 #if defined(OS_ANDROID) || defined(OS_LINUX)
157 UnixDomainServerSocket server_socket(CreateAuthCallback(true),
158 kUseAbstractNamespace);
159 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
161 scoped_ptr<StreamSocket> accepted_socket;
162 TestCompletionCallback accept_callback;
163 EXPECT_EQ(ERR_IO_PENDING,
164 server_socket.Accept(&accepted_socket, accept_callback.callback()));
165 EXPECT_FALSE(accepted_socket);
167 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
168 EXPECT_TRUE(client_socket.IsConnected());
169 // Server has not yet beend notified of the connection.
170 EXPECT_FALSE(accepted_socket);
172 EXPECT_EQ(OK, accept_callback.WaitForResult());
173 EXPECT_TRUE(accepted_socket);
174 EXPECT_TRUE(accepted_socket->IsConnected());
176 EXPECT_EQ(ERR_ADDRESS_INVALID, ConnectSynchronously(&client_socket));
180 TEST_F(UnixDomainClientSocketTest, ConnectToNonExistentSocket) {
181 const bool kUseAbstractNamespace = false;
183 UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace);
184 EXPECT_FALSE(client_socket.IsConnected());
185 EXPECT_EQ(ERR_FILE_NOT_FOUND, ConnectSynchronously(&client_socket));
188 TEST_F(UnixDomainClientSocketTest,
189 ConnectToNonExistentSocketWithAbstractNamespace) {
190 const bool kUseAbstractNamespace = true;
192 UnixDomainClientSocket client_socket(socket_path_, kUseAbstractNamespace);
193 EXPECT_FALSE(client_socket.IsConnected());
195 TestCompletionCallback connect_callback;
196 #if defined(OS_ANDROID) || defined(OS_LINUX)
197 EXPECT_EQ(ERR_CONNECTION_REFUSED, ConnectSynchronously(&client_socket));
199 EXPECT_EQ(ERR_ADDRESS_INVALID, ConnectSynchronously(&client_socket));
203 TEST_F(UnixDomainClientSocketTest, DisconnectFromClient) {
204 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false);
205 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
206 scoped_ptr<StreamSocket> accepted_socket;
207 TestCompletionCallback accept_callback;
208 EXPECT_EQ(ERR_IO_PENDING,
209 server_socket.Accept(&accepted_socket, accept_callback.callback()));
210 UnixDomainClientSocket client_socket(socket_path_, false);
211 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
213 EXPECT_EQ(OK, accept_callback.WaitForResult());
214 EXPECT_TRUE(accepted_socket->IsConnected());
215 EXPECT_TRUE(client_socket.IsConnected());
218 const int kReadDataSize = 10;
219 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize));
220 TestCompletionCallback read_callback;
221 EXPECT_EQ(ERR_IO_PENDING,
222 accepted_socket->Read(read_buffer, kReadDataSize,
223 read_callback.callback()));
225 // Disconnect from client side.
226 client_socket.Disconnect();
227 EXPECT_FALSE(client_socket.IsConnected());
228 EXPECT_FALSE(accepted_socket->IsConnected());
230 // Connection closed by peer.
231 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult());
232 // Note that read callback won't be called when the connection is closed
233 // locally before the peer closes it. SocketLibevent just clears callbacks.
236 TEST_F(UnixDomainClientSocketTest, DisconnectFromServer) {
237 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false);
238 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
239 scoped_ptr<StreamSocket> accepted_socket;
240 TestCompletionCallback accept_callback;
241 EXPECT_EQ(ERR_IO_PENDING,
242 server_socket.Accept(&accepted_socket, accept_callback.callback()));
243 UnixDomainClientSocket client_socket(socket_path_, false);
244 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
246 EXPECT_EQ(OK, accept_callback.WaitForResult());
247 EXPECT_TRUE(accepted_socket->IsConnected());
248 EXPECT_TRUE(client_socket.IsConnected());
251 const int kReadDataSize = 10;
252 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize));
253 TestCompletionCallback read_callback;
254 EXPECT_EQ(ERR_IO_PENDING,
255 client_socket.Read(read_buffer, kReadDataSize,
256 read_callback.callback()));
258 // Disconnect from server side.
259 accepted_socket->Disconnect();
260 EXPECT_FALSE(accepted_socket->IsConnected());
261 EXPECT_FALSE(client_socket.IsConnected());
263 // Connection closed by peer.
264 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult());
265 // Note that read callback won't be called when the connection is closed
266 // locally before the peer closes it. SocketLibevent just clears callbacks.
269 TEST_F(UnixDomainClientSocketTest, ReadAfterWrite) {
270 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false);
271 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
272 scoped_ptr<StreamSocket> accepted_socket;
273 TestCompletionCallback accept_callback;
274 EXPECT_EQ(ERR_IO_PENDING,
275 server_socket.Accept(&accepted_socket, accept_callback.callback()));
276 UnixDomainClientSocket client_socket(socket_path_, false);
277 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
279 EXPECT_EQ(OK, accept_callback.WaitForResult());
280 EXPECT_TRUE(accepted_socket->IsConnected());
281 EXPECT_TRUE(client_socket.IsConnected());
283 // Send data from client to server.
284 const int kWriteDataSize = 10;
285 scoped_refptr<IOBuffer> write_buffer(
286 new StringIOBuffer(std::string(kWriteDataSize, 'd')));
287 EXPECT_EQ(kWriteDataSize,
288 WriteSynchronously(&client_socket,
292 // The buffer is bigger than write data size.
293 const int kReadBufferSize = kWriteDataSize * 2;
294 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
295 EXPECT_EQ(kWriteDataSize,
296 ReadSynchronously(accepted_socket.get(),
300 EXPECT_EQ(std::string(write_buffer->data(), kWriteDataSize),
301 std::string(read_buffer->data(), kWriteDataSize));
303 // Send data from server and client.
304 EXPECT_EQ(kWriteDataSize,
305 WriteSynchronously(accepted_socket.get(),
309 // Read multiple times.
310 const int kSmallReadBufferSize = kWriteDataSize / 3;
311 EXPECT_EQ(kSmallReadBufferSize,
312 ReadSynchronously(&client_socket,
314 kSmallReadBufferSize,
315 kSmallReadBufferSize));
316 EXPECT_EQ(std::string(write_buffer->data(), kSmallReadBufferSize),
317 std::string(read_buffer->data(), kSmallReadBufferSize));
319 EXPECT_EQ(kWriteDataSize - kSmallReadBufferSize,
320 ReadSynchronously(&client_socket,
323 kWriteDataSize - kSmallReadBufferSize));
324 EXPECT_EQ(std::string(write_buffer->data() + kSmallReadBufferSize,
325 kWriteDataSize - kSmallReadBufferSize),
326 std::string(read_buffer->data(),
327 kWriteDataSize - kSmallReadBufferSize));
330 EXPECT_EQ(ERR_IO_PENDING,
331 ReadSynchronously(&client_socket,
336 // Disconnect from server side after read-write.
337 accepted_socket->Disconnect();
338 EXPECT_FALSE(accepted_socket->IsConnected());
339 EXPECT_FALSE(client_socket.IsConnected());
342 TEST_F(UnixDomainClientSocketTest, ReadBeforeWrite) {
343 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false);
344 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1));
345 scoped_ptr<StreamSocket> accepted_socket;
346 TestCompletionCallback accept_callback;
347 EXPECT_EQ(ERR_IO_PENDING,
348 server_socket.Accept(&accepted_socket, accept_callback.callback()));
349 UnixDomainClientSocket client_socket(socket_path_, false);
350 EXPECT_EQ(OK, ConnectSynchronously(&client_socket));
352 EXPECT_EQ(OK, accept_callback.WaitForResult());
353 EXPECT_TRUE(accepted_socket->IsConnected());
354 EXPECT_TRUE(client_socket.IsConnected());
356 // Wait for data from client.
357 const int kWriteDataSize = 10;
358 const int kReadBufferSize = kWriteDataSize * 2;
359 const int kSmallReadBufferSize = kWriteDataSize / 3;
360 // Read smaller than write data size first.
361 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
362 TestCompletionCallback read_callback;
363 EXPECT_EQ(ERR_IO_PENDING,
364 accepted_socket->Read(read_buffer, kSmallReadBufferSize,
365 read_callback.callback()));
367 scoped_refptr<IOBuffer> write_buffer(
368 new StringIOBuffer(std::string(kWriteDataSize, 'd')));
369 EXPECT_EQ(kWriteDataSize,
370 WriteSynchronously(&client_socket,
374 // First read completed.
375 int rv = read_callback.WaitForResult();
377 EXPECT_LE(rv, kSmallReadBufferSize);
379 // Read remaining data.
380 const int kExpectedRemainingDataSize = kWriteDataSize - rv;
381 EXPECT_LE(0, kExpectedRemainingDataSize);
382 EXPECT_EQ(kExpectedRemainingDataSize,
383 ReadSynchronously(accepted_socket.get(),
386 kExpectedRemainingDataSize));
388 EXPECT_EQ(ERR_IO_PENDING,
389 ReadSynchronously(accepted_socket.get(),
394 // Disconnect from server side after read-write.
395 accepted_socket->Disconnect();
396 EXPECT_FALSE(accepted_socket->IsConnected());
397 EXPECT_FALSE(client_socket.IsConnected());