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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2583 new net::IOBufferWithSize(kBufferSize)); | 2582 new net::IOBufferWithSize(kBufferSize)); |
2584 | 2583 |
2585 disk_cache::Entry* entry = NULL; | 2584 disk_cache::Entry* entry = NULL; |
2586 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); | 2585 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); |
2587 ASSERT_NE(null_entry, entry); | 2586 ASSERT_NE(null_entry, entry); |
2588 ScopedEntryPtr entry_closer(entry); | 2587 ScopedEntryPtr entry_closer(entry); |
2589 | 2588 |
2590 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); | 2589 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); |
2591 CallbackTest write_callback(&helper, false); | 2590 CallbackTest write_callback(&helper, false); |
2592 int ret = entry->WriteData( | 2591 int ret = entry->WriteData( |
2593 0, | 2592 1, |
2594 0, | 2593 0, |
2595 write_buffer.get(), | 2594 write_buffer.get(), |
2596 write_buffer->size(), | 2595 write_buffer->size(), |
2597 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), | 2596 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), |
2598 false); | 2597 false); |
2599 ASSERT_EQ(net::ERR_IO_PENDING, ret); | 2598 ASSERT_EQ(net::ERR_IO_PENDING, ret); |
2600 helper.WaitUntilCacheIoFinished(++expected_callback_runs); | 2599 helper.WaitUntilCacheIoFinished(++expected_callback_runs); |
2601 } | 2600 } |
2602 | 2601 |
2603 TEST_F(DiskCacheEntryTest, | 2602 TEST_F(DiskCacheEntryTest, |
(...skipping 12 matching lines...) Expand all Loading... |
2616 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); | 2615 EXPECT_EQ(net::OK, CreateEntry("my key", &entry)); |
2617 ASSERT_NE(null_entry, entry); | 2616 ASSERT_NE(null_entry, entry); |
2618 ScopedEntryPtr entry_closer(entry); | 2617 ScopedEntryPtr entry_closer(entry); |
2619 | 2618 |
2620 const int kBufferSize = 10; | 2619 const int kBufferSize = 10; |
2621 scoped_refptr<net::IOBufferWithSize> write_buffer( | 2620 scoped_refptr<net::IOBufferWithSize> write_buffer( |
2622 new net::IOBufferWithSize(kBufferSize)); | 2621 new net::IOBufferWithSize(kBufferSize)); |
2623 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); | 2622 CacheTestFillBuffer(write_buffer->data(), write_buffer->size(), false); |
2624 CallbackTest write_callback(&helper, false); | 2623 CallbackTest write_callback(&helper, false); |
2625 int ret = entry->WriteData( | 2624 int ret = entry->WriteData( |
2626 0, | 2625 1, |
2627 0, | 2626 0, |
2628 write_buffer.get(), | 2627 write_buffer.get(), |
2629 write_buffer->size(), | 2628 write_buffer->size(), |
2630 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), | 2629 base::Bind(&CallbackTest::Run, base::Unretained(&write_callback)), |
2631 false); | 2630 false); |
2632 EXPECT_EQ(net::ERR_IO_PENDING, ret); | 2631 EXPECT_EQ(net::ERR_IO_PENDING, ret); |
2633 int expected_callback_runs = 1; | 2632 int expected_callback_runs = 1; |
2634 | 2633 |
2635 scoped_refptr<net::IOBufferWithSize> read_buffer( | 2634 scoped_refptr<net::IOBufferWithSize> read_buffer( |
2636 new net::IOBufferWithSize(kBufferSize)); | 2635 new net::IOBufferWithSize(kBufferSize)); |
2637 CallbackTest read_callback(&helper, false); | 2636 CallbackTest read_callback(&helper, false); |
2638 ret = entry->ReadData( | 2637 ret = entry->ReadData( |
2639 0, | 2638 1, |
2640 0, | 2639 0, |
2641 read_buffer.get(), | 2640 read_buffer.get(), |
2642 read_buffer->size(), | 2641 read_buffer->size(), |
2643 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback))); | 2642 base::Bind(&CallbackTest::Run, base::Unretained(&read_callback))); |
2644 EXPECT_EQ(net::ERR_IO_PENDING, ret); | 2643 EXPECT_EQ(net::ERR_IO_PENDING, ret); |
2645 ++expected_callback_runs; | 2644 ++expected_callback_runs; |
2646 | 2645 |
2647 helper.WaitUntilCacheIoFinished(expected_callback_runs); | 2646 helper.WaitUntilCacheIoFinished(expected_callback_runs); |
2648 ASSERT_EQ(read_buffer->size(), write_buffer->size()); | 2647 ASSERT_EQ(read_buffer->size(), write_buffer->size()); |
2649 EXPECT_EQ( | 2648 EXPECT_EQ( |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3115 const char key[] = "the first key"; | 3114 const char key[] = "the first key"; |
3116 | 3115 |
3117 const int kBufferSize = 1024; | 3116 const int kBufferSize = 1024; |
3118 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); | 3117 scoped_refptr<net::IOBuffer> write_buffer(new net::IOBuffer(kBufferSize)); |
3119 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); | 3118 CacheTestFillBuffer(write_buffer->data(), kBufferSize, false); |
3120 | 3119 |
3121 disk_cache::Entry* entry = NULL; | 3120 disk_cache::Entry* entry = NULL; |
3122 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 3121 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
3123 | 3122 |
3124 EXPECT_EQ(kBufferSize, | 3123 EXPECT_EQ(kBufferSize, |
3125 WriteData(entry, 0, 0, write_buffer.get(), kBufferSize, false)); | 3124 WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false)); |
3126 entry->Close(); | 3125 entry->Close(); |
3127 entry = NULL; | 3126 entry = NULL; |
3128 | 3127 |
3129 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 3128 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
3130 ScopedEntryPtr entry_closer(entry); | 3129 ScopedEntryPtr entry_closer(entry); |
3131 | 3130 |
3132 MessageLoopHelper helper; | 3131 MessageLoopHelper helper; |
3133 int expected = 0; | 3132 int expected = 0; |
3134 | 3133 |
3135 // Make a short read. | 3134 // Make a short read. |
3136 const int kReadBufferSize = 512; | 3135 const int kReadBufferSize = 512; |
3137 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); | 3136 scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); |
3138 CallbackTest read_callback(&helper, false); | 3137 CallbackTest read_callback(&helper, false); |
3139 EXPECT_EQ(net::ERR_IO_PENDING, | 3138 EXPECT_EQ(net::ERR_IO_PENDING, |
3140 entry->ReadData(0, | 3139 entry->ReadData(1, |
3141 0, | 3140 0, |
3142 read_buffer.get(), | 3141 read_buffer.get(), |
3143 kReadBufferSize, | 3142 kReadBufferSize, |
3144 base::Bind(&CallbackTest::Run, | 3143 base::Bind(&CallbackTest::Run, |
3145 base::Unretained(&read_callback)))); | 3144 base::Unretained(&read_callback)))); |
3146 ++expected; | 3145 ++expected; |
3147 | 3146 |
3148 // Truncate the entry to the length of that read. | 3147 // Truncate the entry to the length of that read. |
3149 scoped_refptr<net::IOBuffer> | 3148 scoped_refptr<net::IOBuffer> |
3150 truncate_buffer(new net::IOBuffer(kReadBufferSize)); | 3149 truncate_buffer(new net::IOBuffer(kReadBufferSize)); |
3151 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false); | 3150 CacheTestFillBuffer(truncate_buffer->data(), kReadBufferSize, false); |
3152 CallbackTest truncate_callback(&helper, false); | 3151 CallbackTest truncate_callback(&helper, false); |
3153 EXPECT_EQ(net::ERR_IO_PENDING, | 3152 EXPECT_EQ(net::ERR_IO_PENDING, |
3154 entry->WriteData(0, | 3153 entry->WriteData(1, |
3155 0, | 3154 0, |
3156 truncate_buffer.get(), | 3155 truncate_buffer.get(), |
3157 kReadBufferSize, | 3156 kReadBufferSize, |
3158 base::Bind(&CallbackTest::Run, | 3157 base::Bind(&CallbackTest::Run, |
3159 base::Unretained(&truncate_callback)), | 3158 base::Unretained(&truncate_callback)), |
3160 true)); | 3159 true)); |
3161 ++expected; | 3160 ++expected; |
3162 | 3161 |
3163 // Wait for both the read and truncation to finish, and confirm that both | 3162 // Wait for both the read and truncation to finish, and confirm that both |
3164 // succeeded. | 3163 // succeeded. |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3280 int size; | 3279 int size; |
3281 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size)); | 3280 ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, &size)); |
3282 | 3281 |
3283 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); | 3282 scoped_refptr<net::IOBuffer> read_buffer1(new net::IOBuffer(size)); |
3284 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); | 3283 scoped_refptr<net::IOBuffer> read_buffer2(new net::IOBuffer(size)); |
3285 | 3284 |
3286 // Advance the first reader a little. | 3285 // Advance the first reader a little. |
3287 disk_cache::Entry* entry = NULL; | 3286 disk_cache::Entry* entry = NULL; |
3288 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 3287 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
3289 ScopedEntryPtr entry_closer(entry); | 3288 ScopedEntryPtr entry_closer(entry); |
3290 EXPECT_EQ(1, ReadData(entry, 0, 0, read_buffer1.get(), 1)); | 3289 EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1)); |
3291 | 3290 |
3292 // Advance the 2nd reader by the same amount. | 3291 // Advance the 2nd reader by the same amount. |
3293 disk_cache::Entry* entry2 = NULL; | 3292 disk_cache::Entry* entry2 = NULL; |
3294 EXPECT_EQ(net::OK, OpenEntry(key, &entry2)); | 3293 EXPECT_EQ(net::OK, OpenEntry(key, &entry2)); |
3295 ScopedEntryPtr entry2_closer(entry2); | 3294 ScopedEntryPtr entry2_closer(entry2); |
3296 EXPECT_EQ(1, ReadData(entry2, 0, 0, read_buffer2.get(), 1)); | 3295 EXPECT_EQ(1, ReadData(entry2, 1, 0, read_buffer2.get(), 1)); |
3297 | 3296 |
3298 // Continue reading 1st. | 3297 // Continue reading 1st. |
3299 EXPECT_GT(0, ReadData(entry, 0, 1, read_buffer1.get(), size)); | 3298 EXPECT_GT(0, ReadData(entry, 1, 1, read_buffer1.get(), size)); |
3300 | 3299 |
3301 // This read should fail as well because we have previous read failures. | 3300 // This read should fail as well because we have previous read failures. |
3302 EXPECT_GT(0, ReadData(entry2, 0, 1, read_buffer2.get(), 1)); | 3301 EXPECT_GT(0, ReadData(entry2, 1, 1, read_buffer2.get(), 1)); |
3303 DisableIntegrityCheck(); | 3302 DisableIntegrityCheck(); |
3304 } | 3303 } |
3305 | 3304 |
3306 // Test if we can sequentially read each subset of the data until all the data | 3305 // Test if we can sequentially read each subset of the data until all the data |
3307 // is read, then the CRC is calculated correctly and the reads are successful. | 3306 // is read, then the CRC is calculated correctly and the reads are successful. |
3308 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) { | 3307 TEST_F(DiskCacheEntryTest, SimpleCacheReadCombineCRC) { |
3309 // Test sequence: | 3308 // Test sequence: |
3310 // Create, Write, Read (first half of data), Read (second half of data), | 3309 // Create, Write, Read (first half of data), Read (second half of data), |
3311 // Close. | 3310 // Close. |
3312 SetSimpleCacheMode(); | 3311 SetSimpleCacheMode(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3397 | 3396 |
3398 // Check that we are not leaking. | 3397 // Check that we are not leaking. |
3399 ASSERT_NE(entry, null); | 3398 ASSERT_NE(entry, null); |
3400 EXPECT_TRUE( | 3399 EXPECT_TRUE( |
3401 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); | 3400 static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef()); |
3402 entry->Close(); | 3401 entry->Close(); |
3403 entry = NULL; | 3402 entry = NULL; |
3404 } | 3403 } |
3405 | 3404 |
3406 #endif // defined(OS_POSIX) | 3405 #endif // defined(OS_POSIX) |
OLD | NEW |