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 <utility> | 5 #include <utility> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/files/file.h" | 9 #include "base/files/file.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 void DoomNormalEntry(); | 67 void DoomNormalEntry(); |
68 void DoomEntryNextToOpenEntry(); | 68 void DoomEntryNextToOpenEntry(); |
69 void DoomedEntry(int stream_index); | 69 void DoomedEntry(int stream_index); |
70 void BasicSparseIO(); | 70 void BasicSparseIO(); |
71 void HugeSparseIO(); | 71 void HugeSparseIO(); |
72 void GetAvailableRange(); | 72 void GetAvailableRange(); |
73 void CouldBeSparse(); | 73 void CouldBeSparse(); |
74 void UpdateSparseEntry(); | 74 void UpdateSparseEntry(); |
75 void DoomSparseEntry(); | 75 void DoomSparseEntry(); |
76 void PartialSparseEntry(); | 76 void PartialSparseEntry(); |
77 bool SimpleCacheMakeBadChecksumEntry(const std::string& key, int* data_size); | 77 bool SimpleCacheMakeBadChecksumEntry(const std::string& key, int data_size); |
78 bool SimpleCacheThirdStreamFileExists(const char* key); | 78 bool SimpleCacheThirdStreamFileExists(const char* key); |
79 void SyncDoomEntry(const char* key); | 79 void SyncDoomEntry(const char* key); |
80 }; | 80 }; |
81 | 81 |
82 // This part of the test runs on the background thread. | 82 // This part of the test runs on the background thread. |
83 void DiskCacheEntryTest::InternalSyncIOBackground(disk_cache::Entry* entry) { | 83 void DiskCacheEntryTest::InternalSyncIOBackground(disk_cache::Entry* entry) { |
84 const int kSize1 = 10; | 84 const int kSize1 = 10; |
85 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); | 85 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
86 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 86 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
87 EXPECT_EQ( | 87 EXPECT_EQ( |
(...skipping 2536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2624 // it on a doomed entry, if it was previously lazily omitted. | 2624 // it on a doomed entry, if it was previously lazily omitted. |
2625 for (int i = 0; i < disk_cache::kSimpleEntryStreamCount - 1; ++i) { | 2625 for (int i = 0; i < disk_cache::kSimpleEntryStreamCount - 1; ++i) { |
2626 EXPECT_THAT(DoomAllEntries(), IsOk()); | 2626 EXPECT_THAT(DoomAllEntries(), IsOk()); |
2627 DoomedEntry(i); | 2627 DoomedEntry(i); |
2628 } | 2628 } |
2629 } | 2629 } |
2630 | 2630 |
2631 // Creates an entry with corrupted last byte in stream 0. | 2631 // Creates an entry with corrupted last byte in stream 0. |
2632 // Requires SimpleCacheMode. | 2632 // Requires SimpleCacheMode. |
2633 bool DiskCacheEntryTest::SimpleCacheMakeBadChecksumEntry(const std::string& key, | 2633 bool DiskCacheEntryTest::SimpleCacheMakeBadChecksumEntry(const std::string& key, |
2634 int* data_size) { | 2634 int data_size) { |
2635 disk_cache::Entry* entry = NULL; | 2635 disk_cache::Entry* entry = NULL; |
2636 | 2636 |
2637 if (CreateEntry(key, &entry) != net::OK || !entry) { | 2637 if (CreateEntry(key, &entry) != net::OK || !entry) { |
2638 LOG(ERROR) << "Could not create entry"; | 2638 LOG(ERROR) << "Could not create entry"; |
2639 return false; | 2639 return false; |
2640 } | 2640 } |
2641 | 2641 |
2642 const char data[] = "this is very good data"; | 2642 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(data_size)); |
2643 const int kDataSize = arraysize(data); | 2643 memset(buffer->data(), 'A', data_size); |
2644 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kDataSize)); | |
2645 base::strlcpy(buffer->data(), data, kDataSize); | |
2646 | 2644 |
2647 EXPECT_EQ(kDataSize, WriteData(entry, 1, 0, buffer.get(), kDataSize, false)); | 2645 EXPECT_EQ(data_size, WriteData(entry, 1, 0, buffer.get(), data_size, false)); |
2648 entry->Close(); | 2646 entry->Close(); |
2649 entry = NULL; | 2647 entry = NULL; |
2650 | 2648 |
2651 // Corrupt the last byte of the data. | 2649 // Corrupt the last byte of the data. |
2652 base::FilePath entry_file0_path = cache_path_.AppendASCII( | 2650 base::FilePath entry_file0_path = cache_path_.AppendASCII( |
2653 disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0)); | 2651 disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0)); |
2654 base::File entry_file0(entry_file0_path, | 2652 base::File entry_file0(entry_file0_path, |
2655 base::File::FLAG_WRITE | base::File::FLAG_OPEN); | 2653 base::File::FLAG_WRITE | base::File::FLAG_OPEN); |
2656 if (!entry_file0.IsValid()) | 2654 if (!entry_file0.IsValid()) |
2657 return false; | 2655 return false; |
2658 | 2656 |
2659 int64_t file_offset = | 2657 int64_t file_offset = |
2660 sizeof(disk_cache::SimpleFileHeader) + key.size() + kDataSize - 2; | 2658 sizeof(disk_cache::SimpleFileHeader) + key.size() + data_size - 2; |
2661 EXPECT_EQ(1, entry_file0.Write(file_offset, "X", 1)); | 2659 EXPECT_EQ(1, entry_file0.Write(file_offset, "X", 1)); |
2662 *data_size = kDataSize; | |
2663 return true; | 2660 return true; |
2664 } | 2661 } |
2665 | 2662 |
2666 // Tests that the simple cache can detect entries that have bad data. | 2663 // Tests that the simple cache can detect entries that have bad data. |
| 2664 TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksumSmall) { |
| 2665 base::HistogramTester histogram_tester; |
| 2666 SetSimpleCacheMode(); |
| 2667 InitCache(); |
| 2668 |
| 2669 const char key[] = "the first key"; |
| 2670 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, 10)); |
| 2671 |
| 2672 disk_cache::Entry* entry = NULL; |
| 2673 |
| 2674 // Open the entry. Since we made a small entry, we will detect the CRC |
| 2675 // problem at open. |
| 2676 EXPECT_THAT(OpenEntry(key, &entry), IsError(net::ERR_FAILED)); |
| 2677 } |
| 2678 |
2667 TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { | 2679 TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { |
2668 base::HistogramTester histogram_tester; | 2680 base::HistogramTester histogram_tester; |
2669 SetSimpleCacheMode(); | 2681 SetSimpleCacheMode(); |
2670 InitCache(); | 2682 InitCache(); |
2671 | 2683 |
2672 const char key[] = "the first key"; | 2684 const char key[] = "the first key"; |
2673 int size_unused; | 2685 const int kLargeSize = 50000; |
2674 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused)); | 2686 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, kLargeSize)); |
2675 | 2687 |
2676 disk_cache::Entry* entry = NULL; | 2688 disk_cache::Entry* entry = NULL; |
2677 | 2689 |
2678 // Open the entry. | 2690 // Open the entry. Can't spot the checksum that quickly with it so |
| 2691 // huge. |
2679 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); | 2692 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); |
2680 ScopedEntryPtr entry_closer(entry); | 2693 ScopedEntryPtr entry_closer(entry); |
2681 | 2694 |
2682 const int kReadBufferSize = 200; | 2695 EXPECT_GE(kLargeSize, entry->GetDataSize(1)); |
2683 EXPECT_GE(kReadBufferSize, entry->GetDataSize(1)); | 2696 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kLargeSize)); |
2684 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); | |
2685 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, | 2697 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, |
2686 ReadData(entry, 1, 0, read_buffer.get(), kReadBufferSize)); | 2698 ReadData(entry, 1, 0, read_buffer.get(), kLargeSize)); |
2687 histogram_tester.ExpectUniqueSample( | 2699 histogram_tester.ExpectUniqueSample( |
2688 "SimpleCache.Http.ReadResult", | 2700 "SimpleCache.Http.ReadResult", |
2689 disk_cache::READ_RESULT_SYNC_CHECKSUM_FAILURE, 1); | 2701 disk_cache::READ_RESULT_SYNC_CHECKSUM_FAILURE, 1); |
2690 } | 2702 } |
2691 | 2703 |
2692 // Tests that an entry that has had an IO error occur can still be Doomed(). | 2704 // Tests that an entry that has had an IO error occur can still be Doomed(). |
2693 TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) { | 2705 TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) { |
2694 base::HistogramTester histogram_tester; | 2706 base::HistogramTester histogram_tester; |
2695 SetSimpleCacheMode(); | 2707 SetSimpleCacheMode(); |
2696 InitCache(); | 2708 InitCache(); |
2697 | 2709 |
2698 const char key[] = "the first key"; | 2710 const char key[] = "the first key"; |
2699 int size_unused; | 2711 const int kLargeSize = 50000; |
2700 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size_unused)); | 2712 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, kLargeSize)); |
2701 | 2713 |
2702 disk_cache::Entry* entry = NULL; | 2714 disk_cache::Entry* entry = NULL; |
2703 | 2715 |
2704 // Open the entry, forcing an IO error. | 2716 // Open the entry, forcing an IO error. |
2705 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); | 2717 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); |
2706 ScopedEntryPtr entry_closer(entry); | 2718 ScopedEntryPtr entry_closer(entry); |
2707 | 2719 |
2708 const int kReadBufferSize = 200; | 2720 EXPECT_GE(kLargeSize, entry->GetDataSize(1)); |
2709 EXPECT_GE(kReadBufferSize, entry->GetDataSize(1)); | 2721 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kLargeSize)); |
2710 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); | |
2711 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, | 2722 EXPECT_EQ(net::ERR_CACHE_CHECKSUM_MISMATCH, |
2712 ReadData(entry, 1, 0, read_buffer.get(), kReadBufferSize)); | 2723 ReadData(entry, 1, 0, read_buffer.get(), kLargeSize)); |
2713 histogram_tester.ExpectUniqueSample( | 2724 histogram_tester.ExpectUniqueSample( |
2714 "SimpleCache.Http.ReadResult", | 2725 "SimpleCache.Http.ReadResult", |
2715 disk_cache::READ_RESULT_SYNC_CHECKSUM_FAILURE, 1); | 2726 disk_cache::READ_RESULT_SYNC_CHECKSUM_FAILURE, 1); |
2716 entry->Doom(); // Should not crash. | 2727 entry->Doom(); // Should not crash. |
2717 } | 2728 } |
2718 | 2729 |
2719 bool TruncatePath(const base::FilePath& file_path, int64_t length) { | 2730 bool TruncatePath(const base::FilePath& file_path, int64_t length) { |
2720 base::File file(file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN); | 2731 base::File file(file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN); |
2721 if (!file.IsValid()) | 2732 if (!file.IsValid()) |
2722 return false; | 2733 return false; |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3438 | 3449 |
3439 // Tests that if a read and a following in-flight truncate are both in progress | 3450 // Tests that if a read and a following in-flight truncate are both in progress |
3440 // simultaniously that they both can occur successfully. See | 3451 // simultaniously that they both can occur successfully. See |
3441 // http://crbug.com/239223 | 3452 // http://crbug.com/239223 |
3442 TEST_F(DiskCacheEntryTest, SimpleCacheInFlightTruncate) { | 3453 TEST_F(DiskCacheEntryTest, SimpleCacheInFlightTruncate) { |
3443 SetSimpleCacheMode(); | 3454 SetSimpleCacheMode(); |
3444 InitCache(); | 3455 InitCache(); |
3445 | 3456 |
3446 const char key[] = "the first key"; | 3457 const char key[] = "the first key"; |
3447 | 3458 |
3448 const int kBufferSize = 1024; | 3459 const int kBufferSize = 50000; // to avoid quick read |
3449 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); | 3460 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); |
3450 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); | 3461 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); |
3451 | 3462 |
3452 disk_cache::Entry* entry = NULL; | 3463 disk_cache::Entry* entry = NULL; |
3453 ASSERT_THAT(CreateEntry(key, &entry), IsOk()); | 3464 ASSERT_THAT(CreateEntry(key, &entry), IsOk()); |
3454 | 3465 |
3455 EXPECT_EQ(kBufferSize, | 3466 EXPECT_EQ(kBufferSize, |
3456 WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false)); | 3467 WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false)); |
3457 entry->Close(); | 3468 entry->Close(); |
3458 entry = NULL; | 3469 entry = NULL; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3569 } | 3580 } |
3570 | 3581 |
3571 // Checking one more scenario of overlapped reading of a bad entry. | 3582 // Checking one more scenario of overlapped reading of a bad entry. |
3572 // Differs from the |SimpleCacheMultipleReadersCheckCRC| only by the order of | 3583 // Differs from the |SimpleCacheMultipleReadersCheckCRC| only by the order of |
3573 // last two reads. | 3584 // last two reads. |
3574 TEST_F(DiskCacheEntryTest, SimpleCacheMultipleReadersCheckCRC2) { | 3585 TEST_F(DiskCacheEntryTest, SimpleCacheMultipleReadersCheckCRC2) { |
3575 SetSimpleCacheMode(); | 3586 SetSimpleCacheMode(); |
3576 InitCache(); | 3587 InitCache(); |
3577 | 3588 |
3578 const char key[] = "key"; | 3589 const char key[] = "key"; |
3579 int size; | 3590 int size = 50000; |
3580 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size)); | 3591 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, size)); |
3581 | 3592 |
3582 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); | 3593 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); |
3583 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); | 3594 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); |
3584 | 3595 |
3585 // Advance the first reader a little. | 3596 // Advance the first reader a little. |
3586 disk_cache::Entry* entry = NULL; | 3597 disk_cache::Entry* entry = NULL; |
3587 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); | 3598 ASSERT_THAT(OpenEntry(key, &entry), IsOk()); |
3588 ScopedEntryPtr entry_closer(entry); | 3599 ScopedEntryPtr entry_closer(entry); |
3589 EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1)); | 3600 EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1)); |
3590 | 3601 |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4315 // CHECK(temp_dir_.CreateUniqueTempDir()); | 4326 // CHECK(temp_dir_.CreateUniqueTempDir()); |
4316 // cache_path_ = temp_dir_.GetPath(); | 4327 // cache_path_ = temp_dir_.GetPath(); |
4317 disk_cache::DeleteCache(cache_path_, | 4328 disk_cache::DeleteCache(cache_path_, |
4318 true /* delete the dir, what we really want*/); | 4329 true /* delete the dir, what we really want*/); |
4319 | 4330 |
4320 disk_cache::Entry* entry; | 4331 disk_cache::Entry* entry; |
4321 std::string key("a key"); | 4332 std::string key("a key"); |
4322 ASSERT_THAT(CreateEntry(key, &entry), IsOk()); | 4333 ASSERT_THAT(CreateEntry(key, &entry), IsOk()); |
4323 entry->Close(); | 4334 entry->Close(); |
4324 } | 4335 } |
OLD | NEW |