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

Side by Side Diff: net/disk_cache/entry_unittest.cc

Issue 23983005: SimpleCache: merge the first and second stream in one file (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Switched to GrowableIOBuffer Created 7 years, 3 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
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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 2409 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 if (CreateEntry(key, &entry) != net::OK || !entry) { 2420 if (CreateEntry(key, &entry) != net::OK || !entry) {
2421 LOG(ERROR) << "Could not create entry"; 2421 LOG(ERROR) << "Could not create entry";
2422 return false; 2422 return false;
2423 } 2423 }
2424 2424
2425 const char data[] = "this is very good data"; 2425 const char data[] = "this is very good data";
2426 const int kDataSize = arraysize(data); 2426 const int kDataSize = arraysize(data);
2427 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kDataSize)); 2427 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kDataSize));
2428 base::strlcpy(buffer->data(), data, kDataSize); 2428 base::strlcpy(buffer->data(), data, kDataSize);
2429 2429
2430 EXPECT_EQ(kDataSize, WriteData(entry, 0, 0, buffer.get(), kDataSize, false)); 2430 EXPECT_EQ(kDataSize, WriteData(entry, 1, 0, buffer.get(), kDataSize, false));
2431 entry->Close(); 2431 entry->Close();
2432 entry = NULL; 2432 entry = NULL;
2433 2433
2434 // Corrupt the last byte of the data. 2434 // Corrupt the last byte of the data.
2435 base::FilePath entry_file0_path = cache_path_.AppendASCII( 2435 base::FilePath entry_file0_path = cache_path_.AppendASCII(
2436 disk_cache::simple_util::GetFilenameFromKeyAndIndex(key, 0)); 2436 disk_cache::simple_util::GetFilenameFromKeyAndIndex(key, 0));
2437 int flags = base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_OPEN; 2437 int flags = base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_OPEN;
2438 base::PlatformFile entry_file0 = 2438 base::PlatformFile entry_file0 =
2439 base::CreatePlatformFile(entry_file0_path, flags, NULL, NULL); 2439 base::CreatePlatformFile(entry_file0_path, flags, NULL, NULL);
2440 if (entry_file0 == base::kInvalidPlatformFileValue) 2440 if (entry_file0 == base::kInvalidPlatformFileValue)
2441 return false; 2441 return false;
2442 int64 file_offset = 2442 int64 file_offset = disk_cache::simple_util::GetFileOffsetFromDataOffset(
2443 disk_cache::simple_util::GetFileOffsetFromKeyAndDataOffset( 2443 key, kDataSize - 2, 1, 0);
2444 key, kDataSize - 2);
2445 EXPECT_EQ(1, base::WritePlatformFile(entry_file0, file_offset, "X", 1)); 2444 EXPECT_EQ(1, base::WritePlatformFile(entry_file0, file_offset, "X", 1));
2446 if (!base::ClosePlatformFile(entry_file0)) 2445 if (!base::ClosePlatformFile(entry_file0))
2447 return false; 2446 return false;
2448 *data_size = kDataSize; 2447 *data_size = kDataSize;
2449 return true; 2448 return true;
2450 } 2449 }
2451 2450
2452 // Tests that the simple cache can detect entries that have bad data. 2451 // Tests that the simple cache can detect entries that have bad data.
2453 TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { 2452 TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) {
2454 SetSimpleCacheMode(); 2453 SetSimpleCacheMode();
2455 InitCache(); 2454 InitCache();
2456 2455
2457 const char key[] = "the first key"; 2456 const char key[] = "the first key";
2458 int size_unused; 2457 int size_unused;
2459 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused)); 2458 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused));
2460 2459
2461 disk_cache::Entry* entry = NULL; 2460 disk_cache::Entry* entry = NULL;
2462 2461
2463 // Open the entry. 2462 // Open the entry.
2464 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 2463 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
2465 ScopedEntryPtr entry_closer(entry); 2464 ScopedEntryPtr entry_closer(entry);
2466 2465
2467 const int kReadBufferSize = 200; 2466 const int kReadBufferSize = 200;
2468 EXPECT_GE(kReadBufferSize, entry->GetDataSize(0)); 2467 EXPECT_GE(kReadBufferSize, entry->GetDataSize(1));
2469 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); 2468 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
2470 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, 2469 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH,
2471 ReadData(entry, 0, 0, read_buffer.get(), kReadBufferSize)); 2470 ReadData(entry, 1, 0, read_buffer.get(), kReadBufferSize));
2472 } 2471 }
2473 2472
2474 // Tests that an entry that has had an IO error occur can still be Doomed(). 2473 // Tests that an entry that has had an IO error occur can still be Doomed().
2475 TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) { 2474 TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) {
2476 SetSimpleCacheMode(); 2475 SetSimpleCacheMode();
2477 InitCache(); 2476 InitCache();
2478 2477
2479 const char key[] = "the first key"; 2478 const char key[] = "the first key";
2480 int size_unused; 2479 int size_unused;
2481 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused)); 2480 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused));
2482 2481
2483 disk_cache::Entry* entry = NULL; 2482 disk_cache::Entry* entry = NULL;
2484 2483
2485 // Open the entry, forcing an IO error. 2484 // Open the entry, forcing an IO error.
2486 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 2485 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
2487 ScopedEntryPtr entry_closer(entry); 2486 ScopedEntryPtr entry_closer(entry);
2488 2487
2489 const int kReadBufferSize = 200; 2488 const int kReadBufferSize = 200;
2490 EXPECT_GE(kReadBufferSize, entry->GetDataSize(0)); 2489 EXPECT_GE(kReadBufferSize, entry->GetDataSize(1));
2491 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); 2490 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
2492 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, 2491 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH,
2493 ReadData(entry, 0, 0, read_buffer.get(), kReadBufferSize)); 2492 ReadData(entry, 1, 0, read_buffer.get(), kReadBufferSize));
2494 2493
2495 entry->Doom(); // Should not crash. 2494 entry->Doom(); // Should not crash.
2496 } 2495 }
2497 2496
2498 bool TruncatePath(const base::FilePath& file_path, int64 length) { 2497 bool TruncatePath(const base::FilePath& file_path, int64 length) {
2499 const int flags = base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_OPEN; 2498 const int flags = base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_OPEN;
2500 base::PlatformFile file = 2499 base::PlatformFile file =
2501 base::CreatePlatformFile(file_path, flags, NULL, NULL); 2500 base::CreatePlatformFile(file_path, flags, NULL, NULL);
2502 if (base::kInvalidPlatformFileValue == file) 2501 if (base::kInvalidPlatformFileValue == file)
2503 return false; 2502 return false;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); 2549 EXPECT_EQ(net::OK, CreateEntry("my key", &entry));
2551 ASSERT_NE(null_entry, entry); 2550 ASSERT_NE(null_entry, entry);
2552 ScopedEntryPtr entry_closer(entry); 2551 ScopedEntryPtr entry_closer(entry);
2553 2552
2554 const int kBufferSize = 10; 2553 const int kBufferSize = 10;
2555 scoped_refptr<net::IOBufferWithSize> write_buffer( 2554 scoped_refptr<net::IOBufferWithSize> write_buffer(
2556 new net::IOBufferWithSize(kBufferSize)); 2555 new net::IOBufferWithSize(kBufferSize));
2557 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); 2556 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false);
2558 EXPECT_EQ( 2557 EXPECT_EQ(
2559 write_buffer->size(), 2558 write_buffer->size(),
2560 WriteData(entry, 0, 0, write_buffer.get(), write_buffer->size(), false)); 2559 WriteData(entry, 1, 0, write_buffer.get(), write_buffer->size(), false));
2561 2560
2562 scoped_refptr<net::IOBufferWithSize> read_buffer( 2561 scoped_refptr<net::IOBufferWithSize> read_buffer(
2563 new net::IOBufferWithSize(kBufferSize)); 2562 new net::IOBufferWithSize(kBufferSize));
2564 EXPECT_EQ( 2563 EXPECT_EQ(
2565 read_buffer->size(), 2564 read_buffer->size(),
2566 ReadData(entry, 0, 0, read_buffer.get(), read_buffer->size())); 2565 ReadData(entry, 1, 0, read_buffer.get(), read_buffer->size()));
2567 } 2566 }
2568 2567
2569 TEST_F(DiskCacheEntryTest, SimpleCacheNonOptimisticOperationsDontBlock) { 2568 TEST_F(DiskCacheEntryTest, SimpleCacheNonOptimisticOperationsDontBlock) {
2570 // Test sequence: 2569 // Test sequence:
2571 // Create, Write, Close. 2570 // Create, Write, Close.
2572 SetCacheType(net::APP_CACHE); // APP_CACHE doesn't use optimistic operations. 2571 SetCacheType(net::APP_CACHE); // APP_CACHE doesn't use optimistic operations.
2573 SetSimpleCacheMode(); 2572 SetSimpleCacheMode();
2574 InitCache(); 2573 InitCache();
2575 disk_cache::Entry* const null_entry = NULL; 2574 disk_cache::Entry* const null_entry = NULL;
2576 2575
2577 MessageLoopHelper helper; 2576 MessageLoopHelper helper;
2578 CallbackTest create_callback(&helper, false); 2577 CallbackTest create_callback(&helper, false);
2579 2578
2580 int expected_callback_runs = 0; 2579 int expected_callback_runs = 0;
2581 const int kBufferSize = 10; 2580 const int kBufferSize = 10;
2582 scoped_refptr<net::IOBufferWithSize> write_buffer( 2581 scoped_refptr<net::IOBufferWithSize> write_buffer(
2583 new net::IOBufferWithSize(kBufferSize)); 2582 new net::IOBufferWithSize(kBufferSize));
2584 2583
2585 disk_cache::Entry* entry = NULL; 2584 disk_cache::Entry* entry = NULL;
2586 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); 2585 EXPECT_EQ(net::OK, CreateEntry("my key", &entry));
2587 ASSERT_NE(null_entry, entry); 2586 ASSERT_NE(null_entry, entry);
2588 ScopedEntryPtr entry_closer(entry); 2587 ScopedEntryPtr entry_closer(entry);
2589 2588
2590 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); 2589 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false);
2591 CallbackTest write_callback(&helper, false); 2590 CallbackTest write_callback(&helper, false);
2592 int ret = entry->WriteData( 2591 int ret = entry->WriteData(
2593 0, 2592 1,
2594 0, 2593 0,
2595 write_buffer.get(), 2594 write_buffer.get(),
2596 write_buffer->size(), 2595 write_buffer->size(),
2597 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), 2596 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)),
2598 false); 2597 false);
2599 ASSERT_EQ(net::ERR_IO_PENDING, ret); 2598 ASSERT_EQ(net::ERR_IO_PENDING, ret);
2600 helper.WaitUntilCacheIoFinished(++expected_callback_runs); 2599 helper.WaitUntilCacheIoFinished(++expected_callback_runs);
2601 } 2600 }
2602 2601
2603 TEST_F(DiskCacheEntryTest, 2602 TEST_F(DiskCacheEntryTest,
(...skipping 12 matching lines...) Expand all
2616 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); 2615 EXPECT_EQ(net::OK, CreateEntry("my key", &entry));
2617 ASSERT_NE(null_entry, entry); 2616 ASSERT_NE(null_entry, entry);
2618 ScopedEntryPtr entry_closer(entry); 2617 ScopedEntryPtr entry_closer(entry);
2619 2618
2620 const int kBufferSize = 10; 2619 const int kBufferSize = 10;
2621 scoped_refptr<net::IOBufferWithSize> write_buffer( 2620 scoped_refptr<net::IOBufferWithSize> write_buffer(
2622 new net::IOBufferWithSize(kBufferSize)); 2621 new net::IOBufferWithSize(kBufferSize));
2623 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); 2622 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false);
2624 CallbackTest write_callback(&helper, false); 2623 CallbackTest write_callback(&helper, false);
2625 int ret = entry->WriteData( 2624 int ret = entry->WriteData(
2626 0, 2625 1,
2627 0, 2626 0,
2628 write_buffer.get(), 2627 write_buffer.get(),
2629 write_buffer->size(), 2628 write_buffer->size(),
2630 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), 2629 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)),
2631 false); 2630 false);
2632 EXPECT_EQ(net::ERR_IO_PENDING, ret); 2631 EXPECT_EQ(net::ERR_IO_PENDING, ret);
2633 int expected_callback_runs = 1; 2632 int expected_callback_runs = 1;
2634 2633
2635 scoped_refptr<net::IOBufferWithSize> read_buffer( 2634 scoped_refptr<net::IOBufferWithSize> read_buffer(
2636 new net::IOBufferWithSize(kBufferSize)); 2635 new net::IOBufferWithSize(kBufferSize));
2637 CallbackTest read_callback(&helper, false); 2636 CallbackTest read_callback(&helper, false);
2638 ret = entry->ReadData( 2637 ret = entry->ReadData(
2639 0, 2638 1,
2640 0, 2639 0,
2641 read_buffer.get(), 2640 read_buffer.get(),
2642 read_buffer->size(), 2641 read_buffer->size(),
2643 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback))); 2642 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback)));
2644 EXPECT_EQ(net::ERR_IO_PENDING, ret); 2643 EXPECT_EQ(net::ERR_IO_PENDING, ret);
2645 ++expected_callback_runs; 2644 ++expected_callback_runs;
2646 2645
2647 helper.WaitUntilCacheIoFinished(expected_callback_runs); 2646 helper.WaitUntilCacheIoFinished(expected_callback_runs);
2648 ASSERT_EQ(read_buffer->size(), write_buffer->size()); 2647 ASSERT_EQ(read_buffer->size(), write_buffer->size());
2649 EXPECT_EQ( 2648 EXPECT_EQ(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 ASSERT_EQ(net::OK, 2680 ASSERT_EQ(net::OK,
2682 cache_->CreateEntry(key, &entry, 2681 cache_->CreateEntry(key, &entry,
2683 base::Bind(&CallbackTest::Run, 2682 base::Bind(&CallbackTest::Run,
2684 base::Unretained(&callback1)))); 2683 base::Unretained(&callback1))));
2685 EXPECT_NE(null, entry); 2684 EXPECT_NE(null, entry);
2686 ScopedEntryPtr entry_closer(entry); 2685 ScopedEntryPtr entry_closer(entry);
2687 2686
2688 // This write may or may not be optimistic (it depends if the previous 2687 // This write may or may not be optimistic (it depends if the previous
2689 // optimistic create already finished by the time we call the write here). 2688 // optimistic create already finished by the time we call the write here).
2690 int ret = entry->WriteData( 2689 int ret = entry->WriteData(
2691 0, 2690 1,
2692 0, 2691 0,
2693 buffer1.get(), 2692 buffer1.get(),
2694 kSize1, 2693 kSize1,
2695 base::Bind(&CallbackTest::Run, base::Unretained(&callback2)), 2694 base::Bind(&CallbackTest::Run, base::Unretained(&callback2)),
2696 false); 2695 false);
2697 EXPECT_TRUE(kSize1 == ret || net::ERR_IO_PENDING == ret); 2696 EXPECT_TRUE(kSize1 == ret || net::ERR_IO_PENDING == ret);
2698 if (net::ERR_IO_PENDING == ret) 2697 if (net::ERR_IO_PENDING == ret)
2699 expected++; 2698 expected++;
2700 2699
2701 // This Read must not be optimistic, since we don't support that yet. 2700 // This Read must not be optimistic, since we don't support that yet.
2702 EXPECT_EQ(net::ERR_IO_PENDING, 2701 EXPECT_EQ(net::ERR_IO_PENDING,
2703 entry->ReadData( 2702 entry->ReadData(
2704 0, 2703 1,
2705 0, 2704 0,
2706 buffer1_read.get(), 2705 buffer1_read.get(),
2707 kSize1, 2706 kSize1,
2708 base::Bind(&CallbackTest::Run, base::Unretained(&callback3)))); 2707 base::Bind(&CallbackTest::Run, base::Unretained(&callback3))));
2709 expected++; 2708 expected++;
2710 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 2709 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
2711 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1)); 2710 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
2712 2711
2713 // At this point after waiting, the pending operations queue on the entry 2712 // At this point after waiting, the pending operations queue on the entry
2714 // should be empty, so the next Write operation must run as optimistic. 2713 // should be empty, so the next Write operation must run as optimistic.
2715 EXPECT_EQ(kSize2, 2714 EXPECT_EQ(kSize2,
2716 entry->WriteData( 2715 entry->WriteData(
2717 0, 2716 1,
2718 0, 2717 0,
2719 buffer2.get(), 2718 buffer2.get(),
2720 kSize2, 2719 kSize2,
2721 base::Bind(&CallbackTest::Run, base::Unretained(&callback4)), 2720 base::Bind(&CallbackTest::Run, base::Unretained(&callback4)),
2722 false)); 2721 false));
2723 2722
2724 // Lets do another read so we block until both the write and the read 2723 // Lets do another read so we block until both the write and the read
2725 // operation finishes and we can then test for HasOneRef() below. 2724 // operation finishes and we can then test for HasOneRef() below.
2726 EXPECT_EQ(net::ERR_IO_PENDING, 2725 EXPECT_EQ(net::ERR_IO_PENDING,
2727 entry->ReadData( 2726 entry->ReadData(
2728 0, 2727 1,
2729 0, 2728 0,
2730 buffer2_read.get(), 2729 buffer2_read.get(),
2731 kSize2, 2730 kSize2,
2732 base::Bind(&CallbackTest::Run, base::Unretained(&callback5)))); 2731 base::Bind(&CallbackTest::Run, base::Unretained(&callback5))));
2733 expected++; 2732 expected++;
2734 2733
2735 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 2734 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
2736 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2_read->data(), kSize2)); 2735 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2_read->data(), kSize2));
2737 2736
2738 // Check that we are not leaking. 2737 // Check that we are not leaking.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2824 2823
2825 ASSERT_EQ(net::OK, 2824 ASSERT_EQ(net::OK,
2826 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2825 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2827 EXPECT_NE(null, entry); 2826 EXPECT_NE(null, entry);
2828 entry->Close(); 2827 entry->Close();
2829 2828
2830 // Lets do a Write so we block until both the Close and the Write 2829 // Lets do a Write so we block until both the Close and the Write
2831 // operation finishes. Write must fail since we are writing in a closed entry. 2830 // operation finishes. Write must fail since we are writing in a closed entry.
2832 EXPECT_EQ( 2831 EXPECT_EQ(
2833 net::ERR_IO_PENDING, 2832 net::ERR_IO_PENDING,
2834 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2833 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2835 EXPECT_EQ(net::ERR_FAILED, cb.GetResult(net::ERR_IO_PENDING)); 2834 EXPECT_EQ(net::ERR_FAILED, cb.GetResult(net::ERR_IO_PENDING));
2836 2835
2837 // Finish running the pending tasks so that we fully complete the close 2836 // Finish running the pending tasks so that we fully complete the close
2838 // operation and destroy the entry object. 2837 // operation and destroy the entry object.
2839 base::MessageLoop::current()->RunUntilIdle(); 2838 base::MessageLoop::current()->RunUntilIdle();
2840 2839
2841 // At this point the |entry| must have been destroyed, and called 2840 // At this point the |entry| must have been destroyed, and called
2842 // RemoveSelfFromBackend(). 2841 // RemoveSelfFromBackend().
2843 disk_cache::Entry* entry2 = NULL; 2842 disk_cache::Entry* entry2 = NULL;
2844 ASSERT_EQ(net::ERR_IO_PENDING, 2843 ASSERT_EQ(net::ERR_IO_PENDING,
2845 cache_->OpenEntry(key, &entry2, cb.callback())); 2844 cache_->OpenEntry(key, &entry2, cb.callback()));
2846 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING)); 2845 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING));
2847 EXPECT_NE(null, entry2); 2846 EXPECT_NE(null, entry2);
2848 2847
2849 disk_cache::Entry* entry3 = NULL; 2848 disk_cache::Entry* entry3 = NULL;
2850 ASSERT_EQ(net::ERR_IO_PENDING, 2849 ASSERT_EQ(net::ERR_IO_PENDING,
2851 cache_->OpenEntry(key, &entry3, cb.callback())); 2850 cache_->OpenEntry(key, &entry3, cb.callback()));
2852 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING)); 2851 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING));
2853 EXPECT_NE(null, entry3); 2852 EXPECT_NE(null, entry3);
2854 EXPECT_EQ(entry2, entry3); 2853 EXPECT_EQ(entry2, entry3);
2855 entry3->Close(); 2854 entry3->Close();
2856 2855
2857 // The previous Close doesn't actually closes the entry since we opened it 2856 // The previous Close doesn't actually closes the entry since we opened it
2858 // twice, so the next Write operation must succeed and it must be able to 2857 // twice, so the next Write operation must succeed and it must be able to
2859 // perform it optimistically, since there is no operation running on this 2858 // perform it optimistically, since there is no operation running on this
2860 // entry. 2859 // entry.
2861 EXPECT_EQ(kSize1, 2860 EXPECT_EQ(kSize1,
2862 entry2->WriteData( 2861 entry2->WriteData(
2863 0, 0, buffer1.get(), kSize1, net::CompletionCallback(), false)); 2862 1, 0, buffer1.get(), kSize1, net::CompletionCallback(), false));
2864 2863
2865 // Lets do another read so we block until both the write and the read 2864 // Lets do another read so we block until both the write and the read
2866 // operation finishes and we can then test for HasOneRef() below. 2865 // operation finishes and we can then test for HasOneRef() below.
2867 EXPECT_EQ(net::ERR_IO_PENDING, 2866 EXPECT_EQ(net::ERR_IO_PENDING,
2868 entry2->ReadData(0, 0, buffer1.get(), kSize1, cb.callback())); 2867 entry2->ReadData(1, 0, buffer1.get(), kSize1, cb.callback()));
2869 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2868 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2870 2869
2871 // Check that we are not leaking. 2870 // Check that we are not leaking.
2872 EXPECT_TRUE( 2871 EXPECT_TRUE(
2873 static_cast<disk_cache::SimpleEntryImpl*>(entry2)->HasOneRef()); 2872 static_cast<disk_cache::SimpleEntryImpl*>(entry2)->HasOneRef());
2874 entry2->Close(); 2873 entry2->Close();
2875 } 2874 }
2876 2875
2877 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic5) { 2876 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic5) {
2878 // Test sequence: 2877 // Test sequence:
(...skipping 10 matching lines...) Expand all
2889 disk_cache::Entry* entry = NULL; 2888 disk_cache::Entry* entry = NULL;
2890 2889
2891 ASSERT_EQ(net::OK, 2890 ASSERT_EQ(net::OK,
2892 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2891 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2893 EXPECT_NE(null, entry); 2892 EXPECT_NE(null, entry);
2894 ScopedEntryPtr entry_closer(entry); 2893 ScopedEntryPtr entry_closer(entry);
2895 entry->Doom(); 2894 entry->Doom();
2896 2895
2897 EXPECT_EQ( 2896 EXPECT_EQ(
2898 net::ERR_IO_PENDING, 2897 net::ERR_IO_PENDING,
2899 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2898 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2900 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2899 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2901 2900
2902 EXPECT_EQ(net::ERR_IO_PENDING, 2901 EXPECT_EQ(net::ERR_IO_PENDING,
2903 entry->ReadData(0, 0, buffer1.get(), kSize1, cb.callback())); 2902 entry->ReadData(1, 0, buffer1.get(), kSize1, cb.callback()));
2904 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2903 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2905 2904
2906 // Check that we are not leaking. 2905 // Check that we are not leaking.
2907 EXPECT_TRUE( 2906 EXPECT_TRUE(
2908 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 2907 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
2909 } 2908 }
2910 2909
2911 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic6) { 2910 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic6) {
2912 // Test sequence: 2911 // Test sequence:
2913 // Create, Write, Doom, Doom, Read, Doom, Close. 2912 // Create, Write, Doom, Doom, Read, Doom, Close.
2914 SetSimpleCacheMode(); 2913 SetSimpleCacheMode();
2915 InitCache(); 2914 InitCache();
2916 disk_cache::Entry* null = NULL; 2915 disk_cache::Entry* null = NULL;
2917 const char key[] = "the first key"; 2916 const char key[] = "the first key";
2918 2917
2919 net::TestCompletionCallback cb; 2918 net::TestCompletionCallback cb;
2920 const int kSize1 = 10; 2919 const int kSize1 = 10;
2921 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 2920 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1));
2922 scoped_refptr<net::IOBuffer> buffer1_read(new net::IOBuffer(kSize1)); 2921 scoped_refptr<net::IOBuffer> buffer1_read(new net::IOBuffer(kSize1));
2923 CacheTestFillBuffer(buffer1->data(), kSize1, false); 2922 CacheTestFillBuffer(buffer1->data(), kSize1, false);
2924 disk_cache::Entry* entry = NULL; 2923 disk_cache::Entry* entry = NULL;
2925 2924
2926 ASSERT_EQ(net::OK, 2925 ASSERT_EQ(net::OK,
2927 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2926 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2928 EXPECT_NE(null, entry); 2927 EXPECT_NE(null, entry);
2929 ScopedEntryPtr entry_closer(entry); 2928 ScopedEntryPtr entry_closer(entry);
2930 2929
2931 EXPECT_EQ( 2930 EXPECT_EQ(
2932 net::ERR_IO_PENDING, 2931 net::ERR_IO_PENDING,
2933 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2932 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2934 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2933 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2935 2934
2936 entry->Doom(); 2935 entry->Doom();
2937 entry->Doom(); 2936 entry->Doom();
2938 2937
2939 // This Read must not be optimistic, since we don't support that yet. 2938 // This Read must not be optimistic, since we don't support that yet.
2940 EXPECT_EQ(net::ERR_IO_PENDING, 2939 EXPECT_EQ(net::ERR_IO_PENDING,
2941 entry->ReadData(0, 0, buffer1_read.get(), kSize1, cb.callback())); 2940 entry->ReadData(1, 0, buffer1_read.get(), kSize1, cb.callback()));
2942 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2941 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2943 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1)); 2942 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
2944 2943
2945 entry->Doom(); 2944 entry->Doom();
2946 } 2945 }
2947 2946
2948 // Confirm that IO buffers are not referenced by the Simple Cache after a write 2947 // Confirm that IO buffers are not referenced by the Simple Cache after a write
2949 // completes. 2948 // completes.
2950 TEST_F(DiskCacheEntryTest, SimpleCacheOptimisticWriteReleases) { 2949 TEST_F(DiskCacheEntryTest, SimpleCacheOptimisticWriteReleases) {
2951 SetSimpleCacheMode(); 2950 SetSimpleCacheMode();
(...skipping 10 matching lines...) Expand all
2962 2961
2963 const int kWriteSize = 512; 2962 const int kWriteSize = 512;
2964 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kWriteSize)); 2963 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kWriteSize));
2965 EXPECT_TRUE(buffer1->HasOneRef()); 2964 EXPECT_TRUE(buffer1->HasOneRef());
2966 CacheTestFillBuffer(buffer1->data(), kWriteSize, false); 2965 CacheTestFillBuffer(buffer1->data(), kWriteSize, false);
2967 2966
2968 // An optimistic write happens only when there is an empty queue of pending 2967 // An optimistic write happens only when there is an empty queue of pending
2969 // operations. To ensure the queue is empty, we issue a write and wait until 2968 // operations. To ensure the queue is empty, we issue a write and wait until
2970 // it completes. 2969 // it completes.
2971 EXPECT_EQ(kWriteSize, 2970 EXPECT_EQ(kWriteSize,
2972 WriteData(entry, 0, 0, buffer1.get(), kWriteSize, false)); 2971 WriteData(entry, 1, 0, buffer1.get(), kWriteSize, false));
2973 EXPECT_TRUE(buffer1->HasOneRef()); 2972 EXPECT_TRUE(buffer1->HasOneRef());
2974 2973
2975 // Finally, we should perform an optimistic write and confirm that all 2974 // Finally, we should perform an optimistic write and confirm that all
2976 // references to the IO buffer have been released. 2975 // references to the IO buffer have been released.
2977 EXPECT_EQ( 2976 EXPECT_EQ(
2978 kWriteSize, 2977 kWriteSize,
2979 entry->WriteData( 2978 entry->WriteData(
2980 1, 0, buffer1.get(), kWriteSize, net::CompletionCallback(), false)); 2979 1, 0, buffer1.get(), kWriteSize, net::CompletionCallback(), false));
2981 EXPECT_TRUE(buffer1->HasOneRef()); 2980 EXPECT_TRUE(buffer1->HasOneRef());
2982 } 2981 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3057 SetSimpleCacheMode(); 3056 SetSimpleCacheMode();
3058 SetMaxSize(kMaxSize); 3057 SetMaxSize(kMaxSize);
3059 InitCache(); 3058 InitCache();
3060 3059
3061 std::string key1("the first key"); 3060 std::string key1("the first key");
3062 disk_cache::Entry* entry; 3061 disk_cache::Entry* entry;
3063 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); 3062 ASSERT_EQ(net::OK, CreateEntry(key1, &entry));
3064 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kWriteSize)); 3063 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kWriteSize));
3065 CacheTestFillBuffer(buffer->data(), kWriteSize, false); 3064 CacheTestFillBuffer(buffer->data(), kWriteSize, false);
3066 EXPECT_EQ(kWriteSize, 3065 EXPECT_EQ(kWriteSize,
3067 WriteData(entry, 0, 0, buffer.get(), kWriteSize, false)); 3066 WriteData(entry, 1, 0, buffer.get(), kWriteSize, false));
3068 entry->Close(); 3067 entry->Close();
3069 AddDelay(); 3068 AddDelay();
3070 3069
3071 std::string key2("the key prefix"); 3070 std::string key2("the key prefix");
3072 for (int i = 0; i < kNumExtraEntries; i++) { 3071 for (int i = 0; i < kNumExtraEntries; i++) {
3073 ASSERT_EQ(net::OK, CreateEntry(key2 + base::StringPrintf("%d", i), &entry)); 3072 ASSERT_EQ(net::OK, CreateEntry(key2 + base::StringPrintf("%d", i), &entry));
3074 ScopedEntryPtr entry_closer(entry); 3073 ScopedEntryPtr entry_closer(entry);
3075 EXPECT_EQ(kWriteSize, 3074 EXPECT_EQ(kWriteSize,
3076 WriteData(entry, 0, 0, buffer.get(), kWriteSize, false)); 3075 WriteData(entry, 1, 0, buffer.get(), kWriteSize, false));
3077 } 3076 }
3078 3077
3079 // TODO(pasko): Find a way to wait for the eviction task(s) to finish by using 3078 // TODO(pasko): Find a way to wait for the eviction task(s) to finish by using
3080 // the internal knowledge about |SimpleBackendImpl|. 3079 // the internal knowledge about |SimpleBackendImpl|.
3081 ASSERT_NE(net::OK, OpenEntry(key1, &entry)) 3080 ASSERT_NE(net::OK, OpenEntry(key1, &entry))
3082 << "Should have evicted the old entry"; 3081 << "Should have evicted the old entry";
3083 for (int i = 0; i < 2; i++) { 3082 for (int i = 0; i < 2; i++) {
3084 int entry_no = kNumExtraEntries - i - 1; 3083 int entry_no = kNumExtraEntries - i - 1;
3085 // Generally there is no guarantee that at this point the backround eviction 3084 // Generally there is no guarantee that at this point the backround eviction
3086 // is finished. We are testing the positive case, i.e. when the eviction 3085 // is finished. We are testing the positive case, i.e. when the eviction
(...skipping 15 matching lines...) Expand all
3102 const char key[] = "the first key"; 3101 const char key[] = "the first key";
3103 3102
3104 const int kBufferSize = 1024; 3103 const int kBufferSize = 1024;
3105 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); 3104 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize));
3106 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); 3105 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false);
3107 3106
3108 disk_cache::Entry* entry = NULL; 3107 disk_cache::Entry* entry = NULL;
3109 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3108 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3110 3109
3111 EXPECT_EQ(kBufferSize, 3110 EXPECT_EQ(kBufferSize,
3112 WriteData(entry, 0, 0, write_buffer.get(), kBufferSize, false)); 3111 WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false));
3113 entry->Close(); 3112 entry->Close();
3114 entry = NULL; 3113 entry = NULL;
3115 3114
3116 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3115 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3117 ScopedEntryPtr entry_closer(entry); 3116 ScopedEntryPtr entry_closer(entry);
3118 3117
3119 MessageLoopHelper helper; 3118 MessageLoopHelper helper;
3120 int expected = 0; 3119 int expected = 0;
3121 3120
3122 // Make a short read. 3121 // Make a short read.
3123 const int kReadBufferSize = 512; 3122 const int kReadBufferSize = 512;
3124 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); 3123 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
3125 CallbackTest read_callback(&helper, false); 3124 CallbackTest read_callback(&helper, false);
3126 EXPECT_EQ(net::ERR_IO_PENDING, 3125 EXPECT_EQ(net::ERR_IO_PENDING,
3127 entry->ReadData(0, 3126 entry->ReadData(1,
3128 0, 3127 0,
3129 read_buffer.get(), 3128 read_buffer.get(),
3130 kReadBufferSize, 3129 kReadBufferSize,
3131 base::Bind(&CallbackTest::Run, 3130 base::Bind(&CallbackTest::Run,
3132 base::Unretained(&read_callback)))); 3131 base::Unretained(&read_callback))));
3133 ++expected; 3132 ++expected;
3134 3133
3135 // Truncate the entry to the length of that read. 3134 // Truncate the entry to the length of that read.
3136 scoped_refptr<net::IOBuffer> 3135 scoped_refptr<net::IOBuffer>
3137 truncate_buffer(new net::IOBuffer(kReadBufferSize)); 3136 truncate_buffer(new net::IOBuffer(kReadBufferSize));
3138 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false); 3137 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false);
3139 CallbackTest truncate_callback(&helper, false); 3138 CallbackTest truncate_callback(&helper, false);
3140 EXPECT_EQ(net::ERR_IO_PENDING, 3139 EXPECT_EQ(net::ERR_IO_PENDING,
3141 entry->WriteData(0, 3140 entry->WriteData(1,
3142 0, 3141 0,
3143 truncate_buffer.get(), 3142 truncate_buffer.get(),
3144 kReadBufferSize, 3143 kReadBufferSize,
3145 base::Bind(&CallbackTest::Run, 3144 base::Bind(&CallbackTest::Run,
3146 base::Unretained(&truncate_callback)), 3145 base::Unretained(&truncate_callback)),
3147 true)); 3146 true));
3148 ++expected; 3147 ++expected;
3149 3148
3150 // Wait for both the read and truncation to finish, and confirm that both 3149 // Wait for both the read and truncation to finish, and confirm that both
3151 // succeeded. 3150 // succeeded.
(...skipping 19 matching lines...) Expand all
3171 3170
3172 const int kBufferSize = 1024; 3171 const int kBufferSize = 1024;
3173 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); 3172 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize));
3174 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); 3173 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false);
3175 3174
3176 MessageLoopHelper helper; 3175 MessageLoopHelper helper;
3177 int expected = 0; 3176 int expected = 0;
3178 3177
3179 CallbackTest write_callback(&helper, false); 3178 CallbackTest write_callback(&helper, false);
3180 EXPECT_EQ(net::ERR_IO_PENDING, 3179 EXPECT_EQ(net::ERR_IO_PENDING,
3181 entry->WriteData(0, 3180 entry->WriteData(1,
3182 0, 3181 0,
3183 write_buffer.get(), 3182 write_buffer.get(),
3184 kBufferSize, 3183 kBufferSize,
3185 base::Bind(&CallbackTest::Run, 3184 base::Bind(&CallbackTest::Run,
3186 base::Unretained(&write_callback)), 3185 base::Unretained(&write_callback)),
3187 true)); 3186 true));
3188 ++expected; 3187 ++expected;
3189 3188
3190 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kBufferSize)); 3189 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kBufferSize));
3191 CallbackTest read_callback(&helper, false); 3190 CallbackTest read_callback(&helper, false);
3192 EXPECT_EQ(net::ERR_IO_PENDING, 3191 EXPECT_EQ(net::ERR_IO_PENDING,
3193 entry->ReadData(0, 3192 entry->ReadData(1,
3194 0, 3193 0,
3195 read_buffer.get(), 3194 read_buffer.get(),
3196 kBufferSize, 3195 kBufferSize,
3197 base::Bind(&CallbackTest::Run, 3196 base::Bind(&CallbackTest::Run,
3198 base::Unretained(&read_callback)))); 3197 base::Unretained(&read_callback))));
3199 ++expected; 3198 ++expected;
3200 3199
3201 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 3200 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
3202 EXPECT_EQ(kBufferSize, write_callback.last_result()); 3201 EXPECT_EQ(kBufferSize, write_callback.last_result());
3203 EXPECT_EQ(kBufferSize, read_callback.last_result()); 3202 EXPECT_EQ(kBufferSize, read_callback.last_result());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3267 int size; 3266 int size;
3268 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size)); 3267 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size));
3269 3268
3270 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); 3269 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size));
3271 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); 3270 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size));
3272 3271
3273 // Advance the first reader a little. 3272 // Advance the first reader a little.
3274 disk_cache::Entry* entry = NULL; 3273 disk_cache::Entry* entry = NULL;
3275 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3274 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3276 ScopedEntryPtr entry_closer(entry); 3275 ScopedEntryPtr entry_closer(entry);
3277 EXPECT_EQ(1, ReadData(entry, 0, 0, read_buffer1.get(), 1)); 3276 EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1));
3278 3277
3279 // Advance the 2nd reader by the same amount. 3278 // Advance the 2nd reader by the same amount.
3280 disk_cache::Entry* entry2 = NULL; 3279 disk_cache::Entry* entry2 = NULL;
3281 EXPECT_EQ(net::OK, OpenEntry(key, &entry2)); 3280 EXPECT_EQ(net::OK, OpenEntry(key, &entry2));
3282 ScopedEntryPtr entry2_closer(entry2); 3281 ScopedEntryPtr entry2_closer(entry2);
3283 EXPECT_EQ(1, ReadData(entry2, 0, 0, read_buffer2.get(), 1)); 3282 EXPECT_EQ(1, ReadData(entry2, 1, 0, read_buffer2.get(), 1));
3284 3283
3285 // Continue reading 1st. 3284 // Continue reading 1st.
3286 EXPECT_GT(0, ReadData(entry, 0, 1, read_buffer1.get(), size)); 3285 EXPECT_GT(0, ReadData(entry, 1, 1, read_buffer1.get(), size));
3287 3286
3288 // This read should fail as well because we have previous read failures. 3287 // This read should fail as well because we have previous read failures.
3289 EXPECT_GT(0, ReadData(entry2, 0, 1, read_buffer2.get(), 1)); 3288 EXPECT_GT(0, ReadData(entry2, 1, 1, read_buffer2.get(), 1));
3290 DisableIntegrityCheck(); 3289 DisableIntegrityCheck();
3291 } 3290 }
3292 3291
3293 // Test if we can sequentially read each subset of the data until all the data 3292 // Test if we can sequentially read each subset of the data until all the data
3294 // is read, then the CRC is calculated correctly and the reads are successful. 3293 // is read, then the CRC is calculated correctly and the reads are successful.
3295 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) { 3294 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) {
3296 // Test sequence: 3295 // Test sequence:
3297 // Create, Write, Read (first half of data), Read (second half of data), 3296 // Create, Write, Read (first half of data), Read (second half of data),
3298 // Close. 3297 // Close.
3299 SetSimpleCacheMode(); 3298 SetSimpleCacheMode();
3300 InitCache(); 3299 InitCache();
3301 disk_cache::Entry* null = NULL; 3300 disk_cache::Entry* null = NULL;
3302 const char key[] = "the first key"; 3301 const char key[] = "the first key";
3303 3302
3304 const int kHalfSize = 200; 3303 const int kHalfSize = 200;
3305 const int kSize = 2 * kHalfSize; 3304 const int kSize = 2 * kHalfSize;
3306 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 3305 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
3307 CacheTestFillBuffer(buffer1->data(), kSize, false); 3306 CacheTestFillBuffer(buffer1->data(), kSize, false);
3308 disk_cache::Entry* entry = NULL; 3307 disk_cache::Entry* entry = NULL;
3309 3308
3310 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3309 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3311 EXPECT_NE(null, entry); 3310 EXPECT_NE(null, entry);
3312 3311
3313 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); 3312 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, false));
3314 entry->Close(); 3313 entry->Close();
3315 3314
3316 disk_cache::Entry* entry2 = NULL; 3315 disk_cache::Entry* entry2 = NULL;
3317 ASSERT_EQ(net::OK, OpenEntry(key, &entry2)); 3316 ASSERT_EQ(net::OK, OpenEntry(key, &entry2));
3318 EXPECT_EQ(entry, entry2); 3317 EXPECT_EQ(entry, entry2);
3319 3318
3320 // Read the first half of the data. 3319 // Read the first half of the data.
3321 int offset = 0; 3320 int offset = 0;
3322 int buf_len = kHalfSize; 3321 int buf_len = kHalfSize;
3323 scoped_refptr<net::IOBuffer> buffer1_read1(new net::IOBuffer(buf_len)); 3322 scoped_refptr<net::IOBuffer> buffer1_read1(new net::IOBuffer(buf_len));
3324 EXPECT_EQ(buf_len, ReadData(entry2, 0, offset, buffer1_read1.get(), buf_len)); 3323 EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read1.get(), buf_len));
3325 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), buf_len)); 3324 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), buf_len));
3326 3325
3327 // Read the second half of the data. 3326 // Read the second half of the data.
3328 offset = buf_len; 3327 offset = buf_len;
3329 buf_len = kHalfSize; 3328 buf_len = kHalfSize;
3330 scoped_refptr<net::IOBuffer> buffer1_read2(new net::IOBuffer(buf_len)); 3329 scoped_refptr<net::IOBuffer> buffer1_read2(new net::IOBuffer(buf_len));
3331 EXPECT_EQ(buf_len, ReadData(entry2, 0, offset, buffer1_read2.get(), buf_len)); 3330 EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read2.get(), buf_len));
3332 char* buffer1_data = buffer1->data() + offset; 3331 char* buffer1_data = buffer1->data() + offset;
3333 EXPECT_EQ(0, memcmp(buffer1_data, buffer1_read2->data(), buf_len)); 3332 EXPECT_EQ(0, memcmp(buffer1_data, buffer1_read2->data(), buf_len));
3334 3333
3335 // Check that we are not leaking. 3334 // Check that we are not leaking.
3336 EXPECT_NE(entry, null); 3335 EXPECT_NE(entry, null);
3337 EXPECT_TRUE( 3336 EXPECT_TRUE(
3338 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 3337 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
3339 entry->Close(); 3338 entry->Close();
3340 entry = NULL; 3339 entry = NULL;
3341 } 3340 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3383 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), kSize)); 3382 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), kSize));
3384 3383
3385 // Check that we are not leaking. 3384 // Check that we are not leaking.
3386 ASSERT_NE(entry, null); 3385 ASSERT_NE(entry, null);
3387 EXPECT_TRUE( 3386 EXPECT_TRUE(
3388 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 3387 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
3389 entry->Close(); 3388 entry->Close();
3390 entry = NULL; 3389 entry = NULL;
3391 } 3390 }
3392 3391
3392 // Test that changing stream1 size does not affect stream0 (stream0 and stream1
3393 // are stored in the same file in Simple Cache).
3394 TEST_F(DiskCacheEntryTest, SimpleCacheStream1SizeChanges) {
3395 SetSimpleCacheMode();
3396 InitCache();
3397 disk_cache::Entry* entry = NULL;
3398 const char key[] = "the key";
3399 const int kSize = 100;
3400 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
3401 scoped_refptr<net::IOBuffer> buffer_read(new net::IOBuffer(kSize));
3402 CacheTestFillBuffer(buffer->data(), kSize, false);
3403
3404 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3405 EXPECT_TRUE(entry);
3406
3407 // Write something in stream0.
3408 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
3409 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3410 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3411 entry->Close();
3412
3413 // Extend stream1.
3414 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3415 int stream1_size = 100;
3416 EXPECT_EQ(0, WriteData(entry, 1, stream1_size, buffer.get(), 0, false));
3417 EXPECT_EQ(stream1_size, entry->GetDataSize(1));
3418 entry->Close();
3419
3420 // Check that stream0 data has not been modified.
3421 buffer_read = new net::IOBuffer(kSize);
3422 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3423 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3424 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3425
3426 // Reduce stream1.
3427 stream1_size = 50;
3428 EXPECT_EQ(0, WriteData(entry, 1, stream1_size, buffer.get(), 0, true));
3429 EXPECT_EQ(stream1_size, entry->GetDataSize(1));
3430 entry->Close();
3431
3432 // Check that stream0 data has not been modified.
3433 buffer_read = new net::IOBuffer(kSize);
3434 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3435 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3436 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3437 entry->Close();
3438 entry = NULL;
3439 }
3440
3393 #endif // defined(OS_POSIX) 3441 #endif // defined(OS_POSIX)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698