| 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 |