Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2010 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/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/platform_thread.h" | 7 #include "base/platform_thread.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 FilePath filename = GetCacheFilePath().AppendASCII("f_000001"); | 217 FilePath filename = GetCacheFilePath().AppendASCII("f_000001"); |
| 218 | 218 |
| 219 const int kSize = 50; | 219 const int kSize = 50; |
| 220 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 220 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 221 CacheTestFillBuffer(buffer1->data(), kSize, false); | 221 CacheTestFillBuffer(buffer1->data(), kSize, false); |
| 222 ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); | 222 ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); |
| 223 | 223 |
| 224 // Now let's create a file with the cache. | 224 // Now let's create a file with the cache. |
| 225 disk_cache::Entry* entry; | 225 disk_cache::Entry* entry; |
| 226 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); | 226 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); |
| 227 ASSERT_EQ(0, entry->WriteData(0, 20000, buffer1, 0, NULL, false)); | 227 ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1, 0, false)); |
| 228 entry->Close(); | 228 entry->Close(); |
| 229 | 229 |
| 230 // And verify that the first file is still there. | 230 // And verify that the first file is still there. |
| 231 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); | 231 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); |
| 232 ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); | 232 ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); |
| 233 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); | 233 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 // Tests that we deal with file-level pending operations at destruction time. | 236 // Tests that we deal with file-level pending operations at destruction time. |
| 237 TEST_F(DiskCacheTest, ShutdownWithPendingIO) { | 237 TEST_F(DiskCacheTest, ShutdownWithPendingIO) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 SetMaxSize(cache_size); | 348 SetMaxSize(cache_size); |
| 349 InitCache(); | 349 InitCache(); |
| 350 | 350 |
| 351 std::string first("some key"); | 351 std::string first("some key"); |
| 352 std::string second("something else"); | 352 std::string second("something else"); |
| 353 disk_cache::Entry* entry; | 353 disk_cache::Entry* entry; |
| 354 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); | 354 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); |
| 355 | 355 |
| 356 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(cache_size); | 356 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(cache_size); |
| 357 memset(buffer->data(), 0, cache_size); | 357 memset(buffer->data(), 0, cache_size); |
| 358 EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 358 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, |
| 359 NULL, false)) << "normal file"; | 359 false)) << "normal file"; |
| 360 | 360 |
| 361 EXPECT_EQ(net::ERR_FAILED, entry->WriteData(1, 0, buffer, cache_size / 5, | 361 EXPECT_EQ(net::ERR_FAILED, WriteData(entry, 1, 0, buffer, cache_size / 5, |
| 362 NULL, false)) << "file size above the limit"; | 362 false)) << "file size above the limit"; |
| 363 | 363 |
| 364 // By doubling the total size, we make this file cacheable. | 364 // By doubling the total size, we make this file cacheable. |
| 365 SetMaxSize(cache_size * 2); | 365 SetMaxSize(cache_size * 2); |
| 366 EXPECT_EQ(cache_size / 5, entry->WriteData(1, 0, buffer, cache_size / 5, | 366 EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer, cache_size / 5, |
| 367 NULL, false)); | 367 false)); |
| 368 | 368 |
| 369 // Let's fill up the cache!. | 369 // Let's fill up the cache!. |
| 370 SetMaxSize(cache_size * 10); | 370 SetMaxSize(cache_size * 10); |
| 371 EXPECT_EQ(cache_size * 3 / 4, entry->WriteData(0, 0, buffer, | 371 EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer, |
| 372 cache_size * 3 / 4, NULL, false)); | 372 cache_size * 3 / 4, false)); |
| 373 entry->Close(); | 373 entry->Close(); |
| 374 FlushQueueForTest(); | 374 FlushQueueForTest(); |
| 375 | 375 |
| 376 SetMaxSize(cache_size); | 376 SetMaxSize(cache_size); |
| 377 | 377 |
| 378 // The cache is 95% full. | 378 // The cache is 95% full. |
| 379 | 379 |
| 380 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); | 380 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); |
| 381 EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 381 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, |
| 382 NULL, false)); | 382 false)); |
| 383 | 383 |
| 384 disk_cache::Entry* entry2; | 384 disk_cache::Entry* entry2; |
| 385 ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); | 385 ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); |
| 386 EXPECT_EQ(cache_size / 10, entry2->WriteData(0, 0, buffer, cache_size / 10, | 386 EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, |
| 387 NULL, false)); | 387 false)); |
| 388 entry2->Close(); // This will trigger the cache trim. | 388 entry2->Close(); // This will trigger the cache trim. |
| 389 | 389 |
| 390 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); | 390 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); |
| 391 | 391 |
| 392 FlushQueueForTest(); // Make sure that we are done trimming the cache. | 392 FlushQueueForTest(); // Make sure that we are done trimming the cache. |
| 393 FlushQueueForTest(); // We may have posted two tasks to evict stuff. | 393 FlushQueueForTest(); // We may have posted two tasks to evict stuff. |
| 394 | 394 |
| 395 entry->Close(); | 395 entry->Close(); |
| 396 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); | 396 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); |
| 397 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); | 397 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 SetMemoryOnlyMode(); | 465 SetMemoryOnlyMode(); |
| 466 BackendLoad(); | 466 BackendLoad(); |
| 467 } | 467 } |
| 468 | 468 |
| 469 // Before looking for invalid entries, let's check a valid entry. | 469 // Before looking for invalid entries, let's check a valid entry. |
| 470 void DiskCacheBackendTest::BackendValidEntry() { | 470 void DiskCacheBackendTest::BackendValidEntry() { |
| 471 SetDirectMode(); | 471 SetDirectMode(); |
| 472 InitCache(); | 472 InitCache(); |
| 473 | 473 |
| 474 std::string key("Some key"); | 474 std::string key("Some key"); |
| 475 disk_cache::Entry* entry1; | 475 disk_cache::Entry* entry; |
| 476 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); | 476 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 477 | 477 |
| 478 const int kSize = 50; | 478 const int kSize = 50; |
| 479 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 479 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 480 memset(buffer1->data(), 0, kSize); | 480 memset(buffer1->data(), 0, kSize); |
| 481 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 481 base::strlcpy(buffer1->data(), "And the data to save", kSize); |
| 482 EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 482 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1, kSize, false)); |
| 483 entry1->Close(); | 483 entry->Close(); |
| 484 SimulateCrash(); | 484 SimulateCrash(); |
| 485 | 485 |
| 486 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); | 486 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 487 | 487 |
| 488 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); | 488 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); |
| 489 memset(buffer2->data(), 0, kSize); | 489 memset(buffer2->data(), 0, kSize); |
| 490 EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer2, kSize, NULL)); | 490 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2, kSize)); |
| 491 entry1->Close(); | 491 entry->Close(); |
| 492 EXPECT_STREQ(buffer1->data(), buffer2->data()); | 492 EXPECT_STREQ(buffer1->data(), buffer2->data()); |
| 493 } | 493 } |
| 494 | 494 |
| 495 TEST_F(DiskCacheBackendTest, ValidEntry) { | 495 TEST_F(DiskCacheBackendTest, ValidEntry) { |
| 496 BackendValidEntry(); | 496 BackendValidEntry(); |
| 497 } | 497 } |
| 498 | 498 |
| 499 TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { | 499 TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { |
| 500 SetNewEviction(); | 500 SetNewEviction(); |
| 501 BackendValidEntry(); | 501 BackendValidEntry(); |
| 502 } | 502 } |
| 503 | 503 |
| 504 // The same logic of the previous test (ValidEntry), but this time force the | 504 // The same logic of the previous test (ValidEntry), but this time force the |
| 505 // entry to be invalid, simulating a crash in the middle. | 505 // entry to be invalid, simulating a crash in the middle. |
| 506 // We'll be leaking memory from this test. | 506 // We'll be leaking memory from this test. |
| 507 void DiskCacheBackendTest::BackendInvalidEntry() { | 507 void DiskCacheBackendTest::BackendInvalidEntry() { |
| 508 // Use the implementation directly... we need to simulate a crash. | 508 // Use the implementation directly... we need to simulate a crash. |
| 509 SetDirectMode(); | 509 SetDirectMode(); |
| 510 InitCache(); | 510 InitCache(); |
| 511 | 511 |
| 512 std::string key("Some key"); | 512 std::string key("Some key"); |
| 513 disk_cache::Entry* entry1; | 513 disk_cache::Entry* entry; |
| 514 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); | 514 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 515 | 515 |
| 516 const int kSize = 50; | 516 const int kSize = 50; |
| 517 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 517 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 518 memset(buffer1->data(), 0, kSize); | 518 memset(buffer->data(), 0, kSize); |
| 519 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 519 base::strlcpy(buffer->data(), "And the data to save", kSize); |
| 520 EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 520 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 521 SimulateCrash(); | 521 SimulateCrash(); |
| 522 | 522 |
| 523 EXPECT_NE(net::OK, OpenEntry(key, &entry1)); | 523 EXPECT_NE(net::OK, OpenEntry(key, &entry)); |
| 524 EXPECT_EQ(0, cache_->GetEntryCount()); | 524 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 525 } | 525 } |
| 526 | 526 |
| 527 // This and the other intentionally leaky tests below are excluded from | 527 // This and the other intentionally leaky tests below are excluded from |
| 528 // purify and valgrind runs by naming them in the files | 528 // purify and valgrind runs by naming them in the files |
| 529 // net/data/purify/net_unittests.exe.gtest.txt and | 529 // net/data/purify/net_unittests.exe.gtest.txt and |
| 530 // net/data/valgrind/net_unittests.gtest.txt | 530 // net/data/valgrind/net_unittests.gtest.txt |
| 531 // The scripts tools/{purify,valgrind}/chrome_tests.sh | 531 // The scripts tools/{purify,valgrind}/chrome_tests.sh |
| 532 // read those files and pass the appropriate --gtest_filter to net_unittests. | 532 // read those files and pass the appropriate --gtest_filter to net_unittests. |
| 533 TEST_F(DiskCacheBackendTest, InvalidEntry) { | 533 TEST_F(DiskCacheBackendTest, InvalidEntry) { |
| 534 BackendInvalidEntry(); | 534 BackendInvalidEntry(); |
| 535 } | 535 } |
| 536 | 536 |
| 537 // We'll be leaking memory from this test. | 537 // We'll be leaking memory from this test. |
| 538 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { | 538 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { |
| 539 SetNewEviction(); | 539 SetNewEviction(); |
| 540 BackendInvalidEntry(); | 540 BackendInvalidEntry(); |
| 541 } | 541 } |
| 542 | 542 |
| 543 // Almost the same test, but this time crash the cache after reading an entry. | 543 // Almost the same test, but this time crash the cache after reading an entry. |
| 544 // We'll be leaking memory from this test. | 544 // We'll be leaking memory from this test. |
| 545 void DiskCacheBackendTest::BackendInvalidEntryRead() { | 545 void DiskCacheBackendTest::BackendInvalidEntryRead() { |
| 546 // Use the implementation directly... we need to simulate a crash. | 546 // Use the implementation directly... we need to simulate a crash. |
| 547 SetDirectMode(); | 547 SetDirectMode(); |
| 548 InitCache(); | 548 InitCache(); |
| 549 | 549 |
| 550 std::string key("Some key"); | 550 std::string key("Some key"); |
| 551 disk_cache::Entry* entry1; | 551 disk_cache::Entry* entry; |
| 552 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); | 552 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 553 | 553 |
| 554 const int kSize = 50; | 554 const int kSize = 50; |
| 555 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 555 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 556 memset(buffer1->data(), 0, kSize); | 556 memset(buffer->data(), 0, kSize); |
| 557 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 557 base::strlcpy(buffer->data(), "And the data to save", kSize); |
| 558 EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 558 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 559 entry1->Close(); | 559 entry->Close(); |
| 560 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); | 560 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 561 EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer1, kSize, NULL)); | 561 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); |
| 562 | 562 |
| 563 SimulateCrash(); | 563 SimulateCrash(); |
| 564 | 564 |
| 565 EXPECT_NE(net::OK, OpenEntry(key, &entry1)); | 565 EXPECT_NE(net::OK, OpenEntry(key, &entry)); |
| 566 EXPECT_EQ(0, cache_->GetEntryCount()); | 566 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 567 } | 567 } |
| 568 | 568 |
| 569 // We'll be leaking memory from this test. | 569 // We'll be leaking memory from this test. |
| 570 TEST_F(DiskCacheBackendTest, InvalidEntryRead) { | 570 TEST_F(DiskCacheBackendTest, InvalidEntryRead) { |
| 571 BackendInvalidEntryRead(); | 571 BackendInvalidEntryRead(); |
| 572 } | 572 } |
| 573 | 573 |
| 574 // We'll be leaking memory from this test. | 574 // We'll be leaking memory from this test. |
| 575 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) { | 575 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 646 SetMaxSize(kSize * 10); | 646 SetMaxSize(kSize * 10); |
| 647 InitCache(); | 647 InitCache(); |
| 648 | 648 |
| 649 std::string first("some key"); | 649 std::string first("some key"); |
| 650 std::string second("something else"); | 650 std::string second("something else"); |
| 651 disk_cache::Entry* entry; | 651 disk_cache::Entry* entry; |
| 652 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); | 652 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); |
| 653 | 653 |
| 654 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); | 654 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 655 memset(buffer->data(), 0, kSize); | 655 memset(buffer->data(), 0, kSize); |
| 656 EXPECT_EQ(kSize, entry->WriteData(0, 0, buffer, kSize, NULL, false)); | 656 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 657 | 657 |
| 658 // Simulate a crash. | 658 // Simulate a crash. |
| 659 SimulateCrash(); | 659 SimulateCrash(); |
| 660 | 660 |
| 661 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); | 661 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); |
| 662 EXPECT_EQ(kSize, entry->WriteData(0, 0, buffer, kSize, NULL, false)); | 662 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 663 | 663 |
| 664 EXPECT_EQ(2, cache_->GetEntryCount()); | 664 EXPECT_EQ(2, cache_->GetEntryCount()); |
| 665 SetMaxSize(kSize); | 665 SetMaxSize(kSize); |
| 666 entry->Close(); // Trim the cache. | 666 entry->Close(); // Trim the cache. |
| 667 FlushQueueForTest(); | 667 FlushQueueForTest(); |
| 668 | 668 |
| 669 // If we evicted the entry in less than 20mS, we have one entry in the cache; | 669 // If we evicted the entry in less than 20mS, we have one entry in the cache; |
| 670 // if it took more than that, we posted a task and we'll delete the second | 670 // if it took more than that, we posted a task and we'll delete the second |
| 671 // entry too. | 671 // entry too. |
| 672 MessageLoop::current()->RunAllPending(); | 672 MessageLoop::current()->RunAllPending(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 696 InitCache(); | 696 InitCache(); |
| 697 | 697 |
| 698 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); | 698 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 699 memset(buffer->data(), 0, kSize); | 699 memset(buffer->data(), 0, kSize); |
| 700 disk_cache::Entry* entry; | 700 disk_cache::Entry* entry; |
| 701 | 701 |
| 702 // Writing 32 entries to this cache chains most of them. | 702 // Writing 32 entries to this cache chains most of them. |
| 703 for (int i = 0; i < 32; i++) { | 703 for (int i = 0; i < 32; i++) { |
| 704 std::string key(StringPrintf("some key %d", i)); | 704 std::string key(StringPrintf("some key %d", i)); |
| 705 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 705 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 706 EXPECT_EQ(kSize, entry->WriteData(0, 0, buffer, kSize, NULL, false)); | 706 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 707 entry->Close(); | 707 entry->Close(); |
| 708 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 708 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 709 // Note that we are not closing the entries. | 709 // Note that we are not closing the entries. |
| 710 } | 710 } |
| 711 | 711 |
| 712 // Simulate a crash. | 712 // Simulate a crash. |
| 713 SimulateCrash(); | 713 SimulateCrash(); |
| 714 | 714 |
| 715 ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); | 715 ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); |
| 716 EXPECT_EQ(kSize, entry->WriteData(0, 0, buffer, kSize, NULL, false)); | 716 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 717 | 717 |
| 718 EXPECT_EQ(33, cache_->GetEntryCount()); | 718 EXPECT_EQ(33, cache_->GetEntryCount()); |
| 719 SetMaxSize(kSize); | 719 SetMaxSize(kSize); |
| 720 | 720 |
| 721 // For the new eviction code, all corrupt entries are on the second list so | 721 // For the new eviction code, all corrupt entries are on the second list so |
| 722 // they are not going away that easy. | 722 // they are not going away that easy. |
| 723 if (new_eviction_) { | 723 if (new_eviction_) { |
| 724 EXPECT_EQ(net::OK, DoomAllEntries()); | 724 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 725 } | 725 } |
| 726 | 726 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 859 InitCache(); | 859 InitCache(); |
| 860 | 860 |
| 861 std::string key("Some key"); | 861 std::string key("Some key"); |
| 862 disk_cache::Entry *entry, *entry1, *entry2; | 862 disk_cache::Entry *entry, *entry1, *entry2; |
| 863 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); | 863 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); |
| 864 | 864 |
| 865 const int kSize = 50; | 865 const int kSize = 50; |
| 866 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 866 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 867 memset(buffer1->data(), 0, kSize); | 867 memset(buffer1->data(), 0, kSize); |
| 868 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 868 base::strlcpy(buffer1->data(), "And the data to save", kSize); |
| 869 EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 869 EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false)); |
| 870 entry1->Close(); | 870 entry1->Close(); |
| 871 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); | 871 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); |
| 872 EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer1, kSize, NULL)); | 872 EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize)); |
| 873 | 873 |
| 874 std::string key2("Another key"); | 874 std::string key2("Another key"); |
| 875 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); | 875 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); |
| 876 entry2->Close(); | 876 entry2->Close(); |
| 877 ASSERT_EQ(2, cache_->GetEntryCount()); | 877 ASSERT_EQ(2, cache_->GetEntryCount()); |
| 878 | 878 |
| 879 SimulateCrash(); | 879 SimulateCrash(); |
| 880 | 880 |
| 881 void* iter = NULL; | 881 void* iter = NULL; |
| 882 int count = 0; | 882 int count = 0; |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1492 CacheTestFillBuffer(key2, sizeof(key2), true); | 1492 CacheTestFillBuffer(key2, sizeof(key2), true); |
| 1493 CacheTestFillBuffer(key3, sizeof(key3), true); | 1493 CacheTestFillBuffer(key3, sizeof(key3), true); |
| 1494 key2[sizeof(key2) - 1] = '\0'; | 1494 key2[sizeof(key2) - 1] = '\0'; |
| 1495 key3[sizeof(key3) - 1] = '\0'; | 1495 key3[sizeof(key3) - 1] = '\0'; |
| 1496 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); | 1496 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); |
| 1497 ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); | 1497 ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); |
| 1498 | 1498 |
| 1499 const int kBufSize = 20000; | 1499 const int kBufSize = 20000; |
| 1500 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kBufSize); | 1500 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kBufSize); |
| 1501 memset(buf->data(), 0, kBufSize); | 1501 memset(buf->data(), 0, kBufSize); |
| 1502 EXPECT_EQ(100, entry2->WriteData(0, 0, buf, 100, NULL, false)); | 1502 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); |
| 1503 EXPECT_EQ(kBufSize, entry3->WriteData(0, 0, buf, kBufSize, NULL, false)); | 1503 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); |
| 1504 | 1504 |
| 1505 // This line should disable the cache but not delete it. | 1505 // This line should disable the cache but not delete it. |
| 1506 EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); | 1506 EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); |
| 1507 EXPECT_EQ(4, cache_->GetEntryCount()); | 1507 EXPECT_EQ(4, cache_->GetEntryCount()); |
| 1508 | 1508 |
| 1509 EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); | 1509 EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); |
| 1510 | 1510 |
| 1511 EXPECT_EQ(100, entry2->ReadData(0, 0, buf, 100, NULL)); | 1511 EXPECT_EQ(100, ReadData(entry2, 0, 0, buf, 100)); |
| 1512 EXPECT_EQ(100, entry2->WriteData(0, 0, buf, 100, NULL, false)); | 1512 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); |
| 1513 EXPECT_EQ(100, entry2->WriteData(1, 0, buf, 100, NULL, false)); | 1513 EXPECT_EQ(100, WriteData(entry2, 1, 0, buf, 100, false)); |
| 1514 | 1514 |
| 1515 EXPECT_EQ(kBufSize, entry3->ReadData(0, 0, buf, kBufSize, NULL)); | 1515 EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf, kBufSize)); |
| 1516 EXPECT_EQ(kBufSize, entry3->WriteData(0, 0, buf, kBufSize, NULL, false)); | 1516 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); |
| 1517 EXPECT_EQ(kBufSize, entry3->WriteData(1, 0, buf, kBufSize, NULL, false)); | 1517 EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf, kBufSize, false)); |
| 1518 | 1518 |
| 1519 std::string key = entry2->GetKey(); | 1519 std::string key = entry2->GetKey(); |
| 1520 EXPECT_EQ(sizeof(key2) - 1, key.size()); | 1520 EXPECT_EQ(sizeof(key2) - 1, key.size()); |
| 1521 key = entry3->GetKey(); | 1521 key = entry3->GetKey(); |
| 1522 EXPECT_EQ(sizeof(key3) - 1, key.size()); | 1522 EXPECT_EQ(sizeof(key3) - 1, key.size()); |
| 1523 | 1523 |
| 1524 entry1->Close(); | 1524 entry1->Close(); |
| 1525 entry2->Close(); | 1525 entry2->Close(); |
| 1526 entry3->Close(); | 1526 entry3->Close(); |
| 1527 FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. | 1527 FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1740 // another. | 1740 // another. |
| 1741 TEST_F(DiskCacheBackendTest, Histograms) { | 1741 TEST_F(DiskCacheBackendTest, Histograms) { |
| 1742 SetDirectMode(); | 1742 SetDirectMode(); |
| 1743 InitCache(); | 1743 InitCache(); |
| 1744 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. | 1744 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. |
| 1745 | 1745 |
| 1746 for (int i = 1; i < 3; i++) { | 1746 for (int i = 1; i < 3; i++) { |
| 1747 CACHE_UMA(HOURS, "FillupTime", i, 28); | 1747 CACHE_UMA(HOURS, "FillupTime", i, 28); |
| 1748 } | 1748 } |
| 1749 } | 1749 } |
| 1750 | |
| 1751 // Make sure that we keep the total memory used by the internal buffers under | |
| 1752 // control. | |
| 1753 TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { | |
| 1754 SetDirectMode(); | |
| 1755 InitCache(); | |
| 1756 std::string key("the first key"); | |
| 1757 disk_cache::Entry* entry; | |
| 1758 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | |
| 1759 | |
| 1760 const int kSize = 200; | |
| 1761 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); | |
| 1762 CacheTestFillBuffer(buffer->data(), kSize, true); | |
| 1763 | |
| 1764 for (int i = 0; i < 10; i++) { | |
| 1765 SCOPED_TRACE(i); | |
| 1766 // Allocate 2MB for this entry. | |
| 1767 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); | |
| 1768 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); | |
| 1769 EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); | |
| 1770 EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); | |
| 1771 | |
| 1772 // Delete one of the buffers and truncate the other. | |
| 1773 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); | |
| 1774 EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); | |
| 1775 | |
| 1776 // Delete the second buffer, writing 10 bytes to disk. | |
| 1777 entry->Close(); | |
| 1778 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | |
| 1779 } | |
| 1780 | |
| 1781 entry->Close(); | |
| 1782 EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); | |
| 1783 } | |
| 1784 | |
| 1785 // This test assumes at least 150MB of system memory. | |
| 1786 TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { | |
| 1787 SetDirectMode(); | |
| 1788 InitCache(); | |
| 1789 | |
| 1790 const int kOneMB = 1024 * 1024; | |
| 1791 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | |
| 1792 EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); | |
| 1793 | |
| 1794 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | |
| 1795 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | |
| 1796 | |
| 1797 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | |
| 1798 EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); | |
| 1799 | |
| 1800 cache_impl_->BufferDeleted(kOneMB); | |
| 1801 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | |
| 1802 | |
| 1803 // Check the upper limit. | |
| 1804 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); | |
| 1805 | |
| 1806 for (int i = 0; i < 30; i++) | |
| 1807 cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. | |
| 1808 | |
| 1809 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); | |
| 1810 } | |
|
gavinp
2010/08/19 18:17:22
NIT: add a newline here
| |
| OLD | NEW |