| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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) |
| OLD | NEW |