OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/unix_domain_client_socket_posix.h" | 5 #include "net/socket/unix_domain_client_socket_posix.h" |
6 | 6 |
7 #include <unistd.h> | 7 #include <unistd.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 scoped_refptr<DrainableIOBuffer> read_buf( | 55 scoped_refptr<DrainableIOBuffer> read_buf( |
56 new DrainableIOBuffer(buf, buf_len)); | 56 new DrainableIOBuffer(buf, buf_len)); |
57 TestCompletionCallback read_callback; | 57 TestCompletionCallback read_callback; |
58 // Iterate reading several times (but not infinite) until it reads at least | 58 // Iterate reading several times (but not infinite) until it reads at least |
59 // |min_data_len| bytes into |buf|. | 59 // |min_data_len| bytes into |buf|. |
60 for (int retry_count = 10; | 60 for (int retry_count = 10; |
61 retry_count > 0 && (read_buf->BytesConsumed() < min_data_len || | 61 retry_count > 0 && (read_buf->BytesConsumed() < min_data_len || |
62 // Try at least once when min_data_len == 0. | 62 // Try at least once when min_data_len == 0. |
63 min_data_len == 0); | 63 min_data_len == 0); |
64 --retry_count) { | 64 --retry_count) { |
65 int rv = socket->Read(read_buf, read_buf->BytesRemaining(), | 65 int rv = socket->Read( |
66 read_callback.callback()); | 66 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
67 EXPECT_GE(read_buf->BytesRemaining(), rv); | 67 EXPECT_GE(read_buf->BytesRemaining(), rv); |
68 if (rv == ERR_IO_PENDING) { | 68 if (rv == ERR_IO_PENDING) { |
69 // If |min_data_len| is 0, returns ERR_IO_PENDING to distinguish the case | 69 // If |min_data_len| is 0, returns ERR_IO_PENDING to distinguish the case |
70 // when some data has been read. | 70 // when some data has been read. |
71 if (min_data_len == 0) { | 71 if (min_data_len == 0) { |
72 // No data has been read because of for-loop condition. | 72 // No data has been read because of for-loop condition. |
73 DCHECK_EQ(0, read_buf->BytesConsumed()); | 73 DCHECK_EQ(0, read_buf->BytesConsumed()); |
74 return ERR_IO_PENDING; | 74 return ERR_IO_PENDING; |
75 } | 75 } |
76 rv = read_callback.WaitForResult(); | 76 rv = read_callback.WaitForResult(); |
(...skipping 12 matching lines...) Expand all Loading... |
89 int WriteSynchronously(StreamSocket* socket, | 89 int WriteSynchronously(StreamSocket* socket, |
90 IOBuffer* buf, | 90 IOBuffer* buf, |
91 int buf_len) { | 91 int buf_len) { |
92 scoped_refptr<DrainableIOBuffer> write_buf( | 92 scoped_refptr<DrainableIOBuffer> write_buf( |
93 new DrainableIOBuffer(buf, buf_len)); | 93 new DrainableIOBuffer(buf, buf_len)); |
94 TestCompletionCallback write_callback; | 94 TestCompletionCallback write_callback; |
95 // Iterate writing several times (but not infinite) until it writes buf fully. | 95 // Iterate writing several times (but not infinite) until it writes buf fully. |
96 for (int retry_count = 10; | 96 for (int retry_count = 10; |
97 retry_count > 0 && write_buf->BytesRemaining() > 0; | 97 retry_count > 0 && write_buf->BytesRemaining() > 0; |
98 --retry_count) { | 98 --retry_count) { |
99 int rv = socket->Write(write_buf, write_buf->BytesRemaining(), | 99 int rv = socket->Write(write_buf.get(), |
| 100 write_buf->BytesRemaining(), |
100 write_callback.callback()); | 101 write_callback.callback()); |
101 EXPECT_GE(write_buf->BytesRemaining(), rv); | 102 EXPECT_GE(write_buf->BytesRemaining(), rv); |
102 if (rv == ERR_IO_PENDING) | 103 if (rv == ERR_IO_PENDING) |
103 rv = write_callback.WaitForResult(); | 104 rv = write_callback.WaitForResult(); |
104 EXPECT_NE(ERR_IO_PENDING, rv); | 105 EXPECT_NE(ERR_IO_PENDING, rv); |
105 if (rv < 0) | 106 if (rv < 0) |
106 return rv; | 107 return rv; |
107 write_buf->DidConsume(rv); | 108 write_buf->DidConsume(rv); |
108 } | 109 } |
109 EXPECT_LE(0, write_buf->BytesRemaining()); | 110 EXPECT_LE(0, write_buf->BytesRemaining()); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 | 213 |
213 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 214 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
214 EXPECT_TRUE(accepted_socket->IsConnected()); | 215 EXPECT_TRUE(accepted_socket->IsConnected()); |
215 EXPECT_TRUE(client_socket.IsConnected()); | 216 EXPECT_TRUE(client_socket.IsConnected()); |
216 | 217 |
217 // Try to read data. | 218 // Try to read data. |
218 const int kReadDataSize = 10; | 219 const int kReadDataSize = 10; |
219 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); | 220 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); |
220 TestCompletionCallback read_callback; | 221 TestCompletionCallback read_callback; |
221 EXPECT_EQ(ERR_IO_PENDING, | 222 EXPECT_EQ(ERR_IO_PENDING, |
222 accepted_socket->Read(read_buffer, kReadDataSize, | 223 accepted_socket->Read( |
223 read_callback.callback())); | 224 read_buffer.get(), kReadDataSize, read_callback.callback())); |
224 | 225 |
225 // Disconnect from client side. | 226 // Disconnect from client side. |
226 client_socket.Disconnect(); | 227 client_socket.Disconnect(); |
227 EXPECT_FALSE(client_socket.IsConnected()); | 228 EXPECT_FALSE(client_socket.IsConnected()); |
228 EXPECT_FALSE(accepted_socket->IsConnected()); | 229 EXPECT_FALSE(accepted_socket->IsConnected()); |
229 | 230 |
230 // Connection closed by peer. | 231 // Connection closed by peer. |
231 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); | 232 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); |
232 // Note that read callback won't be called when the connection is closed | 233 // Note that read callback won't be called when the connection is closed |
233 // locally before the peer closes it. SocketLibevent just clears callbacks. | 234 // locally before the peer closes it. SocketLibevent just clears callbacks. |
(...skipping 11 matching lines...) Expand all Loading... |
245 | 246 |
246 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 247 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
247 EXPECT_TRUE(accepted_socket->IsConnected()); | 248 EXPECT_TRUE(accepted_socket->IsConnected()); |
248 EXPECT_TRUE(client_socket.IsConnected()); | 249 EXPECT_TRUE(client_socket.IsConnected()); |
249 | 250 |
250 // Try to read data. | 251 // Try to read data. |
251 const int kReadDataSize = 10; | 252 const int kReadDataSize = 10; |
252 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); | 253 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadDataSize)); |
253 TestCompletionCallback read_callback; | 254 TestCompletionCallback read_callback; |
254 EXPECT_EQ(ERR_IO_PENDING, | 255 EXPECT_EQ(ERR_IO_PENDING, |
255 client_socket.Read(read_buffer, kReadDataSize, | 256 client_socket.Read( |
256 read_callback.callback())); | 257 read_buffer.get(), kReadDataSize, read_callback.callback())); |
257 | 258 |
258 // Disconnect from server side. | 259 // Disconnect from server side. |
259 accepted_socket->Disconnect(); | 260 accepted_socket->Disconnect(); |
260 EXPECT_FALSE(accepted_socket->IsConnected()); | 261 EXPECT_FALSE(accepted_socket->IsConnected()); |
261 EXPECT_FALSE(client_socket.IsConnected()); | 262 EXPECT_FALSE(client_socket.IsConnected()); |
262 | 263 |
263 // Connection closed by peer. | 264 // Connection closed by peer. |
264 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); | 265 EXPECT_EQ(0 /* EOF */, read_callback.WaitForResult()); |
265 // Note that read callback won't be called when the connection is closed | 266 // Note that read callback won't be called when the connection is closed |
266 // locally before the peer closes it. SocketLibevent just clears callbacks. | 267 // locally before the peer closes it. SocketLibevent just clears callbacks. |
(...skipping 10 matching lines...) Expand all Loading... |
277 EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); | 278 EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
278 | 279 |
279 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 280 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
280 EXPECT_TRUE(accepted_socket->IsConnected()); | 281 EXPECT_TRUE(accepted_socket->IsConnected()); |
281 EXPECT_TRUE(client_socket.IsConnected()); | 282 EXPECT_TRUE(client_socket.IsConnected()); |
282 | 283 |
283 // Send data from client to server. | 284 // Send data from client to server. |
284 const int kWriteDataSize = 10; | 285 const int kWriteDataSize = 10; |
285 scoped_refptr<IOBuffer> write_buffer( | 286 scoped_refptr<IOBuffer> write_buffer( |
286 new StringIOBuffer(std::string(kWriteDataSize, 'd'))); | 287 new StringIOBuffer(std::string(kWriteDataSize, 'd'))); |
287 EXPECT_EQ(kWriteDataSize, | 288 EXPECT_EQ( |
288 WriteSynchronously(&client_socket, | 289 kWriteDataSize, |
289 write_buffer, | 290 WriteSynchronously(&client_socket, write_buffer.get(), kWriteDataSize)); |
290 kWriteDataSize)); | |
291 | 291 |
292 // The buffer is bigger than write data size. | 292 // The buffer is bigger than write data size. |
293 const int kReadBufferSize = kWriteDataSize * 2; | 293 const int kReadBufferSize = kWriteDataSize * 2; |
294 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 294 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
295 EXPECT_EQ(kWriteDataSize, | 295 EXPECT_EQ(kWriteDataSize, |
296 ReadSynchronously(accepted_socket.get(), | 296 ReadSynchronously(accepted_socket.get(), |
297 read_buffer, | 297 read_buffer.get(), |
298 kReadBufferSize, | 298 kReadBufferSize, |
299 kWriteDataSize)); | 299 kWriteDataSize)); |
300 EXPECT_EQ(std::string(write_buffer->data(), kWriteDataSize), | 300 EXPECT_EQ(std::string(write_buffer->data(), kWriteDataSize), |
301 std::string(read_buffer->data(), kWriteDataSize)); | 301 std::string(read_buffer->data(), kWriteDataSize)); |
302 | 302 |
303 // Send data from server and client. | 303 // Send data from server and client. |
304 EXPECT_EQ(kWriteDataSize, | 304 EXPECT_EQ(kWriteDataSize, |
305 WriteSynchronously(accepted_socket.get(), | 305 WriteSynchronously( |
306 write_buffer, | 306 accepted_socket.get(), write_buffer.get(), kWriteDataSize)); |
307 kWriteDataSize)); | |
308 | 307 |
309 // Read multiple times. | 308 // Read multiple times. |
310 const int kSmallReadBufferSize = kWriteDataSize / 3; | 309 const int kSmallReadBufferSize = kWriteDataSize / 3; |
311 EXPECT_EQ(kSmallReadBufferSize, | 310 EXPECT_EQ(kSmallReadBufferSize, |
312 ReadSynchronously(&client_socket, | 311 ReadSynchronously(&client_socket, |
313 read_buffer, | 312 read_buffer.get(), |
314 kSmallReadBufferSize, | 313 kSmallReadBufferSize, |
315 kSmallReadBufferSize)); | 314 kSmallReadBufferSize)); |
316 EXPECT_EQ(std::string(write_buffer->data(), kSmallReadBufferSize), | 315 EXPECT_EQ(std::string(write_buffer->data(), kSmallReadBufferSize), |
317 std::string(read_buffer->data(), kSmallReadBufferSize)); | 316 std::string(read_buffer->data(), kSmallReadBufferSize)); |
318 | 317 |
319 EXPECT_EQ(kWriteDataSize - kSmallReadBufferSize, | 318 EXPECT_EQ(kWriteDataSize - kSmallReadBufferSize, |
320 ReadSynchronously(&client_socket, | 319 ReadSynchronously(&client_socket, |
321 read_buffer, | 320 read_buffer.get(), |
322 kReadBufferSize, | 321 kReadBufferSize, |
323 kWriteDataSize - kSmallReadBufferSize)); | 322 kWriteDataSize - kSmallReadBufferSize)); |
324 EXPECT_EQ(std::string(write_buffer->data() + kSmallReadBufferSize, | 323 EXPECT_EQ(std::string(write_buffer->data() + kSmallReadBufferSize, |
325 kWriteDataSize - kSmallReadBufferSize), | 324 kWriteDataSize - kSmallReadBufferSize), |
326 std::string(read_buffer->data(), | 325 std::string(read_buffer->data(), |
327 kWriteDataSize - kSmallReadBufferSize)); | 326 kWriteDataSize - kSmallReadBufferSize)); |
328 | 327 |
329 // No more data. | 328 // No more data. |
330 EXPECT_EQ(ERR_IO_PENDING, | 329 EXPECT_EQ( |
331 ReadSynchronously(&client_socket, | 330 ERR_IO_PENDING, |
332 read_buffer, | 331 ReadSynchronously(&client_socket, read_buffer.get(), kReadBufferSize, 0)); |
333 kReadBufferSize, | |
334 0)); | |
335 | 332 |
336 // Disconnect from server side after read-write. | 333 // Disconnect from server side after read-write. |
337 accepted_socket->Disconnect(); | 334 accepted_socket->Disconnect(); |
338 EXPECT_FALSE(accepted_socket->IsConnected()); | 335 EXPECT_FALSE(accepted_socket->IsConnected()); |
339 EXPECT_FALSE(client_socket.IsConnected()); | 336 EXPECT_FALSE(client_socket.IsConnected()); |
340 } | 337 } |
341 | 338 |
342 TEST_F(UnixDomainClientSocketTest, ReadBeforeWrite) { | 339 TEST_F(UnixDomainClientSocketTest, ReadBeforeWrite) { |
343 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); | 340 UnixDomainServerSocket server_socket(CreateAuthCallback(true), false); |
344 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); | 341 EXPECT_EQ(OK, server_socket.ListenWithAddressAndPort(socket_path_, 0, 1)); |
345 scoped_ptr<StreamSocket> accepted_socket; | 342 scoped_ptr<StreamSocket> accepted_socket; |
346 TestCompletionCallback accept_callback; | 343 TestCompletionCallback accept_callback; |
347 EXPECT_EQ(ERR_IO_PENDING, | 344 EXPECT_EQ(ERR_IO_PENDING, |
348 server_socket.Accept(&accepted_socket, accept_callback.callback())); | 345 server_socket.Accept(&accepted_socket, accept_callback.callback())); |
349 UnixDomainClientSocket client_socket(socket_path_, false); | 346 UnixDomainClientSocket client_socket(socket_path_, false); |
350 EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); | 347 EXPECT_EQ(OK, ConnectSynchronously(&client_socket)); |
351 | 348 |
352 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 349 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
353 EXPECT_TRUE(accepted_socket->IsConnected()); | 350 EXPECT_TRUE(accepted_socket->IsConnected()); |
354 EXPECT_TRUE(client_socket.IsConnected()); | 351 EXPECT_TRUE(client_socket.IsConnected()); |
355 | 352 |
356 // Wait for data from client. | 353 // Wait for data from client. |
357 const int kWriteDataSize = 10; | 354 const int kWriteDataSize = 10; |
358 const int kReadBufferSize = kWriteDataSize * 2; | 355 const int kReadBufferSize = kWriteDataSize * 2; |
359 const int kSmallReadBufferSize = kWriteDataSize / 3; | 356 const int kSmallReadBufferSize = kWriteDataSize / 3; |
360 // Read smaller than write data size first. | 357 // Read smaller than write data size first. |
361 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 358 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
362 TestCompletionCallback read_callback; | 359 TestCompletionCallback read_callback; |
363 EXPECT_EQ(ERR_IO_PENDING, | 360 EXPECT_EQ( |
364 accepted_socket->Read(read_buffer, kSmallReadBufferSize, | 361 ERR_IO_PENDING, |
365 read_callback.callback())); | 362 accepted_socket->Read( |
| 363 read_buffer.get(), kSmallReadBufferSize, read_callback.callback())); |
366 | 364 |
367 scoped_refptr<IOBuffer> write_buffer( | 365 scoped_refptr<IOBuffer> write_buffer( |
368 new StringIOBuffer(std::string(kWriteDataSize, 'd'))); | 366 new StringIOBuffer(std::string(kWriteDataSize, 'd'))); |
369 EXPECT_EQ(kWriteDataSize, | 367 EXPECT_EQ( |
370 WriteSynchronously(&client_socket, | 368 kWriteDataSize, |
371 write_buffer, | 369 WriteSynchronously(&client_socket, write_buffer.get(), kWriteDataSize)); |
372 kWriteDataSize)); | |
373 | 370 |
374 // First read completed. | 371 // First read completed. |
375 int rv = read_callback.WaitForResult(); | 372 int rv = read_callback.WaitForResult(); |
376 EXPECT_LT(0, rv); | 373 EXPECT_LT(0, rv); |
377 EXPECT_LE(rv, kSmallReadBufferSize); | 374 EXPECT_LE(rv, kSmallReadBufferSize); |
378 | 375 |
379 // Read remaining data. | 376 // Read remaining data. |
380 const int kExpectedRemainingDataSize = kWriteDataSize - rv; | 377 const int kExpectedRemainingDataSize = kWriteDataSize - rv; |
381 EXPECT_LE(0, kExpectedRemainingDataSize); | 378 EXPECT_LE(0, kExpectedRemainingDataSize); |
382 EXPECT_EQ(kExpectedRemainingDataSize, | 379 EXPECT_EQ(kExpectedRemainingDataSize, |
383 ReadSynchronously(accepted_socket.get(), | 380 ReadSynchronously(accepted_socket.get(), |
384 read_buffer, | 381 read_buffer.get(), |
385 kReadBufferSize, | 382 kReadBufferSize, |
386 kExpectedRemainingDataSize)); | 383 kExpectedRemainingDataSize)); |
387 // No more data. | 384 // No more data. |
388 EXPECT_EQ(ERR_IO_PENDING, | 385 EXPECT_EQ(ERR_IO_PENDING, |
389 ReadSynchronously(accepted_socket.get(), | 386 ReadSynchronously( |
390 read_buffer, | 387 accepted_socket.get(), read_buffer.get(), kReadBufferSize, 0)); |
391 kReadBufferSize, | |
392 0)); | |
393 | 388 |
394 // Disconnect from server side after read-write. | 389 // Disconnect from server side after read-write. |
395 accepted_socket->Disconnect(); | 390 accepted_socket->Disconnect(); |
396 EXPECT_FALSE(accepted_socket->IsConnected()); | 391 EXPECT_FALSE(accepted_socket->IsConnected()); |
397 EXPECT_FALSE(client_socket.IsConnected()); | 392 EXPECT_FALSE(client_socket.IsConnected()); |
398 } | 393 } |
399 | 394 |
400 } // namespace | 395 } // namespace |
401 } // namespace net | 396 } // namespace net |
OLD | NEW |