Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(289)

Side by Side Diff: net/base/file_stream_unittest.cc

Issue 9402014: net: FileStream::Read/Write() to take IOBuffer* instead of char* (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix redirect_to_file_resource_handler.cc Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/file_stream_posix.cc ('k') | net/base/file_stream_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/base/file_stream_posix.cc ('k') | net/base/file_stream_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698