| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/file_stream.h" | 5 #include "net/base/file_stream.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "base/path_service.h" | 11 #include "base/path_service.h" |
| 12 #include "base/platform_file.h" | 12 #include "base/platform_file.h" |
| 13 #include "net/base/io_buffer.h" |
| 13 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
| 14 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "testing/platform_test.h" | 17 #include "testing/platform_test.h" |
| 17 | 18 |
| 18 namespace net { | 19 namespace net { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| 22 const char kTestData[] = "0123456789"; | 23 const char kTestData[] = "0123456789"; |
| 23 const int kTestDataSize = arraysize(kTestData) - 1; | 24 const int kTestDataSize = arraysize(kTestData) - 1; |
| 24 | 25 |
| 26 // Creates an IOBufferWithSize that contains the kTestDataSize. |
| 27 IOBufferWithSize* CreateTestDataBuffer() { |
| 28 IOBufferWithSize* buf = new IOBufferWithSize(kTestDataSize); |
| 29 memcpy(buf->data(), kTestData, kTestDataSize); |
| 30 return buf; |
| 31 } |
| 32 |
| 25 } // namespace | 33 } // namespace |
| 26 | 34 |
| 27 class FileStreamTest : public PlatformTest { | 35 class FileStreamTest : public PlatformTest { |
| 28 public: | 36 public: |
| 29 virtual void SetUp() { | 37 virtual void SetUp() { |
| 30 PlatformTest::SetUp(); | 38 PlatformTest::SetUp(); |
| 31 | 39 |
| 32 file_util::CreateTemporaryFile(&temp_file_path_); | 40 file_util::CreateTemporaryFile(&temp_file_path_); |
| 33 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize); | 41 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize); |
| 34 } | 42 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 | 198 |
| 191 int64 total_bytes_avail = stream.Available(); | 199 int64 total_bytes_avail = stream.Available(); |
| 192 EXPECT_EQ(file_size, total_bytes_avail); | 200 EXPECT_EQ(file_size, total_bytes_avail); |
| 193 | 201 |
| 194 TestCompletionCallback callback; | 202 TestCompletionCallback callback; |
| 195 | 203 |
| 196 int total_bytes_read = 0; | 204 int total_bytes_read = 0; |
| 197 | 205 |
| 198 std::string data_read; | 206 std::string data_read; |
| 199 for (;;) { | 207 for (;;) { |
| 200 char buf[4]; | 208 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 201 rv = stream.Read(buf, arraysize(buf), callback.callback()); | 209 rv = stream.Read(buf, buf->size(), callback.callback()); |
| 202 if (rv == ERR_IO_PENDING) | 210 if (rv == ERR_IO_PENDING) |
| 203 rv = callback.WaitForResult(); | 211 rv = callback.WaitForResult(); |
| 204 EXPECT_LE(0, rv); | 212 EXPECT_LE(0, rv); |
| 205 if (rv <= 0) | 213 if (rv <= 0) |
| 206 break; | 214 break; |
| 207 total_bytes_read += rv; | 215 total_bytes_read += rv; |
| 208 data_read.append(buf, rv); | 216 data_read.append(buf->data(), rv); |
| 209 } | 217 } |
| 210 EXPECT_EQ(file_size, total_bytes_read); | 218 EXPECT_EQ(file_size, total_bytes_read); |
| 211 EXPECT_EQ(kTestData, data_read); | 219 EXPECT_EQ(kTestData, data_read); |
| 212 } | 220 } |
| 213 | 221 |
| 214 TEST_F(FileStreamTest, AsyncRead_EarlyClose) { | 222 TEST_F(FileStreamTest, AsyncRead_EarlyClose) { |
| 215 int64 file_size; | 223 int64 file_size; |
| 216 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 224 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 217 EXPECT_TRUE(ok); | 225 EXPECT_TRUE(ok); |
| 218 | 226 |
| 219 FileStream stream(NULL); | 227 FileStream stream(NULL); |
| 220 int flags = base::PLATFORM_FILE_OPEN | | 228 int flags = base::PLATFORM_FILE_OPEN | |
| 221 base::PLATFORM_FILE_READ | | 229 base::PLATFORM_FILE_READ | |
| 222 base::PLATFORM_FILE_ASYNC; | 230 base::PLATFORM_FILE_ASYNC; |
| 223 int rv = stream.OpenSync(temp_file_path(), flags); | 231 int rv = stream.OpenSync(temp_file_path(), flags); |
| 224 EXPECT_EQ(OK, rv); | 232 EXPECT_EQ(OK, rv); |
| 225 | 233 |
| 226 int64 total_bytes_avail = stream.Available(); | 234 int64 total_bytes_avail = stream.Available(); |
| 227 EXPECT_EQ(file_size, total_bytes_avail); | 235 EXPECT_EQ(file_size, total_bytes_avail); |
| 228 | 236 |
| 229 TestCompletionCallback callback; | 237 TestCompletionCallback callback; |
| 230 | 238 |
| 231 char buf[4]; | 239 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 232 rv = stream.Read(buf, arraysize(buf), callback.callback()); | 240 rv = stream.Read(buf, buf->size(), callback.callback()); |
| 233 stream.CloseSync(); | 241 stream.CloseSync(); |
| 234 if (rv < 0) { | 242 if (rv < 0) { |
| 235 EXPECT_EQ(ERR_IO_PENDING, rv); | 243 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 236 // The callback should not be called if the request is cancelled. | 244 // The callback should not be called if the request is cancelled. |
| 237 MessageLoop::current()->RunAllPending(); | 245 MessageLoop::current()->RunAllPending(); |
| 238 EXPECT_FALSE(callback.have_result()); | 246 EXPECT_FALSE(callback.have_result()); |
| 239 } else { | 247 } else { |
| 240 EXPECT_EQ(std::string(kTestData, rv), std::string(buf, rv)); | 248 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv)); |
| 241 } | 249 } |
| 242 } | 250 } |
| 243 | 251 |
| 244 TEST_F(FileStreamTest, BasicRead_FromOffset) { | 252 TEST_F(FileStreamTest, BasicRead_FromOffset) { |
| 245 int64 file_size; | 253 int64 file_size; |
| 246 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 254 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 247 EXPECT_TRUE(ok); | 255 EXPECT_TRUE(ok); |
| 248 | 256 |
| 249 FileStream stream(NULL); | 257 FileStream stream(NULL); |
| 250 int flags = base::PLATFORM_FILE_OPEN | | 258 int flags = base::PLATFORM_FILE_OPEN | |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 | 302 |
| 295 int64 total_bytes_avail = stream.Available(); | 303 int64 total_bytes_avail = stream.Available(); |
| 296 EXPECT_EQ(file_size - kOffset, total_bytes_avail); | 304 EXPECT_EQ(file_size - kOffset, total_bytes_avail); |
| 297 | 305 |
| 298 TestCompletionCallback callback; | 306 TestCompletionCallback callback; |
| 299 | 307 |
| 300 int total_bytes_read = 0; | 308 int total_bytes_read = 0; |
| 301 | 309 |
| 302 std::string data_read; | 310 std::string data_read; |
| 303 for (;;) { | 311 for (;;) { |
| 304 char buf[4]; | 312 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 305 rv = stream.Read(buf, arraysize(buf), callback.callback()); | 313 rv = stream.Read(buf, buf->size(), callback.callback()); |
| 306 if (rv == ERR_IO_PENDING) | 314 if (rv == ERR_IO_PENDING) |
| 307 rv = callback.WaitForResult(); | 315 rv = callback.WaitForResult(); |
| 308 EXPECT_LE(0, rv); | 316 EXPECT_LE(0, rv); |
| 309 if (rv <= 0) | 317 if (rv <= 0) |
| 310 break; | 318 break; |
| 311 total_bytes_read += rv; | 319 total_bytes_read += rv; |
| 312 data_read.append(buf, rv); | 320 data_read.append(buf->data(), rv); |
| 313 } | 321 } |
| 314 EXPECT_EQ(file_size - kOffset, total_bytes_read); | 322 EXPECT_EQ(file_size - kOffset, total_bytes_read); |
| 315 EXPECT_EQ(kTestData + kOffset, data_read); | 323 EXPECT_EQ(kTestData + kOffset, data_read); |
| 316 } | 324 } |
| 317 | 325 |
| 318 TEST_F(FileStreamTest, SeekAround) { | 326 TEST_F(FileStreamTest, SeekAround) { |
| 319 FileStream stream(NULL); | 327 FileStream stream(NULL); |
| 320 int flags = base::PLATFORM_FILE_OPEN | | 328 int flags = base::PLATFORM_FILE_OPEN | |
| 321 base::PLATFORM_FILE_READ; | 329 base::PLATFORM_FILE_READ; |
| 322 int rv = stream.OpenSync(temp_file_path(), flags); | 330 int rv = stream.OpenSync(temp_file_path(), flags); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 EXPECT_EQ(OK, rv); | 376 EXPECT_EQ(OK, rv); |
| 369 | 377 |
| 370 int64 file_size; | 378 int64 file_size; |
| 371 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 379 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 372 EXPECT_TRUE(ok); | 380 EXPECT_TRUE(ok); |
| 373 EXPECT_EQ(0, file_size); | 381 EXPECT_EQ(0, file_size); |
| 374 | 382 |
| 375 TestCompletionCallback callback; | 383 TestCompletionCallback callback; |
| 376 int total_bytes_written = 0; | 384 int total_bytes_written = 0; |
| 377 | 385 |
| 386 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 387 scoped_refptr<DrainableIOBuffer> drainable = |
| 388 new DrainableIOBuffer(buf, buf->size()); |
| 378 while (total_bytes_written != kTestDataSize) { | 389 while (total_bytes_written != kTestDataSize) { |
| 379 rv = stream.Write(kTestData + total_bytes_written, | 390 rv = stream.Write(drainable, drainable->BytesRemaining(), |
| 380 kTestDataSize - total_bytes_written, | |
| 381 callback.callback()); | 391 callback.callback()); |
| 382 if (rv == ERR_IO_PENDING) | 392 if (rv == ERR_IO_PENDING) |
| 383 rv = callback.WaitForResult(); | 393 rv = callback.WaitForResult(); |
| 384 EXPECT_LT(0, rv); | 394 EXPECT_LT(0, rv); |
| 385 if (rv <= 0) | 395 if (rv <= 0) |
| 386 break; | 396 break; |
| 397 drainable->DidConsume(rv); |
| 387 total_bytes_written += rv; | 398 total_bytes_written += rv; |
| 388 } | 399 } |
| 389 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 400 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 390 EXPECT_TRUE(ok); | 401 EXPECT_TRUE(ok); |
| 391 EXPECT_EQ(file_size, total_bytes_written); | 402 EXPECT_EQ(file_size, total_bytes_written); |
| 392 } | 403 } |
| 393 | 404 |
| 394 TEST_F(FileStreamTest, AsyncWrite_EarlyClose) { | 405 TEST_F(FileStreamTest, AsyncWrite_EarlyClose) { |
| 395 FileStream stream(NULL); | 406 FileStream stream(NULL); |
| 396 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | | 407 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | |
| 397 base::PLATFORM_FILE_WRITE | | 408 base::PLATFORM_FILE_WRITE | |
| 398 base::PLATFORM_FILE_ASYNC; | 409 base::PLATFORM_FILE_ASYNC; |
| 399 int rv = stream.OpenSync(temp_file_path(), flags); | 410 int rv = stream.OpenSync(temp_file_path(), flags); |
| 400 EXPECT_EQ(OK, rv); | 411 EXPECT_EQ(OK, rv); |
| 401 | 412 |
| 402 int64 file_size; | 413 int64 file_size; |
| 403 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 414 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 404 EXPECT_TRUE(ok); | 415 EXPECT_TRUE(ok); |
| 405 EXPECT_EQ(0, file_size); | 416 EXPECT_EQ(0, file_size); |
| 406 | 417 |
| 407 TestCompletionCallback callback; | 418 TestCompletionCallback callback; |
| 408 int total_bytes_written = 0; | |
| 409 | 419 |
| 410 rv = stream.Write(kTestData + total_bytes_written, | 420 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 411 kTestDataSize - total_bytes_written, | 421 rv = stream.Write(buf, buf->size(), callback.callback()); |
| 412 callback.callback()); | |
| 413 stream.CloseSync(); | 422 stream.CloseSync(); |
| 414 if (rv < 0) { | 423 if (rv < 0) { |
| 415 EXPECT_EQ(ERR_IO_PENDING, rv); | 424 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 416 // The callback should not be called if the request is cancelled. | 425 // The callback should not be called if the request is cancelled. |
| 417 MessageLoop::current()->RunAllPending(); | 426 MessageLoop::current()->RunAllPending(); |
| 418 EXPECT_FALSE(callback.have_result()); | 427 EXPECT_FALSE(callback.have_result()); |
| 419 } else { | 428 } else { |
| 420 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 429 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 421 EXPECT_TRUE(ok); | 430 EXPECT_TRUE(ok); |
| 422 EXPECT_EQ(file_size, rv); | 431 EXPECT_EQ(file_size, rv); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 int rv = stream.OpenSync(temp_file_path(), flags); | 469 int rv = stream.OpenSync(temp_file_path(), flags); |
| 461 EXPECT_EQ(OK, rv); | 470 EXPECT_EQ(OK, rv); |
| 462 | 471 |
| 463 const int64 kOffset = 0; | 472 const int64 kOffset = 0; |
| 464 int64 new_offset = stream.Seek(FROM_END, kOffset); | 473 int64 new_offset = stream.Seek(FROM_END, kOffset); |
| 465 EXPECT_EQ(kTestDataSize, new_offset); | 474 EXPECT_EQ(kTestDataSize, new_offset); |
| 466 | 475 |
| 467 TestCompletionCallback callback; | 476 TestCompletionCallback callback; |
| 468 int total_bytes_written = 0; | 477 int total_bytes_written = 0; |
| 469 | 478 |
| 479 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 480 scoped_refptr<DrainableIOBuffer> drainable = |
| 481 new DrainableIOBuffer(buf, buf->size()); |
| 470 while (total_bytes_written != kTestDataSize) { | 482 while (total_bytes_written != kTestDataSize) { |
| 471 rv = stream.Write(kTestData + total_bytes_written, | 483 rv = stream.Write(drainable, drainable->BytesRemaining(), |
| 472 kTestDataSize - total_bytes_written, | |
| 473 callback.callback()); | 484 callback.callback()); |
| 474 if (rv == ERR_IO_PENDING) | 485 if (rv == ERR_IO_PENDING) |
| 475 rv = callback.WaitForResult(); | 486 rv = callback.WaitForResult(); |
| 476 EXPECT_LT(0, rv); | 487 EXPECT_LT(0, rv); |
| 477 if (rv <= 0) | 488 if (rv <= 0) |
| 478 break; | 489 break; |
| 490 drainable->DidConsume(rv); |
| 479 total_bytes_written += rv; | 491 total_bytes_written += rv; |
| 480 } | 492 } |
| 481 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 493 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 482 EXPECT_TRUE(ok); | 494 EXPECT_TRUE(ok); |
| 483 EXPECT_EQ(file_size, kTestDataSize * 2); | 495 EXPECT_EQ(file_size, kTestDataSize * 2); |
| 484 } | 496 } |
| 485 | 497 |
| 486 TEST_F(FileStreamTest, BasicReadWrite) { | 498 TEST_F(FileStreamTest, BasicReadWrite) { |
| 487 int64 file_size; | 499 int64 file_size; |
| 488 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 500 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 EXPECT_EQ(OK, rv); | 596 EXPECT_EQ(OK, rv); |
| 585 | 597 |
| 586 int64 total_bytes_avail = stream.Available(); | 598 int64 total_bytes_avail = stream.Available(); |
| 587 EXPECT_EQ(file_size, total_bytes_avail); | 599 EXPECT_EQ(file_size, total_bytes_avail); |
| 588 | 600 |
| 589 TestCompletionCallback callback; | 601 TestCompletionCallback callback; |
| 590 int64 total_bytes_read = 0; | 602 int64 total_bytes_read = 0; |
| 591 | 603 |
| 592 std::string data_read; | 604 std::string data_read; |
| 593 for (;;) { | 605 for (;;) { |
| 594 char buf[4]; | 606 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 595 rv = stream.Read(buf, arraysize(buf), callback.callback()); | 607 rv = stream.Read(buf, buf->size(), callback.callback()); |
| 596 if (rv == ERR_IO_PENDING) | 608 if (rv == ERR_IO_PENDING) |
| 597 rv = callback.WaitForResult(); | 609 rv = callback.WaitForResult(); |
| 598 EXPECT_LE(0, rv); | 610 EXPECT_LE(0, rv); |
| 599 if (rv <= 0) | 611 if (rv <= 0) |
| 600 break; | 612 break; |
| 601 total_bytes_read += rv; | 613 total_bytes_read += rv; |
| 602 data_read.append(buf, rv); | 614 data_read.append(buf->data(), rv); |
| 603 } | 615 } |
| 604 EXPECT_EQ(file_size, total_bytes_read); | 616 EXPECT_EQ(file_size, total_bytes_read); |
| 605 EXPECT_TRUE(data_read == kTestData); | 617 EXPECT_TRUE(data_read == kTestData); |
| 606 | 618 |
| 607 int total_bytes_written = 0; | 619 int total_bytes_written = 0; |
| 608 | 620 |
| 621 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 622 scoped_refptr<DrainableIOBuffer> drainable = |
| 623 new DrainableIOBuffer(buf, buf->size()); |
| 609 while (total_bytes_written != kTestDataSize) { | 624 while (total_bytes_written != kTestDataSize) { |
| 610 rv = stream.Write(kTestData + total_bytes_written, | 625 rv = stream.Write(drainable, drainable->BytesRemaining(), |
| 611 kTestDataSize - total_bytes_written, | |
| 612 callback.callback()); | 626 callback.callback()); |
| 613 if (rv == ERR_IO_PENDING) | 627 if (rv == ERR_IO_PENDING) |
| 614 rv = callback.WaitForResult(); | 628 rv = callback.WaitForResult(); |
| 615 EXPECT_LT(0, rv); | 629 EXPECT_LT(0, rv); |
| 616 if (rv <= 0) | 630 if (rv <= 0) |
| 617 break; | 631 break; |
| 632 drainable->DidConsume(rv); |
| 618 total_bytes_written += rv; | 633 total_bytes_written += rv; |
| 619 } | 634 } |
| 620 | 635 |
| 621 stream.CloseSync(); | 636 stream.CloseSync(); |
| 622 | 637 |
| 623 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 638 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 624 EXPECT_TRUE(ok); | 639 EXPECT_TRUE(ok); |
| 625 EXPECT_EQ(kTestDataSize * 2, file_size); | 640 EXPECT_EQ(kTestDataSize * 2, file_size); |
| 626 } | 641 } |
| 627 | 642 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 640 | 655 |
| 641 int64 total_bytes_avail = stream.Available(); | 656 int64 total_bytes_avail = stream.Available(); |
| 642 EXPECT_EQ(file_size, total_bytes_avail); | 657 EXPECT_EQ(file_size, total_bytes_avail); |
| 643 | 658 |
| 644 int64 offset = stream.Seek(FROM_END, 0); | 659 int64 offset = stream.Seek(FROM_END, 0); |
| 645 EXPECT_EQ(offset, file_size); | 660 EXPECT_EQ(offset, file_size); |
| 646 | 661 |
| 647 TestCompletionCallback callback; | 662 TestCompletionCallback callback; |
| 648 int total_bytes_written = 0; | 663 int total_bytes_written = 0; |
| 649 | 664 |
| 665 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 666 scoped_refptr<DrainableIOBuffer> drainable = |
| 667 new DrainableIOBuffer(buf, buf->size()); |
| 650 while (total_bytes_written != kTestDataSize) { | 668 while (total_bytes_written != kTestDataSize) { |
| 651 rv = stream.Write(kTestData + total_bytes_written, | 669 rv = stream.Write(drainable, drainable->BytesRemaining(), |
| 652 kTestDataSize - total_bytes_written, | |
| 653 callback.callback()); | 670 callback.callback()); |
| 654 if (rv == ERR_IO_PENDING) | 671 if (rv == ERR_IO_PENDING) |
| 655 rv = callback.WaitForResult(); | 672 rv = callback.WaitForResult(); |
| 656 EXPECT_LT(0, rv); | 673 EXPECT_LT(0, rv); |
| 657 if (rv <= 0) | 674 if (rv <= 0) |
| 658 break; | 675 break; |
| 676 drainable->DidConsume(rv); |
| 659 total_bytes_written += rv; | 677 total_bytes_written += rv; |
| 660 } | 678 } |
| 661 | 679 |
| 662 EXPECT_EQ(kTestDataSize, total_bytes_written); | 680 EXPECT_EQ(kTestDataSize, total_bytes_written); |
| 663 | 681 |
| 664 offset = stream.Seek(FROM_BEGIN, 0); | 682 offset = stream.Seek(FROM_BEGIN, 0); |
| 665 EXPECT_EQ(0, offset); | 683 EXPECT_EQ(0, offset); |
| 666 | 684 |
| 667 int total_bytes_read = 0; | 685 int total_bytes_read = 0; |
| 668 | 686 |
| 669 std::string data_read; | 687 std::string data_read; |
| 670 for (;;) { | 688 for (;;) { |
| 671 char buf[4]; | 689 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 672 rv = stream.Read(buf, arraysize(buf), callback.callback()); | 690 rv = stream.Read(buf, buf->size(), callback.callback()); |
| 673 if (rv == ERR_IO_PENDING) | 691 if (rv == ERR_IO_PENDING) |
| 674 rv = callback.WaitForResult(); | 692 rv = callback.WaitForResult(); |
| 675 EXPECT_LE(0, rv); | 693 EXPECT_LE(0, rv); |
| 676 if (rv <= 0) | 694 if (rv <= 0) |
| 677 break; | 695 break; |
| 678 total_bytes_read += rv; | 696 total_bytes_read += rv; |
| 679 data_read.append(buf, rv); | 697 data_read.append(buf->data(), rv); |
| 680 } | 698 } |
| 681 stream.CloseSync(); | 699 stream.CloseSync(); |
| 682 | 700 |
| 683 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 701 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 684 EXPECT_TRUE(ok); | 702 EXPECT_TRUE(ok); |
| 685 EXPECT_EQ(kTestDataSize * 2, file_size); | 703 EXPECT_EQ(kTestDataSize * 2, file_size); |
| 686 | 704 |
| 687 EXPECT_EQ(kTestDataSize * 2, total_bytes_read); | 705 EXPECT_EQ(kTestDataSize * 2, total_bytes_read); |
| 688 const std::string kExpectedFileData = | 706 const std::string kExpectedFileData = |
| 689 std::string(kTestData) + std::string(kTestData); | 707 std::string(kTestData) + std::string(kTestData); |
| 690 EXPECT_EQ(kExpectedFileData, data_read); | 708 EXPECT_EQ(kExpectedFileData, data_read); |
| 691 } | 709 } |
| 692 | 710 |
| 693 class TestWriteReadCompletionCallback { | 711 class TestWriteReadCompletionCallback { |
| 694 public: | 712 public: |
| 695 TestWriteReadCompletionCallback( | 713 TestWriteReadCompletionCallback( |
| 696 FileStream* stream, | 714 FileStream* stream, |
| 697 int* total_bytes_written, | 715 int* total_bytes_written, |
| 698 int* total_bytes_read, | 716 int* total_bytes_read, |
| 699 std::string* data_read) | 717 std::string* data_read) |
| 700 : result_(0), | 718 : result_(0), |
| 701 have_result_(false), | 719 have_result_(false), |
| 702 waiting_for_result_(false), | 720 waiting_for_result_(false), |
| 703 stream_(stream), | 721 stream_(stream), |
| 704 total_bytes_written_(total_bytes_written), | 722 total_bytes_written_(total_bytes_written), |
| 705 total_bytes_read_(total_bytes_read), | 723 total_bytes_read_(total_bytes_read), |
| 706 data_read_(data_read), | 724 data_read_(data_read), |
| 707 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete, | 725 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete, |
| 708 base::Unretained(this))) {} | 726 base::Unretained(this))), |
| 727 test_data_(CreateTestDataBuffer()), |
| 728 drainable_(new DrainableIOBuffer(test_data_, kTestDataSize)) { |
| 729 } |
| 709 | 730 |
| 710 int WaitForResult() { | 731 int WaitForResult() { |
| 711 DCHECK(!waiting_for_result_); | 732 DCHECK(!waiting_for_result_); |
| 712 while (!have_result_) { | 733 while (!have_result_) { |
| 713 waiting_for_result_ = true; | 734 waiting_for_result_ = true; |
| 714 MessageLoop::current()->Run(); | 735 MessageLoop::current()->Run(); |
| 715 waiting_for_result_ = false; | 736 waiting_for_result_ = false; |
| 716 } | 737 } |
| 717 have_result_ = false; // auto-reset for next callback | 738 have_result_ = false; // auto-reset for next callback |
| 718 return result_; | 739 return result_; |
| 719 } | 740 } |
| 720 | 741 |
| 721 const CompletionCallback& callback() const { return callback_; } | 742 const CompletionCallback& callback() const { return callback_; } |
| 722 | 743 |
| 723 private: | 744 private: |
| 724 void OnComplete(int result) { | 745 void OnComplete(int result) { |
| 725 DCHECK_LT(0, result); | 746 DCHECK_LT(0, result); |
| 726 *total_bytes_written_ += result; | 747 *total_bytes_written_ += result; |
| 727 | 748 |
| 728 int rv; | 749 int rv; |
| 729 | 750 |
| 730 if (*total_bytes_written_ != kTestDataSize) { | 751 if (*total_bytes_written_ != kTestDataSize) { |
| 731 // Recurse to finish writing all data. | 752 // Recurse to finish writing all data. |
| 732 int total_bytes_written = 0, total_bytes_read = 0; | 753 int total_bytes_written = 0, total_bytes_read = 0; |
| 733 std::string data_read; | 754 std::string data_read; |
| 734 TestWriteReadCompletionCallback callback( | 755 TestWriteReadCompletionCallback callback( |
| 735 stream_, &total_bytes_written, &total_bytes_read, &data_read); | 756 stream_, &total_bytes_written, &total_bytes_read, &data_read); |
| 736 rv = stream_->Write(kTestData + *total_bytes_written_, | 757 rv = stream_->Write(drainable_, drainable_->BytesRemaining(), |
| 737 kTestDataSize - *total_bytes_written_, | |
| 738 callback.callback()); | 758 callback.callback()); |
| 739 DCHECK_EQ(ERR_IO_PENDING, rv); | 759 DCHECK_EQ(ERR_IO_PENDING, rv); |
| 740 rv = callback.WaitForResult(); | 760 rv = callback.WaitForResult(); |
| 761 drainable_->DidConsume(total_bytes_written); |
| 741 *total_bytes_written_ += total_bytes_written; | 762 *total_bytes_written_ += total_bytes_written; |
| 742 *total_bytes_read_ += total_bytes_read; | 763 *total_bytes_read_ += total_bytes_read; |
| 743 *data_read_ += data_read; | 764 *data_read_ += data_read; |
| 744 } else { // We're done writing all data. Start reading the data. | 765 } else { // We're done writing all data. Start reading the data. |
| 745 stream_->Seek(FROM_BEGIN, 0); | 766 stream_->Seek(FROM_BEGIN, 0); |
| 746 | 767 |
| 747 TestCompletionCallback callback; | 768 TestCompletionCallback callback; |
| 748 for (;;) { | 769 for (;;) { |
| 749 char buf[4]; | 770 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
| 750 rv = stream_->Read(buf, arraysize(buf), callback.callback()); | 771 rv = stream_->Read(buf, buf->size(), callback.callback()); |
| 751 if (rv == ERR_IO_PENDING) { | 772 if (rv == ERR_IO_PENDING) { |
| 752 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); | 773 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 753 rv = callback.WaitForResult(); | 774 rv = callback.WaitForResult(); |
| 754 } | 775 } |
| 755 EXPECT_LE(0, rv); | 776 EXPECT_LE(0, rv); |
| 756 if (rv <= 0) | 777 if (rv <= 0) |
| 757 break; | 778 break; |
| 758 *total_bytes_read_ += rv; | 779 *total_bytes_read_ += rv; |
| 759 data_read_->append(buf, rv); | 780 data_read_->append(buf->data(), rv); |
| 760 } | 781 } |
| 761 } | 782 } |
| 762 | 783 |
| 763 result_ = *total_bytes_written_; | 784 result_ = *total_bytes_written_; |
| 764 have_result_ = true; | 785 have_result_ = true; |
| 765 if (waiting_for_result_) | 786 if (waiting_for_result_) |
| 766 MessageLoop::current()->Quit(); | 787 MessageLoop::current()->Quit(); |
| 767 } | 788 } |
| 768 | 789 |
| 769 int result_; | 790 int result_; |
| 770 bool have_result_; | 791 bool have_result_; |
| 771 bool waiting_for_result_; | 792 bool waiting_for_result_; |
| 772 FileStream* stream_; | 793 FileStream* stream_; |
| 773 int* total_bytes_written_; | 794 int* total_bytes_written_; |
| 774 int* total_bytes_read_; | 795 int* total_bytes_read_; |
| 775 std::string* data_read_; | 796 std::string* data_read_; |
| 776 const CompletionCallback callback_; | 797 const CompletionCallback callback_; |
| 798 scoped_refptr<IOBufferWithSize> test_data_; |
| 799 scoped_refptr<DrainableIOBuffer> drainable_; |
| 777 | 800 |
| 778 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback); | 801 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback); |
| 779 }; | 802 }; |
| 780 | 803 |
| 781 TEST_F(FileStreamTest, AsyncWriteRead) { | 804 TEST_F(FileStreamTest, AsyncWriteRead) { |
| 782 int64 file_size; | 805 int64 file_size; |
| 783 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 806 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 784 EXPECT_TRUE(ok); | 807 EXPECT_TRUE(ok); |
| 785 | 808 |
| 786 FileStream stream(NULL); | 809 FileStream stream(NULL); |
| 787 int flags = base::PLATFORM_FILE_OPEN | | 810 int flags = base::PLATFORM_FILE_OPEN | |
| 788 base::PLATFORM_FILE_READ | | 811 base::PLATFORM_FILE_READ | |
| 789 base::PLATFORM_FILE_WRITE | | 812 base::PLATFORM_FILE_WRITE | |
| 790 base::PLATFORM_FILE_ASYNC; | 813 base::PLATFORM_FILE_ASYNC; |
| 791 int rv = stream.OpenSync(temp_file_path(), flags); | 814 int rv = stream.OpenSync(temp_file_path(), flags); |
| 792 EXPECT_EQ(OK, rv); | 815 EXPECT_EQ(OK, rv); |
| 793 | 816 |
| 794 int64 total_bytes_avail = stream.Available(); | 817 int64 total_bytes_avail = stream.Available(); |
| 795 EXPECT_EQ(file_size, total_bytes_avail); | 818 EXPECT_EQ(file_size, total_bytes_avail); |
| 796 | 819 |
| 797 int64 offset = stream.Seek(FROM_END, 0); | 820 int64 offset = stream.Seek(FROM_END, 0); |
| 798 EXPECT_EQ(offset, file_size); | 821 EXPECT_EQ(offset, file_size); |
| 799 | 822 |
| 800 int total_bytes_written = 0; | 823 int total_bytes_written = 0; |
| 801 int total_bytes_read = 0; | 824 int total_bytes_read = 0; |
| 802 std::string data_read; | 825 std::string data_read; |
| 803 TestWriteReadCompletionCallback callback(&stream, &total_bytes_written, | 826 TestWriteReadCompletionCallback callback(&stream, &total_bytes_written, |
| 804 &total_bytes_read, &data_read); | 827 &total_bytes_read, &data_read); |
| 805 | 828 |
| 806 rv = stream.Write(kTestData + total_bytes_written, | 829 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 807 kTestDataSize - static_cast<int>(total_bytes_written), | 830 rv = stream.Write(buf, buf->size(), callback.callback()); |
| 808 callback.callback()); | |
| 809 if (rv == ERR_IO_PENDING) | 831 if (rv == ERR_IO_PENDING) |
| 810 rv = callback.WaitForResult(); | 832 rv = callback.WaitForResult(); |
| 811 EXPECT_LT(0, rv); | 833 EXPECT_LT(0, rv); |
| 812 EXPECT_EQ(kTestDataSize, total_bytes_written); | 834 EXPECT_EQ(kTestDataSize, total_bytes_written); |
| 813 | 835 |
| 814 stream.CloseSync(); | 836 stream.CloseSync(); |
| 815 | 837 |
| 816 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 838 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 817 EXPECT_TRUE(ok); | 839 EXPECT_TRUE(ok); |
| 818 EXPECT_EQ(kTestDataSize * 2, file_size); | 840 EXPECT_EQ(kTestDataSize * 2, file_size); |
| 819 | 841 |
| 820 EXPECT_EQ(kTestDataSize * 2, total_bytes_read); | 842 EXPECT_EQ(kTestDataSize * 2, total_bytes_read); |
| 821 const std::string kExpectedFileData = | 843 const std::string kExpectedFileData = |
| 822 std::string(kTestData) + std::string(kTestData); | 844 std::string(kTestData) + std::string(kTestData); |
| 823 EXPECT_EQ(kExpectedFileData, data_read); | 845 EXPECT_EQ(kExpectedFileData, data_read); |
| 824 } | 846 } |
| 825 | 847 |
| 826 class TestWriteCloseCompletionCallback { | 848 class TestWriteCloseCompletionCallback { |
| 827 public: | 849 public: |
| 828 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written) | 850 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written) |
| 829 : result_(0), | 851 : result_(0), |
| 830 have_result_(false), | 852 have_result_(false), |
| 831 waiting_for_result_(false), | 853 waiting_for_result_(false), |
| 832 stream_(stream), | 854 stream_(stream), |
| 833 total_bytes_written_(total_bytes_written), | 855 total_bytes_written_(total_bytes_written), |
| 834 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete, | 856 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete, |
| 835 base::Unretained(this))) {} | 857 base::Unretained(this))), |
| 858 test_data_(CreateTestDataBuffer()), |
| 859 drainable_(new DrainableIOBuffer(test_data_, kTestDataSize)) { |
| 860 } |
| 836 | 861 |
| 837 int WaitForResult() { | 862 int WaitForResult() { |
| 838 DCHECK(!waiting_for_result_); | 863 DCHECK(!waiting_for_result_); |
| 839 while (!have_result_) { | 864 while (!have_result_) { |
| 840 waiting_for_result_ = true; | 865 waiting_for_result_ = true; |
| 841 MessageLoop::current()->Run(); | 866 MessageLoop::current()->Run(); |
| 842 waiting_for_result_ = false; | 867 waiting_for_result_ = false; |
| 843 } | 868 } |
| 844 have_result_ = false; // auto-reset for next callback | 869 have_result_ = false; // auto-reset for next callback |
| 845 return result_; | 870 return result_; |
| 846 } | 871 } |
| 847 | 872 |
| 848 const CompletionCallback& callback() const { return callback_; } | 873 const CompletionCallback& callback() const { return callback_; } |
| 849 | 874 |
| 850 private: | 875 private: |
| 851 void OnComplete(int result) { | 876 void OnComplete(int result) { |
| 852 DCHECK_LT(0, result); | 877 DCHECK_LT(0, result); |
| 853 *total_bytes_written_ += result; | 878 *total_bytes_written_ += result; |
| 854 | 879 |
| 855 int rv; | 880 int rv; |
| 856 | 881 |
| 857 if (*total_bytes_written_ != kTestDataSize) { | 882 if (*total_bytes_written_ != kTestDataSize) { |
| 858 // Recurse to finish writing all data. | 883 // Recurse to finish writing all data. |
| 859 int total_bytes_written = 0; | 884 int total_bytes_written = 0; |
| 860 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written); | 885 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written); |
| 861 rv = stream_->Write(kTestData + *total_bytes_written_, | 886 rv = stream_->Write(drainable_, drainable_->BytesRemaining(), |
| 862 kTestDataSize - *total_bytes_written_, | |
| 863 callback.callback()); | 887 callback.callback()); |
| 864 DCHECK_EQ(ERR_IO_PENDING, rv); | 888 DCHECK_EQ(ERR_IO_PENDING, rv); |
| 865 rv = callback.WaitForResult(); | 889 rv = callback.WaitForResult(); |
| 890 drainable_->DidConsume(total_bytes_written); |
| 866 *total_bytes_written_ += total_bytes_written; | 891 *total_bytes_written_ += total_bytes_written; |
| 867 } else { // We're done writing all data. Close the file. | 892 } else { // We're done writing all data. Close the file. |
| 868 stream_->CloseSync(); | 893 stream_->CloseSync(); |
| 869 } | 894 } |
| 870 | 895 |
| 871 result_ = *total_bytes_written_; | 896 result_ = *total_bytes_written_; |
| 872 have_result_ = true; | 897 have_result_ = true; |
| 873 if (waiting_for_result_) | 898 if (waiting_for_result_) |
| 874 MessageLoop::current()->Quit(); | 899 MessageLoop::current()->Quit(); |
| 875 } | 900 } |
| 876 | 901 |
| 877 int result_; | 902 int result_; |
| 878 bool have_result_; | 903 bool have_result_; |
| 879 bool waiting_for_result_; | 904 bool waiting_for_result_; |
| 880 FileStream* stream_; | 905 FileStream* stream_; |
| 881 int* total_bytes_written_; | 906 int* total_bytes_written_; |
| 882 const CompletionCallback callback_; | 907 const CompletionCallback callback_; |
| 908 scoped_refptr<IOBufferWithSize> test_data_; |
| 909 scoped_refptr<DrainableIOBuffer> drainable_; |
| 883 | 910 |
| 884 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback); | 911 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback); |
| 885 }; | 912 }; |
| 886 | 913 |
| 887 TEST_F(FileStreamTest, AsyncWriteClose) { | 914 TEST_F(FileStreamTest, AsyncWriteClose) { |
| 888 int64 file_size; | 915 int64 file_size; |
| 889 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 916 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 890 EXPECT_TRUE(ok); | 917 EXPECT_TRUE(ok); |
| 891 | 918 |
| 892 FileStream stream(NULL); | 919 FileStream stream(NULL); |
| 893 int flags = base::PLATFORM_FILE_OPEN | | 920 int flags = base::PLATFORM_FILE_OPEN | |
| 894 base::PLATFORM_FILE_READ | | 921 base::PLATFORM_FILE_READ | |
| 895 base::PLATFORM_FILE_WRITE | | 922 base::PLATFORM_FILE_WRITE | |
| 896 base::PLATFORM_FILE_ASYNC; | 923 base::PLATFORM_FILE_ASYNC; |
| 897 int rv = stream.OpenSync(temp_file_path(), flags); | 924 int rv = stream.OpenSync(temp_file_path(), flags); |
| 898 EXPECT_EQ(OK, rv); | 925 EXPECT_EQ(OK, rv); |
| 899 | 926 |
| 900 int64 total_bytes_avail = stream.Available(); | 927 int64 total_bytes_avail = stream.Available(); |
| 901 EXPECT_EQ(file_size, total_bytes_avail); | 928 EXPECT_EQ(file_size, total_bytes_avail); |
| 902 | 929 |
| 903 int64 offset = stream.Seek(FROM_END, 0); | 930 int64 offset = stream.Seek(FROM_END, 0); |
| 904 EXPECT_EQ(offset, file_size); | 931 EXPECT_EQ(offset, file_size); |
| 905 | 932 |
| 906 int total_bytes_written = 0; | 933 int total_bytes_written = 0; |
| 907 TestWriteCloseCompletionCallback callback(&stream, &total_bytes_written); | 934 TestWriteCloseCompletionCallback callback(&stream, &total_bytes_written); |
| 908 | 935 |
| 909 rv = stream.Write(kTestData, kTestDataSize, callback.callback()); | 936 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
| 937 rv = stream.Write(buf, buf->size(), callback.callback()); |
| 910 if (rv == ERR_IO_PENDING) | 938 if (rv == ERR_IO_PENDING) |
| 911 total_bytes_written = callback.WaitForResult(); | 939 total_bytes_written = callback.WaitForResult(); |
| 912 EXPECT_LT(0, total_bytes_written); | 940 EXPECT_LT(0, total_bytes_written); |
| 913 EXPECT_EQ(kTestDataSize, total_bytes_written); | 941 EXPECT_EQ(kTestDataSize, total_bytes_written); |
| 914 | 942 |
| 915 ok = file_util::GetFileSize(temp_file_path(), &file_size); | 943 ok = file_util::GetFileSize(temp_file_path(), &file_size); |
| 916 EXPECT_TRUE(ok); | 944 EXPECT_TRUE(ok); |
| 917 EXPECT_EQ(kTestDataSize * 2, file_size); | 945 EXPECT_EQ(kTestDataSize * 2, file_size); |
| 918 } | 946 } |
| 919 | 947 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 940 // Read in the contents and make sure we get back what we expected. | 968 // Read in the contents and make sure we get back what we expected. |
| 941 std::string read_contents; | 969 std::string read_contents; |
| 942 EXPECT_TRUE(file_util::ReadFileToString(temp_file_path(), &read_contents)); | 970 EXPECT_TRUE(file_util::ReadFileToString(temp_file_path(), &read_contents)); |
| 943 | 971 |
| 944 EXPECT_EQ("01230123", read_contents); | 972 EXPECT_EQ("01230123", read_contents); |
| 945 } | 973 } |
| 946 | 974 |
| 947 } // namespace | 975 } // namespace |
| 948 | 976 |
| 949 } // namespace net | 977 } // namespace net |
| OLD | NEW |