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

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: Stream 0 size in footer 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(read_buffer->size(),
2565 read_buffer->size(), 2564 ReadData(entry, 1, 0, read_buffer.get(), read_buffer->size()));
2566 ReadData(entry, 0, 0, read_buffer.get(), read_buffer->size()));
2567 } 2565 }
2568 2566
2569 TEST_F(DiskCacheEntryTest, SimpleCacheNonOptimisticOperationsDontBlock) { 2567 TEST_F(DiskCacheEntryTest, SimpleCacheNonOptimisticOperationsDontBlock) {
2570 // Test sequence: 2568 // Test sequence:
2571 // Create, Write, Close. 2569 // Create, Write, Close.
2572 SetCacheType(net::APP_CACHE); // APP_CACHE doesn't use optimistic operations. 2570 SetCacheType(net::APP_CACHE); // APP_CACHE doesn't use optimistic operations.
2573 SetSimpleCacheMode(); 2571 SetSimpleCacheMode();
2574 InitCache(); 2572 InitCache();
2575 disk_cache::Entry* const null_entry = NULL; 2573 disk_cache::Entry* const null_entry = NULL;
2576 2574
2577 MessageLoopHelper helper; 2575 MessageLoopHelper helper;
2578 CallbackTest create_callback(&helper, false); 2576 CallbackTest create_callback(&helper, false);
2579 2577
2580 int expected_callback_runs = 0; 2578 int expected_callback_runs = 0;
2581 const int kBufferSize = 10; 2579 const int kBufferSize = 10;
2582 scoped_refptr<net::IOBufferWithSize> write_buffer( 2580 scoped_refptr<net::IOBufferWithSize> write_buffer(
2583 new net::IOBufferWithSize(kBufferSize)); 2581 new net::IOBufferWithSize(kBufferSize));
2584 2582
2585 disk_cache::Entry* entry = NULL; 2583 disk_cache::Entry* entry = NULL;
2586 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); 2584 EXPECT_EQ(net::OK, CreateEntry("my key", &entry));
2587 ASSERT_NE(null_entry, entry); 2585 ASSERT_NE(null_entry, entry);
2588 ScopedEntryPtr entry_closer(entry); 2586 ScopedEntryPtr entry_closer(entry);
2589 2587
2590 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); 2588 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false);
2591 CallbackTest write_callback(&helper, false); 2589 CallbackTest write_callback(&helper, false);
2592 int ret = entry->WriteData( 2590 int ret = entry->WriteData(
2593 0, 2591 1,
2594 0, 2592 0,
2595 write_buffer.get(), 2593 write_buffer.get(),
2596 write_buffer->size(), 2594 write_buffer->size(),
2597 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), 2595 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)),
2598 false); 2596 false);
2599 ASSERT_EQ(net::ERR_IO_PENDING, ret); 2597 ASSERT_EQ(net::ERR_IO_PENDING, ret);
2600 helper.WaitUntilCacheIoFinished(++expected_callback_runs); 2598 helper.WaitUntilCacheIoFinished(++expected_callback_runs);
2601 } 2599 }
2602 2600
2603 TEST_F(DiskCacheEntryTest, 2601 TEST_F(DiskCacheEntryTest,
(...skipping 12 matching lines...) Expand all
2616 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); 2614 EXPECT_EQ(net::OK, CreateEntry("my key", &entry));
2617 ASSERT_NE(null_entry, entry); 2615 ASSERT_NE(null_entry, entry);
2618 ScopedEntryPtr entry_closer(entry); 2616 ScopedEntryPtr entry_closer(entry);
2619 2617
2620 const int kBufferSize = 10; 2618 const int kBufferSize = 10;
2621 scoped_refptr<net::IOBufferWithSize> write_buffer( 2619 scoped_refptr<net::IOBufferWithSize> write_buffer(
2622 new net::IOBufferWithSize(kBufferSize)); 2620 new net::IOBufferWithSize(kBufferSize));
2623 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); 2621 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false);
2624 CallbackTest write_callback(&helper, false); 2622 CallbackTest write_callback(&helper, false);
2625 int ret = entry->WriteData( 2623 int ret = entry->WriteData(
2626 0, 2624 1,
2627 0, 2625 0,
2628 write_buffer.get(), 2626 write_buffer.get(),
2629 write_buffer->size(), 2627 write_buffer->size(),
2630 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), 2628 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)),
2631 false); 2629 false);
2632 EXPECT_EQ(net::ERR_IO_PENDING, ret); 2630 EXPECT_EQ(net::ERR_IO_PENDING, ret);
2633 int expected_callback_runs = 1; 2631 int expected_callback_runs = 1;
2634 2632
2635 scoped_refptr<net::IOBufferWithSize> read_buffer( 2633 scoped_refptr<net::IOBufferWithSize> read_buffer(
2636 new net::IOBufferWithSize(kBufferSize)); 2634 new net::IOBufferWithSize(kBufferSize));
2637 CallbackTest read_callback(&helper, false); 2635 CallbackTest read_callback(&helper, false);
2638 ret = entry->ReadData( 2636 ret = entry->ReadData(
2639 0, 2637 1,
2640 0, 2638 0,
2641 read_buffer.get(), 2639 read_buffer.get(),
2642 read_buffer->size(), 2640 read_buffer->size(),
2643 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback))); 2641 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback)));
2644 EXPECT_EQ(net::ERR_IO_PENDING, ret); 2642 EXPECT_EQ(net::ERR_IO_PENDING, ret);
2645 ++expected_callback_runs; 2643 ++expected_callback_runs;
2646 2644
2647 helper.WaitUntilCacheIoFinished(expected_callback_runs); 2645 helper.WaitUntilCacheIoFinished(expected_callback_runs);
2648 ASSERT_EQ(read_buffer->size(), write_buffer->size()); 2646 ASSERT_EQ(read_buffer->size(), write_buffer->size());
2649 EXPECT_EQ( 2647 EXPECT_EQ(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 ASSERT_EQ(net::OK, 2679 ASSERT_EQ(net::OK,
2682 cache_->CreateEntry(key, &entry, 2680 cache_->CreateEntry(key, &entry,
2683 base::Bind(&CallbackTest::Run, 2681 base::Bind(&CallbackTest::Run,
2684 base::Unretained(&callback1)))); 2682 base::Unretained(&callback1))));
2685 EXPECT_NE(null, entry); 2683 EXPECT_NE(null, entry);
2686 ScopedEntryPtr entry_closer(entry); 2684 ScopedEntryPtr entry_closer(entry);
2687 2685
2688 // This write may or may not be optimistic (it depends if the previous 2686 // 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). 2687 // optimistic create already finished by the time we call the write here).
2690 int ret = entry->WriteData( 2688 int ret = entry->WriteData(
2691 0, 2689 1,
2692 0, 2690 0,
2693 buffer1.get(), 2691 buffer1.get(),
2694 kSize1, 2692 kSize1,
2695 base::Bind(&CallbackTest::Run, base::Unretained(&callback2)), 2693 base::Bind(&CallbackTest::Run, base::Unretained(&callback2)),
2696 false); 2694 false);
2697 EXPECT_TRUE(kSize1 == ret || net::ERR_IO_PENDING == ret); 2695 EXPECT_TRUE(kSize1 == ret || net::ERR_IO_PENDING == ret);
2698 if (net::ERR_IO_PENDING == ret) 2696 if (net::ERR_IO_PENDING == ret)
2699 expected++; 2697 expected++;
2700 2698
2701 // This Read must not be optimistic, since we don't support that yet. 2699 // This Read must not be optimistic, since we don't support that yet.
2702 EXPECT_EQ(net::ERR_IO_PENDING, 2700 EXPECT_EQ(net::ERR_IO_PENDING,
2703 entry->ReadData( 2701 entry->ReadData(
2704 0, 2702 1,
2705 0, 2703 0,
2706 buffer1_read.get(), 2704 buffer1_read.get(),
2707 kSize1, 2705 kSize1,
2708 base::Bind(&CallbackTest::Run, base::Unretained(&callback3)))); 2706 base::Bind(&CallbackTest::Run, base::Unretained(&callback3))));
2709 expected++; 2707 expected++;
2710 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 2708 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
2711 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1)); 2709 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
2712 2710
2713 // At this point after waiting, the pending operations queue on the entry 2711 // 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. 2712 // should be empty, so the next Write operation must run as optimistic.
2715 EXPECT_EQ(kSize2, 2713 EXPECT_EQ(kSize2,
2716 entry->WriteData( 2714 entry->WriteData(
2717 0, 2715 1,
2718 0, 2716 0,
2719 buffer2.get(), 2717 buffer2.get(),
2720 kSize2, 2718 kSize2,
2721 base::Bind(&CallbackTest::Run, base::Unretained(&callback4)), 2719 base::Bind(&CallbackTest::Run, base::Unretained(&callback4)),
2722 false)); 2720 false));
2723 2721
2724 // Lets do another read so we block until both the write and the read 2722 // 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. 2723 // operation finishes and we can then test for HasOneRef() below.
2726 EXPECT_EQ(net::ERR_IO_PENDING, 2724 EXPECT_EQ(net::ERR_IO_PENDING,
2727 entry->ReadData( 2725 entry->ReadData(
2728 0, 2726 1,
2729 0, 2727 0,
2730 buffer2_read.get(), 2728 buffer2_read.get(),
2731 kSize2, 2729 kSize2,
2732 base::Bind(&CallbackTest::Run, base::Unretained(&callback5)))); 2730 base::Bind(&CallbackTest::Run, base::Unretained(&callback5))));
2733 expected++; 2731 expected++;
2734 2732
2735 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 2733 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
2736 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2_read->data(), kSize2)); 2734 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2_read->data(), kSize2));
2737 2735
2738 // Check that we are not leaking. 2736 // Check that we are not leaking.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2824 2822
2825 ASSERT_EQ(net::OK, 2823 ASSERT_EQ(net::OK,
2826 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2824 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2827 EXPECT_NE(null, entry); 2825 EXPECT_NE(null, entry);
2828 entry->Close(); 2826 entry->Close();
2829 2827
2830 // Lets do a Write so we block until both the Close and the Write 2828 // 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. 2829 // operation finishes. Write must fail since we are writing in a closed entry.
2832 EXPECT_EQ( 2830 EXPECT_EQ(
2833 net::ERR_IO_PENDING, 2831 net::ERR_IO_PENDING,
2834 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2832 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2835 EXPECT_EQ(net::ERR_FAILED, cb.GetResult(net::ERR_IO_PENDING)); 2833 EXPECT_EQ(net::ERR_FAILED, cb.GetResult(net::ERR_IO_PENDING));
2836 2834
2837 // Finish running the pending tasks so that we fully complete the close 2835 // Finish running the pending tasks so that we fully complete the close
2838 // operation and destroy the entry object. 2836 // operation and destroy the entry object.
2839 base::MessageLoop::current()->RunUntilIdle(); 2837 base::MessageLoop::current()->RunUntilIdle();
2840 2838
2841 // At this point the |entry| must have been destroyed, and called 2839 // At this point the |entry| must have been destroyed, and called
2842 // RemoveSelfFromBackend(). 2840 // RemoveSelfFromBackend().
2843 disk_cache::Entry* entry2 = NULL; 2841 disk_cache::Entry* entry2 = NULL;
2844 ASSERT_EQ(net::ERR_IO_PENDING, 2842 ASSERT_EQ(net::ERR_IO_PENDING,
2845 cache_->OpenEntry(key, &entry2, cb.callback())); 2843 cache_->OpenEntry(key, &entry2, cb.callback()));
2846 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING)); 2844 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING));
2847 EXPECT_NE(null, entry2); 2845 EXPECT_NE(null, entry2);
2848 2846
2849 disk_cache::Entry* entry3 = NULL; 2847 disk_cache::Entry* entry3 = NULL;
2850 ASSERT_EQ(net::ERR_IO_PENDING, 2848 ASSERT_EQ(net::ERR_IO_PENDING,
2851 cache_->OpenEntry(key, &entry3, cb.callback())); 2849 cache_->OpenEntry(key, &entry3, cb.callback()));
2852 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING)); 2850 ASSERT_EQ(net::OK, cb.GetResult(net::ERR_IO_PENDING));
2853 EXPECT_NE(null, entry3); 2851 EXPECT_NE(null, entry3);
2854 EXPECT_EQ(entry2, entry3); 2852 EXPECT_EQ(entry2, entry3);
2855 entry3->Close(); 2853 entry3->Close();
2856 2854
2857 // The previous Close doesn't actually closes the entry since we opened it 2855 // 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 2856 // 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 2857 // perform it optimistically, since there is no operation running on this
2860 // entry. 2858 // entry.
2861 EXPECT_EQ(kSize1, 2859 EXPECT_EQ(kSize1,
2862 entry2->WriteData( 2860 entry2->WriteData(
2863 0, 0, buffer1.get(), kSize1, net::CompletionCallback(), false)); 2861 1, 0, buffer1.get(), kSize1, net::CompletionCallback(), false));
2864 2862
2865 // Lets do another read so we block until both the write and the read 2863 // 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. 2864 // operation finishes and we can then test for HasOneRef() below.
2867 EXPECT_EQ(net::ERR_IO_PENDING, 2865 EXPECT_EQ(net::ERR_IO_PENDING,
2868 entry2->ReadData(0, 0, buffer1.get(), kSize1, cb.callback())); 2866 entry2->ReadData(1, 0, buffer1.get(), kSize1, cb.callback()));
2869 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2867 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2870 2868
2871 // Check that we are not leaking. 2869 // Check that we are not leaking.
2872 EXPECT_TRUE( 2870 EXPECT_TRUE(
2873 static_cast<disk_cache::SimpleEntryImpl*>(entry2)->HasOneRef()); 2871 static_cast<disk_cache::SimpleEntryImpl*>(entry2)->HasOneRef());
2874 entry2->Close(); 2872 entry2->Close();
2875 } 2873 }
2876 2874
2877 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic5) { 2875 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic5) {
2878 // Test sequence: 2876 // Test sequence:
(...skipping 10 matching lines...) Expand all
2889 disk_cache::Entry* entry = NULL; 2887 disk_cache::Entry* entry = NULL;
2890 2888
2891 ASSERT_EQ(net::OK, 2889 ASSERT_EQ(net::OK,
2892 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2890 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2893 EXPECT_NE(null, entry); 2891 EXPECT_NE(null, entry);
2894 ScopedEntryPtr entry_closer(entry); 2892 ScopedEntryPtr entry_closer(entry);
2895 entry->Doom(); 2893 entry->Doom();
2896 2894
2897 EXPECT_EQ( 2895 EXPECT_EQ(
2898 net::ERR_IO_PENDING, 2896 net::ERR_IO_PENDING,
2899 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2897 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2900 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2898 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2901 2899
2902 EXPECT_EQ(net::ERR_IO_PENDING, 2900 EXPECT_EQ(net::ERR_IO_PENDING,
2903 entry->ReadData(0, 0, buffer1.get(), kSize1, cb.callback())); 2901 entry->ReadData(1, 0, buffer1.get(), kSize1, cb.callback()));
2904 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2902 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2905 2903
2906 // Check that we are not leaking. 2904 // Check that we are not leaking.
2907 EXPECT_TRUE( 2905 EXPECT_TRUE(
2908 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 2906 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
2909 } 2907 }
2910 2908
2911 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic6) { 2909 TEST_F(DiskCacheEntryTest, SimpleCacheOptimistic6) {
2912 // Test sequence: 2910 // Test sequence:
2913 // Create, Write, Doom, Doom, Read, Doom, Close. 2911 // Create, Write, Doom, Doom, Read, Doom, Close.
2914 SetSimpleCacheMode(); 2912 SetSimpleCacheMode();
2915 InitCache(); 2913 InitCache();
2916 disk_cache::Entry* null = NULL; 2914 disk_cache::Entry* null = NULL;
2917 const char key[] = "the first key"; 2915 const char key[] = "the first key";
2918 2916
2919 net::TestCompletionCallback cb; 2917 net::TestCompletionCallback cb;
2920 const int kSize1 = 10; 2918 const int kSize1 = 10;
2921 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); 2919 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1));
2922 scoped_refptr<net::IOBuffer> buffer1_read(new net::IOBuffer(kSize1)); 2920 scoped_refptr<net::IOBuffer> buffer1_read(new net::IOBuffer(kSize1));
2923 CacheTestFillBuffer(buffer1->data(), kSize1, false); 2921 CacheTestFillBuffer(buffer1->data(), kSize1, false);
2924 disk_cache::Entry* entry = NULL; 2922 disk_cache::Entry* entry = NULL;
2925 2923
2926 ASSERT_EQ(net::OK, 2924 ASSERT_EQ(net::OK,
2927 cache_->CreateEntry(key, &entry, net::CompletionCallback())); 2925 cache_->CreateEntry(key, &entry, net::CompletionCallback()));
2928 EXPECT_NE(null, entry); 2926 EXPECT_NE(null, entry);
2929 ScopedEntryPtr entry_closer(entry); 2927 ScopedEntryPtr entry_closer(entry);
2930 2928
2931 EXPECT_EQ( 2929 EXPECT_EQ(
2932 net::ERR_IO_PENDING, 2930 net::ERR_IO_PENDING,
2933 entry->WriteData(0, 0, buffer1.get(), kSize1, cb.callback(), false)); 2931 entry->WriteData(1, 0, buffer1.get(), kSize1, cb.callback(), false));
2934 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2932 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2935 2933
2936 entry->Doom(); 2934 entry->Doom();
2937 entry->Doom(); 2935 entry->Doom();
2938 2936
2939 // This Read must not be optimistic, since we don't support that yet. 2937 // This Read must not be optimistic, since we don't support that yet.
2940 EXPECT_EQ(net::ERR_IO_PENDING, 2938 EXPECT_EQ(net::ERR_IO_PENDING,
2941 entry->ReadData(0, 0, buffer1_read.get(), kSize1, cb.callback())); 2939 entry->ReadData(1, 0, buffer1_read.get(), kSize1, cb.callback()));
2942 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING)); 2940 EXPECT_EQ(kSize1, cb.GetResult(net::ERR_IO_PENDING));
2943 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1)); 2941 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read->data(), kSize1));
2944 2942
2945 entry->Doom(); 2943 entry->Doom();
2946 } 2944 }
2947 2945
2948 // Confirm that IO buffers are not referenced by the Simple Cache after a write 2946 // Confirm that IO buffers are not referenced by the Simple Cache after a write
2949 // completes. 2947 // completes.
2950 TEST_F(DiskCacheEntryTest, SimpleCacheOptimisticWriteReleases) { 2948 TEST_F(DiskCacheEntryTest, SimpleCacheOptimisticWriteReleases) {
2951 SetSimpleCacheMode(); 2949 SetSimpleCacheMode();
(...skipping 10 matching lines...) Expand all
2962 2960
2963 const int kWriteSize = 512; 2961 const int kWriteSize = 512;
2964 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kWriteSize)); 2962 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kWriteSize));
2965 EXPECT_TRUE(buffer1->HasOneRef()); 2963 EXPECT_TRUE(buffer1->HasOneRef());
2966 CacheTestFillBuffer(buffer1->data(), kWriteSize, false); 2964 CacheTestFillBuffer(buffer1->data(), kWriteSize, false);
2967 2965
2968 // An optimistic write happens only when there is an empty queue of pending 2966 // 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 2967 // operations. To ensure the queue is empty, we issue a write and wait until
2970 // it completes. 2968 // it completes.
2971 EXPECT_EQ(kWriteSize, 2969 EXPECT_EQ(kWriteSize,
2972 WriteData(entry, 0, 0, buffer1.get(), kWriteSize, false)); 2970 WriteData(entry, 1, 0, buffer1.get(), kWriteSize, false));
2973 EXPECT_TRUE(buffer1->HasOneRef()); 2971 EXPECT_TRUE(buffer1->HasOneRef());
2974 2972
2975 // Finally, we should perform an optimistic write and confirm that all 2973 // Finally, we should perform an optimistic write and confirm that all
2976 // references to the IO buffer have been released. 2974 // references to the IO buffer have been released.
2977 EXPECT_EQ( 2975 EXPECT_EQ(
2978 kWriteSize, 2976 kWriteSize,
2979 entry->WriteData( 2977 entry->WriteData(
2980 1, 0, buffer1.get(), kWriteSize, net::CompletionCallback(), false)); 2978 1, 0, buffer1.get(), kWriteSize, net::CompletionCallback(), false));
2981 EXPECT_TRUE(buffer1->HasOneRef()); 2979 EXPECT_TRUE(buffer1->HasOneRef());
2982 } 2980 }
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
3122 SetSimpleCacheMode(); 3120 SetSimpleCacheMode();
3123 SetMaxSize(kMaxSize); 3121 SetMaxSize(kMaxSize);
3124 InitCache(); 3122 InitCache();
3125 3123
3126 std::string key1("the first key"); 3124 std::string key1("the first key");
3127 disk_cache::Entry* entry; 3125 disk_cache::Entry* entry;
3128 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); 3126 ASSERT_EQ(net::OK, CreateEntry(key1, &entry));
3129 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kWriteSize)); 3127 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kWriteSize));
3130 CacheTestFillBuffer(buffer->data(), kWriteSize, false); 3128 CacheTestFillBuffer(buffer->data(), kWriteSize, false);
3131 EXPECT_EQ(kWriteSize, 3129 EXPECT_EQ(kWriteSize,
3132 WriteData(entry, 0, 0, buffer.get(), kWriteSize, false)); 3130 WriteData(entry, 1, 0, buffer.get(), kWriteSize, false));
3133 entry->Close(); 3131 entry->Close();
3134 AddDelay(); 3132 AddDelay();
3135 3133
3136 std::string key2("the key prefix"); 3134 std::string key2("the key prefix");
3137 for (int i = 0; i < kNumExtraEntries; i++) { 3135 for (int i = 0; i < kNumExtraEntries; i++) {
3138 ASSERT_EQ(net::OK, CreateEntry(key2 + base::StringPrintf("%d", i), &entry)); 3136 ASSERT_EQ(net::OK, CreateEntry(key2 + base::StringPrintf("%d", i), &entry));
3139 ScopedEntryPtr entry_closer(entry); 3137 ScopedEntryPtr entry_closer(entry);
3140 EXPECT_EQ(kWriteSize, 3138 EXPECT_EQ(kWriteSize,
3141 WriteData(entry, 0, 0, buffer.get(), kWriteSize, false)); 3139 WriteData(entry, 1, 0, buffer.get(), kWriteSize, false));
3142 } 3140 }
3143 3141
3144 // TODO(pasko): Find a way to wait for the eviction task(s) to finish by using 3142 // TODO(pasko): Find a way to wait for the eviction task(s) to finish by using
3145 // the internal knowledge about |SimpleBackendImpl|. 3143 // the internal knowledge about |SimpleBackendImpl|.
3146 ASSERT_NE(net::OK, OpenEntry(key1, &entry)) 3144 ASSERT_NE(net::OK, OpenEntry(key1, &entry))
3147 << "Should have evicted the old entry"; 3145 << "Should have evicted the old entry";
3148 for (int i = 0; i < 2; i++) { 3146 for (int i = 0; i < 2; i++) {
3149 int entry_no = kNumExtraEntries - i - 1; 3147 int entry_no = kNumExtraEntries - i - 1;
3150 // Generally there is no guarantee that at this point the backround eviction 3148 // Generally there is no guarantee that at this point the backround eviction
3151 // is finished. We are testing the positive case, i.e. when the eviction 3149 // is finished. We are testing the positive case, i.e. when the eviction
(...skipping 15 matching lines...) Expand all
3167 const char key[] = "the first key"; 3165 const char key[] = "the first key";
3168 3166
3169 const int kBufferSize = 1024; 3167 const int kBufferSize = 1024;
3170 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); 3168 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize));
3171 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); 3169 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false);
3172 3170
3173 disk_cache::Entry* entry = NULL; 3171 disk_cache::Entry* entry = NULL;
3174 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3172 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3175 3173
3176 EXPECT_EQ(kBufferSize, 3174 EXPECT_EQ(kBufferSize,
3177 WriteData(entry, 0, 0, write_buffer.get(), kBufferSize, false)); 3175 WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false));
3178 entry->Close(); 3176 entry->Close();
3179 entry = NULL; 3177 entry = NULL;
3180 3178
3181 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3179 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3182 ScopedEntryPtr entry_closer(entry); 3180 ScopedEntryPtr entry_closer(entry);
3183 3181
3184 MessageLoopHelper helper; 3182 MessageLoopHelper helper;
3185 int expected = 0; 3183 int expected = 0;
3186 3184
3187 // Make a short read. 3185 // Make a short read.
3188 const int kReadBufferSize = 512; 3186 const int kReadBufferSize = 512;
3189 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); 3187 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize));
3190 CallbackTest read_callback(&helper, false); 3188 CallbackTest read_callback(&helper, false);
3191 EXPECT_EQ(net::ERR_IO_PENDING, 3189 EXPECT_EQ(net::ERR_IO_PENDING,
3192 entry->ReadData(0, 3190 entry->ReadData(1,
3193 0, 3191 0,
3194 read_buffer.get(), 3192 read_buffer.get(),
3195 kReadBufferSize, 3193 kReadBufferSize,
3196 base::Bind(&CallbackTest::Run, 3194 base::Bind(&CallbackTest::Run,
3197 base::Unretained(&read_callback)))); 3195 base::Unretained(&read_callback))));
3198 ++expected; 3196 ++expected;
3199 3197
3200 // Truncate the entry to the length of that read. 3198 // Truncate the entry to the length of that read.
3201 scoped_refptr<net::IOBuffer> 3199 scoped_refptr<net::IOBuffer>
3202 truncate_buffer(new net::IOBuffer(kReadBufferSize)); 3200 truncate_buffer(new net::IOBuffer(kReadBufferSize));
3203 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false); 3201 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false);
3204 CallbackTest truncate_callback(&helper, false); 3202 CallbackTest truncate_callback(&helper, false);
3205 EXPECT_EQ(net::ERR_IO_PENDING, 3203 EXPECT_EQ(net::ERR_IO_PENDING,
3206 entry->WriteData(0, 3204 entry->WriteData(1,
3207 0, 3205 0,
3208 truncate_buffer.get(), 3206 truncate_buffer.get(),
3209 kReadBufferSize, 3207 kReadBufferSize,
3210 base::Bind(&CallbackTest::Run, 3208 base::Bind(&CallbackTest::Run,
3211 base::Unretained(&truncate_callback)), 3209 base::Unretained(&truncate_callback)),
3212 true)); 3210 true));
3213 ++expected; 3211 ++expected;
3214 3212
3215 // Wait for both the read and truncation to finish, and confirm that both 3213 // Wait for both the read and truncation to finish, and confirm that both
3216 // succeeded. 3214 // succeeded.
(...skipping 19 matching lines...) Expand all
3236 3234
3237 const int kBufferSize = 1024; 3235 const int kBufferSize = 1024;
3238 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); 3236 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize));
3239 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); 3237 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false);
3240 3238
3241 MessageLoopHelper helper; 3239 MessageLoopHelper helper;
3242 int expected = 0; 3240 int expected = 0;
3243 3241
3244 CallbackTest write_callback(&helper, false); 3242 CallbackTest write_callback(&helper, false);
3245 EXPECT_EQ(net::ERR_IO_PENDING, 3243 EXPECT_EQ(net::ERR_IO_PENDING,
3246 entry->WriteData(0, 3244 entry->WriteData(1,
3247 0, 3245 0,
3248 write_buffer.get(), 3246 write_buffer.get(),
3249 kBufferSize, 3247 kBufferSize,
3250 base::Bind(&CallbackTest::Run, 3248 base::Bind(&CallbackTest::Run,
3251 base::Unretained(&write_callback)), 3249 base::Unretained(&write_callback)),
3252 true)); 3250 true));
3253 ++expected; 3251 ++expected;
3254 3252
3255 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kBufferSize)); 3253 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kBufferSize));
3256 CallbackTest read_callback(&helper, false); 3254 CallbackTest read_callback(&helper, false);
3257 EXPECT_EQ(net::ERR_IO_PENDING, 3255 EXPECT_EQ(net::ERR_IO_PENDING,
3258 entry->ReadData(0, 3256 entry->ReadData(1,
3259 0, 3257 0,
3260 read_buffer.get(), 3258 read_buffer.get(),
3261 kBufferSize, 3259 kBufferSize,
3262 base::Bind(&CallbackTest::Run, 3260 base::Bind(&CallbackTest::Run,
3263 base::Unretained(&read_callback)))); 3261 base::Unretained(&read_callback))));
3264 ++expected; 3262 ++expected;
3265 3263
3266 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); 3264 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected));
3267 EXPECT_EQ(kBufferSize, write_callback.last_result()); 3265 EXPECT_EQ(kBufferSize, write_callback.last_result());
3268 EXPECT_EQ(kBufferSize, read_callback.last_result()); 3266 EXPECT_EQ(kBufferSize, read_callback.last_result());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3332 int size; 3330 int size;
3333 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size)); 3331 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size));
3334 3332
3335 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); 3333 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size));
3336 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); 3334 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size));
3337 3335
3338 // Advance the first reader a little. 3336 // Advance the first reader a little.
3339 disk_cache::Entry* entry = NULL; 3337 disk_cache::Entry* entry = NULL;
3340 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3338 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3341 ScopedEntryPtr entry_closer(entry); 3339 ScopedEntryPtr entry_closer(entry);
3342 EXPECT_EQ(1, ReadData(entry, 0, 0, read_buffer1.get(), 1)); 3340 EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1));
3343 3341
3344 // Advance the 2nd reader by the same amount. 3342 // Advance the 2nd reader by the same amount.
3345 disk_cache::Entry* entry2 = NULL; 3343 disk_cache::Entry* entry2 = NULL;
3346 EXPECT_EQ(net::OK, OpenEntry(key, &entry2)); 3344 EXPECT_EQ(net::OK, OpenEntry(key, &entry2));
3347 ScopedEntryPtr entry2_closer(entry2); 3345 ScopedEntryPtr entry2_closer(entry2);
3348 EXPECT_EQ(1, ReadData(entry2, 0, 0, read_buffer2.get(), 1)); 3346 EXPECT_EQ(1, ReadData(entry2, 1, 0, read_buffer2.get(), 1));
3349 3347
3350 // Continue reading 1st. 3348 // Continue reading 1st.
3351 EXPECT_GT(0, ReadData(entry, 0, 1, read_buffer1.get(), size)); 3349 EXPECT_GT(0, ReadData(entry, 1, 1, read_buffer1.get(), size));
3352 3350
3353 // This read should fail as well because we have previous read failures. 3351 // This read should fail as well because we have previous read failures.
3354 EXPECT_GT(0, ReadData(entry2, 0, 1, read_buffer2.get(), 1)); 3352 EXPECT_GT(0, ReadData(entry2, 1, 1, read_buffer2.get(), 1));
3355 DisableIntegrityCheck(); 3353 DisableIntegrityCheck();
3356 } 3354 }
3357 3355
3358 // Test if we can sequentially read each subset of the data until all the data 3356 // Test if we can sequentially read each subset of the data until all the data
3359 // is read, then the CRC is calculated correctly and the reads are successful. 3357 // is read, then the CRC is calculated correctly and the reads are successful.
3360 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) { 3358 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) {
3361 // Test sequence: 3359 // Test sequence:
3362 // Create, Write, Read (first half of data), Read (second half of data), 3360 // Create, Write, Read (first half of data), Read (second half of data),
3363 // Close. 3361 // Close.
3364 SetSimpleCacheMode(); 3362 SetSimpleCacheMode();
3365 InitCache(); 3363 InitCache();
3366 disk_cache::Entry* null = NULL; 3364 disk_cache::Entry* null = NULL;
3367 const char key[] = "the first key"; 3365 const char key[] = "the first key";
3368 3366
3369 const int kHalfSize = 200; 3367 const int kHalfSize = 200;
3370 const int kSize = 2 * kHalfSize; 3368 const int kSize = 2 * kHalfSize;
3371 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 3369 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
3372 CacheTestFillBuffer(buffer1->data(), kSize, false); 3370 CacheTestFillBuffer(buffer1->data(), kSize, false);
3373 disk_cache::Entry* entry = NULL; 3371 disk_cache::Entry* entry = NULL;
3374 3372
3375 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3373 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3376 EXPECT_NE(null, entry); 3374 EXPECT_NE(null, entry);
3377 3375
3378 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); 3376 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, false));
3379 entry->Close(); 3377 entry->Close();
3380 3378
3381 disk_cache::Entry* entry2 = NULL; 3379 disk_cache::Entry* entry2 = NULL;
3382 ASSERT_EQ(net::OK, OpenEntry(key, &entry2)); 3380 ASSERT_EQ(net::OK, OpenEntry(key, &entry2));
3383 EXPECT_EQ(entry, entry2); 3381 EXPECT_EQ(entry, entry2);
3384 3382
3385 // Read the first half of the data. 3383 // Read the first half of the data.
3386 int offset = 0; 3384 int offset = 0;
3387 int buf_len = kHalfSize; 3385 int buf_len = kHalfSize;
3388 scoped_refptr<net::IOBuffer> buffer1_read1(new net::IOBuffer(buf_len)); 3386 scoped_refptr<net::IOBuffer> buffer1_read1(new net::IOBuffer(buf_len));
3389 EXPECT_EQ(buf_len, ReadData(entry2, 0, offset, buffer1_read1.get(), buf_len)); 3387 EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read1.get(), buf_len));
3390 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), buf_len)); 3388 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), buf_len));
3391 3389
3392 // Read the second half of the data. 3390 // Read the second half of the data.
3393 offset = buf_len; 3391 offset = buf_len;
3394 buf_len = kHalfSize; 3392 buf_len = kHalfSize;
3395 scoped_refptr<net::IOBuffer> buffer1_read2(new net::IOBuffer(buf_len)); 3393 scoped_refptr<net::IOBuffer> buffer1_read2(new net::IOBuffer(buf_len));
3396 EXPECT_EQ(buf_len, ReadData(entry2, 0, offset, buffer1_read2.get(), buf_len)); 3394 EXPECT_EQ(buf_len, ReadData(entry2, 1, offset, buffer1_read2.get(), buf_len));
3397 char* buffer1_data = buffer1->data() + offset; 3395 char* buffer1_data = buffer1->data() + offset;
3398 EXPECT_EQ(0, memcmp(buffer1_data, buffer1_read2->data(), buf_len)); 3396 EXPECT_EQ(0, memcmp(buffer1_data, buffer1_read2->data(), buf_len));
3399 3397
3400 // Check that we are not leaking. 3398 // Check that we are not leaking.
3401 EXPECT_NE(entry, null); 3399 EXPECT_NE(entry, null);
3402 EXPECT_TRUE( 3400 EXPECT_TRUE(
3403 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 3401 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
3404 entry->Close(); 3402 entry->Close();
3405 entry = NULL; 3403 entry = NULL;
3406 } 3404 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3448 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), kSize)); 3446 EXPECT_EQ(0, memcmp(buffer1->data(), buffer1_read1->data(), kSize));
3449 3447
3450 // Check that we are not leaking. 3448 // Check that we are not leaking.
3451 ASSERT_NE(entry, null); 3449 ASSERT_NE(entry, null);
3452 EXPECT_TRUE( 3450 EXPECT_TRUE(
3453 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); 3451 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
3454 entry->Close(); 3452 entry->Close();
3455 entry = NULL; 3453 entry = NULL;
3456 } 3454 }
3457 3455
3456 // Test that changing stream1 size does not affect stream0 (stream0 and stream1
3457 // are stored in the same file in Simple Cache).
3458 TEST_F(DiskCacheEntryTest, SimpleCacheStream1SizeChanges) {
3459 SetSimpleCacheMode();
3460 InitCache();
3461 disk_cache::Entry* entry = NULL;
3462 const char key[] = "the key";
3463 const int kSize = 100;
3464 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
3465 scoped_refptr<net::IOBuffer> buffer_read(new net::IOBuffer(kSize));
3466 CacheTestFillBuffer(buffer->data(), kSize, false);
3467
3468 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3469 EXPECT_TRUE(entry);
3470
3471 // Write something in stream0.
3472 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
3473 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3474 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3475 entry->Close();
3476
3477 // Extend stream1.
3478 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3479 int stream1_size = 100;
3480 EXPECT_EQ(0, WriteData(entry, 1, stream1_size, buffer.get(), 0, false));
3481 EXPECT_EQ(stream1_size, entry->GetDataSize(1));
3482 entry->Close();
3483
3484 // Check that stream0 data has not been modified.
3485 buffer_read = new net::IOBuffer(kSize);
3486 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3487 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3488 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3489
3490 // Reduce stream1.
3491 stream1_size = 50;
3492 EXPECT_EQ(0, WriteData(entry, 1, stream1_size, buffer.get(), 0, true));
3493 EXPECT_EQ(stream1_size, entry->GetDataSize(1));
3494 entry->Close();
3495
3496 // Check that stream0 data has not been modified.
3497 buffer_read = new net::IOBuffer(kSize);
3498 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3499 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
3500 EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
3501 entry->Close();
3502 entry = NULL;
3503 }
3504
3458 #endif // defined(OS_POSIX) 3505 #endif // defined(OS_POSIX)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698