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(bool allow_user
, uid_t uid
, gid_t gid
) {
25 // Here peers are running in same process.
26 EXPECT_EQ(getuid(), uid
);
27 EXPECT_EQ(getgid(), gid
);
31 UnixDomainServerSocket::AuthCallback
CreateAuthCallback(bool allow_user
) {
32 return base::Bind(&UserCanConnectCallback
, allow_user
);
35 // Connects socket synchronously.
36 int ConnectSynchronously(StreamSocket
* socket
) {
37 TestCompletionCallback connect_callback
;
38 int rv
= socket
->Connect(connect_callback
.callback());
39 if (rv
== ERR_IO_PENDING
)
40 rv
= connect_callback
.WaitForResult();
44 // Reads data from |socket| until it fills |buf| at least up to |min_data_len|.
45 // Returns length of data read, or a net error.
46 int ReadSynchronously(StreamSocket
* socket
,
50 DCHECK_LE(min_data_len
, buf_len
);
51 scoped_refptr
<DrainableIOBuffer
> read_buf(
52 new DrainableIOBuffer(buf
, buf_len
));
53 TestCompletionCallback read_callback
;
54 // Iterate reading several times (but not infinite) until it reads at least
55 // |min_data_len| bytes into |buf|.
56 for (int retry_count
= 10;
57 retry_count
> 0 && (read_buf
->BytesConsumed() < min_data_len
||
58 // Try at least once when min_data_len == 0.
61 int rv
= socket
->Read(read_buf
, read_buf
->BytesRemaining(),
62 read_callback
.callback());
63 EXPECT_GE(read_buf
->BytesRemaining(), rv
);
64 if (rv
== ERR_IO_PENDING
) {
65 // If |min_data_len| is 0, returns ERR_IO_PENDING to distinguish the case
66 // when some data has been read.
67 if (min_data_len
== 0) {
68 // No data has been read because of for-loop condition.
69 DCHECK_EQ(0, read_buf
->BytesConsumed());
70 return ERR_IO_PENDING
;
72 rv
= read_callback
.WaitForResult();
74 EXPECT_NE(ERR_IO_PENDING
, rv
);
77 read_buf
->DidConsume(rv
);
79 EXPECT_LE(0, read_buf
->BytesRemaining());
80 return read_buf
->BytesConsumed();
83 // Writes data to |socket| until it completes writing |buf| up to |buf_len|.
84 // Returns length of data written, or a net error.
85 int WriteSynchronously(StreamSocket
* socket
,
88 scoped_refptr
<DrainableIOBuffer
> write_buf(
89 new DrainableIOBuffer(buf
, buf_len
));
90 TestCompletionCallback write_callback
;
91 // Iterate writing several times (but not infinite) until it writes buf fully.
92 for (int retry_count
= 10;
93 retry_count
> 0 && write_buf
->BytesRemaining() > 0;
95 int rv
= socket
->Write(write_buf
, write_buf
->BytesRemaining(),
96 write_callback
.callback());
97 EXPECT_GE(write_buf
->BytesRemaining(), rv
);
98 if (rv
== ERR_IO_PENDING
)
99 rv
= write_callback
.WaitForResult();
100 EXPECT_NE(ERR_IO_PENDING
, rv
);
103 write_buf
->DidConsume(rv
);
105 EXPECT_LE(0, write_buf
->BytesRemaining());
106 return write_buf
->BytesConsumed();
109 class UnixDomainClientSocketTest
: public testing::Test
{
111 UnixDomainClientSocketTest() {
112 EXPECT_TRUE(temp_dir_
.CreateUniqueTempDir());
113 socket_path_
= temp_dir_
.path().Append(kSocketFilename
).value();
116 base::ScopedTempDir temp_dir_
;
117 std::string socket_path_
;
120 TEST_F(UnixDomainClientSocketTest
, Connect
) {
121 const bool kUseAbstractNamespace
= false;
123 UnixDomainServerSocket
server_socket(CreateAuthCallback(true),
124 kUseAbstractNamespace
);
125 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
127 scoped_ptr
<StreamSocket
> accepted_socket
;
128 TestCompletionCallback accept_callback
;
129 EXPECT_EQ(ERR_IO_PENDING
,
130 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
131 EXPECT_FALSE(accepted_socket
);
133 UnixDomainClientSocket
client_socket(socket_path_
, kUseAbstractNamespace
);
134 EXPECT_FALSE(client_socket
.IsConnected());
136 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
137 EXPECT_TRUE(client_socket
.IsConnected());
138 // Server has not yet been notified of the connection.
139 EXPECT_FALSE(accepted_socket
);
141 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
142 EXPECT_TRUE(accepted_socket
);
143 EXPECT_TRUE(accepted_socket
->IsConnected());
146 TEST_F(UnixDomainClientSocketTest
, ConnectWithAbstractNamespace
) {
147 const bool kUseAbstractNamespace
= true;
149 UnixDomainClientSocket
client_socket(socket_path_
, kUseAbstractNamespace
);
150 EXPECT_FALSE(client_socket
.IsConnected());
152 #if defined(OS_ANDROID) || defined(OS_LINUX)
153 UnixDomainServerSocket
server_socket(CreateAuthCallback(true),
154 kUseAbstractNamespace
);
155 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
157 scoped_ptr
<StreamSocket
> accepted_socket
;
158 TestCompletionCallback accept_callback
;
159 EXPECT_EQ(ERR_IO_PENDING
,
160 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
161 EXPECT_FALSE(accepted_socket
);
163 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
164 EXPECT_TRUE(client_socket
.IsConnected());
165 // Server has not yet beend notified of the connection.
166 EXPECT_FALSE(accepted_socket
);
168 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
169 EXPECT_TRUE(accepted_socket
);
170 EXPECT_TRUE(accepted_socket
->IsConnected());
172 EXPECT_EQ(ERR_ADDRESS_INVALID
, ConnectSynchronously(&client_socket
));
176 TEST_F(UnixDomainClientSocketTest
, ConnectToNonExistentSocket
) {
177 const bool kUseAbstractNamespace
= false;
179 UnixDomainClientSocket
client_socket(socket_path_
, kUseAbstractNamespace
);
180 EXPECT_FALSE(client_socket
.IsConnected());
181 EXPECT_EQ(ERR_FILE_NOT_FOUND
, ConnectSynchronously(&client_socket
));
184 TEST_F(UnixDomainClientSocketTest
,
185 ConnectToNonExistentSocketWithAbstractNamespace
) {
186 const bool kUseAbstractNamespace
= true;
188 UnixDomainClientSocket
client_socket(socket_path_
, kUseAbstractNamespace
);
189 EXPECT_FALSE(client_socket
.IsConnected());
191 TestCompletionCallback connect_callback
;
192 #if defined(OS_ANDROID) || defined(OS_LINUX)
193 EXPECT_EQ(ERR_CONNECTION_REFUSED
, ConnectSynchronously(&client_socket
));
195 EXPECT_EQ(ERR_ADDRESS_INVALID
, ConnectSynchronously(&client_socket
));
199 TEST_F(UnixDomainClientSocketTest
, DisconnectFromClient
) {
200 UnixDomainServerSocket
server_socket(CreateAuthCallback(true), false);
201 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
202 scoped_ptr
<StreamSocket
> accepted_socket
;
203 TestCompletionCallback accept_callback
;
204 EXPECT_EQ(ERR_IO_PENDING
,
205 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
206 UnixDomainClientSocket
client_socket(socket_path_
, false);
207 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
209 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
210 EXPECT_TRUE(accepted_socket
->IsConnected());
211 EXPECT_TRUE(client_socket
.IsConnected());
214 const int kReadDataSize
= 10;
215 scoped_refptr
<IOBuffer
> read_buffer(new IOBuffer(kReadDataSize
));
216 TestCompletionCallback read_callback
;
217 EXPECT_EQ(ERR_IO_PENDING
,
218 accepted_socket
->Read(read_buffer
, kReadDataSize
,
219 read_callback
.callback()));
221 // Disconnect from client side.
222 client_socket
.Disconnect();
223 EXPECT_FALSE(client_socket
.IsConnected());
224 EXPECT_FALSE(accepted_socket
->IsConnected());
226 // Connection closed by peer.
227 EXPECT_EQ(0 /* EOF */, read_callback
.WaitForResult());
228 // Note that read callback won't be called when the connection is closed
229 // locally before the peer closes it. SocketLibevent just clears callbacks.
232 TEST_F(UnixDomainClientSocketTest
, DisconnectFromServer
) {
233 UnixDomainServerSocket
server_socket(CreateAuthCallback(true), false);
234 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
235 scoped_ptr
<StreamSocket
> accepted_socket
;
236 TestCompletionCallback accept_callback
;
237 EXPECT_EQ(ERR_IO_PENDING
,
238 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
239 UnixDomainClientSocket
client_socket(socket_path_
, false);
240 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
242 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
243 EXPECT_TRUE(accepted_socket
->IsConnected());
244 EXPECT_TRUE(client_socket
.IsConnected());
247 const int kReadDataSize
= 10;
248 scoped_refptr
<IOBuffer
> read_buffer(new IOBuffer(kReadDataSize
));
249 TestCompletionCallback read_callback
;
250 EXPECT_EQ(ERR_IO_PENDING
,
251 client_socket
.Read(read_buffer
, kReadDataSize
,
252 read_callback
.callback()));
254 // Disconnect from server side.
255 accepted_socket
->Disconnect();
256 EXPECT_FALSE(accepted_socket
->IsConnected());
257 EXPECT_FALSE(client_socket
.IsConnected());
259 // Connection closed by peer.
260 EXPECT_EQ(0 /* EOF */, read_callback
.WaitForResult());
261 // Note that read callback won't be called when the connection is closed
262 // locally before the peer closes it. SocketLibevent just clears callbacks.
265 TEST_F(UnixDomainClientSocketTest
, ReadAfterWrite
) {
266 UnixDomainServerSocket
server_socket(CreateAuthCallback(true), false);
267 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
268 scoped_ptr
<StreamSocket
> accepted_socket
;
269 TestCompletionCallback accept_callback
;
270 EXPECT_EQ(ERR_IO_PENDING
,
271 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
272 UnixDomainClientSocket
client_socket(socket_path_
, false);
273 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
275 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
276 EXPECT_TRUE(accepted_socket
->IsConnected());
277 EXPECT_TRUE(client_socket
.IsConnected());
279 // Send data from client to server.
280 const int kWriteDataSize
= 10;
281 scoped_refptr
<IOBuffer
> write_buffer(
282 new StringIOBuffer(std::string(kWriteDataSize
, 'd')));
283 EXPECT_EQ(kWriteDataSize
,
284 WriteSynchronously(&client_socket
,
288 // The buffer is bigger than write data size.
289 const int kReadBufferSize
= kWriteDataSize
* 2;
290 scoped_refptr
<IOBuffer
> read_buffer(new IOBuffer(kReadBufferSize
));
291 EXPECT_EQ(kWriteDataSize
,
292 ReadSynchronously(accepted_socket
.get(),
296 EXPECT_EQ(std::string(write_buffer
->data(), kWriteDataSize
),
297 std::string(read_buffer
->data(), kWriteDataSize
));
299 // Send data from server and client.
300 EXPECT_EQ(kWriteDataSize
,
301 WriteSynchronously(accepted_socket
.get(),
305 // Read multiple times.
306 const int kSmallReadBufferSize
= kWriteDataSize
/ 3;
307 EXPECT_EQ(kSmallReadBufferSize
,
308 ReadSynchronously(&client_socket
,
310 kSmallReadBufferSize
,
311 kSmallReadBufferSize
));
312 EXPECT_EQ(std::string(write_buffer
->data(), kSmallReadBufferSize
),
313 std::string(read_buffer
->data(), kSmallReadBufferSize
));
315 EXPECT_EQ(kWriteDataSize
- kSmallReadBufferSize
,
316 ReadSynchronously(&client_socket
,
319 kWriteDataSize
- kSmallReadBufferSize
));
320 EXPECT_EQ(std::string(write_buffer
->data() + kSmallReadBufferSize
,
321 kWriteDataSize
- kSmallReadBufferSize
),
322 std::string(read_buffer
->data(),
323 kWriteDataSize
- kSmallReadBufferSize
));
326 EXPECT_EQ(ERR_IO_PENDING
,
327 ReadSynchronously(&client_socket
,
332 // Disconnect from server side after read-write.
333 accepted_socket
->Disconnect();
334 EXPECT_FALSE(accepted_socket
->IsConnected());
335 EXPECT_FALSE(client_socket
.IsConnected());
338 TEST_F(UnixDomainClientSocketTest
, ReadBeforeWrite
) {
339 UnixDomainServerSocket
server_socket(CreateAuthCallback(true), false);
340 EXPECT_EQ(OK
, server_socket
.ListenWithAddressAndPort(socket_path_
, 0, 1));
341 scoped_ptr
<StreamSocket
> accepted_socket
;
342 TestCompletionCallback accept_callback
;
343 EXPECT_EQ(ERR_IO_PENDING
,
344 server_socket
.Accept(&accepted_socket
, accept_callback
.callback()));
345 UnixDomainClientSocket
client_socket(socket_path_
, false);
346 EXPECT_EQ(OK
, ConnectSynchronously(&client_socket
));
348 EXPECT_EQ(OK
, accept_callback
.WaitForResult());
349 EXPECT_TRUE(accepted_socket
->IsConnected());
350 EXPECT_TRUE(client_socket
.IsConnected());
352 // Wait for data from client.
353 const int kWriteDataSize
= 10;
354 const int kReadBufferSize
= kWriteDataSize
* 2;
355 const int kSmallReadBufferSize
= kWriteDataSize
/ 3;
356 // Read smaller than write data size first.
357 scoped_refptr
<IOBuffer
> read_buffer(new IOBuffer(kReadBufferSize
));
358 TestCompletionCallback read_callback
;
359 EXPECT_EQ(ERR_IO_PENDING
,
360 accepted_socket
->Read(read_buffer
, kSmallReadBufferSize
,
361 read_callback
.callback()));
363 scoped_refptr
<IOBuffer
> write_buffer(
364 new StringIOBuffer(std::string(kWriteDataSize
, 'd')));
365 EXPECT_EQ(kWriteDataSize
,
366 WriteSynchronously(&client_socket
,
370 // First read completed.
371 int rv
= read_callback
.WaitForResult();
373 EXPECT_LE(rv
, kSmallReadBufferSize
);
375 // Read remaining data.
376 const int kExpectedRemainingDataSize
= kWriteDataSize
- rv
;
377 EXPECT_LE(0, kExpectedRemainingDataSize
);
378 EXPECT_EQ(kExpectedRemainingDataSize
,
379 ReadSynchronously(accepted_socket
.get(),
382 kExpectedRemainingDataSize
));
384 EXPECT_EQ(ERR_IO_PENDING
,
385 ReadSynchronously(accepted_socket
.get(),
390 // Disconnect from server side after read-write.
391 accepted_socket
->Disconnect();
392 EXPECT_FALSE(accepted_socket
->IsConnected());
393 EXPECT_FALSE(client_socket
.IsConnected());