| 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/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/port.h" | 7 #include "base/port.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 10 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" | 10 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 class DiskCacheBackendTest : public DiskCacheTestWithCache { | 38 class DiskCacheBackendTest : public DiskCacheTestWithCache { |
| 39 protected: | 39 protected: |
| 40 void BackendBasics(); | 40 void BackendBasics(); |
| 41 void BackendKeying(); | 41 void BackendKeying(); |
| 42 void BackendShutdownWithPendingFileIO(bool fast); | 42 void BackendShutdownWithPendingFileIO(bool fast); |
| 43 void BackendShutdownWithPendingIO(bool fast); | 43 void BackendShutdownWithPendingIO(bool fast); |
| 44 void BackendShutdownWithPendingCreate(bool fast); | 44 void BackendShutdownWithPendingCreate(bool fast); |
| 45 void BackendSetSize(); | 45 void BackendSetSize(); |
| 46 void BackendLoad(); | 46 void BackendLoad(); |
| 47 void BackendChain(); | 47 void BackendChain(); |
| 48 void BucketUse(); |
| 49 void BackendNewEvictionTrim(); |
| 48 void BackendValidEntry(); | 50 void BackendValidEntry(); |
| 49 void BackendInvalidEntry(); | 51 void BackendInvalidEntry(); |
| 50 void BackendInvalidEntryRead(); | 52 void BackendInvalidEntryRead(); |
| 51 void BackendInvalidEntryWithLoad(); | 53 void BackendInvalidEntryWithLoad(); |
| 52 void BackendTrimInvalidEntry(); | 54 void BackendTrimInvalidEntry(); |
| 53 void BackendTrimInvalidEntry2(); | 55 void BackendTrimInvalidEntry2(); |
| 54 void BackendEnumerations(); | 56 void BackendEnumerations(); |
| 55 void BackendEnumerations2(); | 57 void BackendEnumerations2(); |
| 56 void BackendInvalidEntryEnumeration(); | 58 void BackendInvalidEntryEnumeration(); |
| 57 void BackendFixEnumerators(); | 59 void BackendFixEnumerators(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 76 void BackendInvalidEntry11(bool eviction); | 78 void BackendInvalidEntry11(bool eviction); |
| 77 void BackendTrimInvalidEntry12(); | 79 void BackendTrimInvalidEntry12(); |
| 78 void BackendDoomAll(); | 80 void BackendDoomAll(); |
| 79 void BackendDoomAll2(); | 81 void BackendDoomAll2(); |
| 80 void BackendInvalidRankings(); | 82 void BackendInvalidRankings(); |
| 81 void BackendInvalidRankings2(); | 83 void BackendInvalidRankings2(); |
| 82 void BackendDisable(); | 84 void BackendDisable(); |
| 83 void BackendDisable2(); | 85 void BackendDisable2(); |
| 84 void BackendDisable3(); | 86 void BackendDisable3(); |
| 85 void BackendDisable4(); | 87 void BackendDisable4(); |
| 88 void BackendTotalBuffersSize1(); |
| 89 void BackendTotalBuffersSize2(); |
| 90 void BackendUpdateRankForExternalCacheHit(); |
| 86 void TracingBackendBasics(); | 91 void TracingBackendBasics(); |
| 87 }; | 92 }; |
| 88 | 93 |
| 89 void DiskCacheBackendTest::BackendBasics() { | 94 void DiskCacheBackendTest::BackendBasics() { |
| 90 InitCache(); | 95 InitCache(); |
| 91 disk_cache::Entry *entry1 = NULL, *entry2 = NULL; | 96 disk_cache::Entry *entry1 = NULL, *entry2 = NULL; |
| 92 EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); | 97 EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); |
| 93 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 98 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); |
| 94 ASSERT_TRUE(NULL != entry1); | 99 ASSERT_TRUE(NULL != entry1); |
| 95 entry1->Close(); | 100 entry1->Close(); |
| 96 entry1 = NULL; | 101 entry1 = NULL; |
| 97 | 102 |
| 98 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); | 103 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); |
| 99 ASSERT_TRUE(NULL != entry1); | 104 ASSERT_TRUE(NULL != entry1); |
| 100 entry1->Close(); | 105 entry1->Close(); |
| 101 entry1 = NULL; | 106 entry1 = NULL; |
| 102 | 107 |
| 103 EXPECT_NE(net::OK, CreateEntry("the first key", &entry1)); | 108 EXPECT_NE(net::OK, CreateEntry("the first key", &entry1)); |
| 104 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); | 109 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); |
| 105 EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); | 110 EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); |
| 106 ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); | 111 ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); |
| 107 ASSERT_TRUE(NULL != entry1); | 112 ASSERT_TRUE(NULL != entry1); |
| 108 ASSERT_TRUE(NULL != entry2); | 113 ASSERT_TRUE(NULL != entry2); |
| 109 EXPECT_EQ(2, cache_->GetEntryCount()); | 114 EXPECT_EQ(2, cache_->GetEntryCount()); |
| 110 | 115 |
| 111 disk_cache::Entry* entry3 = NULL; | 116 disk_cache::Entry* entry3 = NULL; |
| 112 ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3)); | 117 ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 TEST_F(DiskCacheBackendTest, AppCacheBasics) { | 154 TEST_F(DiskCacheBackendTest, AppCacheBasics) { |
| 150 SetCacheType(net::APP_CACHE); | 155 SetCacheType(net::APP_CACHE); |
| 151 BackendBasics(); | 156 BackendBasics(); |
| 152 } | 157 } |
| 153 | 158 |
| 154 TEST_F(DiskCacheBackendTest, ShaderCacheBasics) { | 159 TEST_F(DiskCacheBackendTest, ShaderCacheBasics) { |
| 155 SetCacheType(net::SHADER_CACHE); | 160 SetCacheType(net::SHADER_CACHE); |
| 156 BackendBasics(); | 161 BackendBasics(); |
| 157 } | 162 } |
| 158 | 163 |
| 164 TEST_F(DiskCacheBackendTest, V3Basics) { |
| 165 UseVersion3(); |
| 166 BackendBasics(); |
| 167 } |
| 168 |
| 159 void DiskCacheBackendTest::BackendKeying() { | 169 void DiskCacheBackendTest::BackendKeying() { |
| 160 InitCache(); | 170 InitCache(); |
| 161 const char* kName1 = "the first key"; | 171 const char* kName1 = "the first key"; |
| 162 const char* kName2 = "the first Key"; | 172 const char* kName2 = "the first Key"; |
| 163 disk_cache::Entry *entry1, *entry2; | 173 disk_cache::Entry *entry1, *entry2; |
| 164 ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); | 174 ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); |
| 165 | 175 |
| 166 ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); | 176 ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); |
| 167 EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; | 177 EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; |
| 168 entry2->Close(); | 178 entry2->Close(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 194 buffer2[19999] = '\0'; | 204 buffer2[19999] = '\0'; |
| 195 ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; | 205 ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; |
| 196 entry2->Close(); | 206 entry2->Close(); |
| 197 entry1->Close(); | 207 entry1->Close(); |
| 198 } | 208 } |
| 199 | 209 |
| 200 TEST_F(DiskCacheBackendTest, Keying) { | 210 TEST_F(DiskCacheBackendTest, Keying) { |
| 201 BackendKeying(); | 211 BackendKeying(); |
| 202 } | 212 } |
| 203 | 213 |
| 214 TEST_F(DiskCacheBackendTest, V3Keying) { |
| 215 UseVersion3(); |
| 216 BackendKeying(); |
| 217 } |
| 218 |
| 204 TEST_F(DiskCacheBackendTest, NewEvictionKeying) { | 219 TEST_F(DiskCacheBackendTest, NewEvictionKeying) { |
| 205 SetNewEviction(); | 220 SetNewEviction(); |
| 206 BackendKeying(); | 221 BackendKeying(); |
| 207 } | 222 } |
| 208 | 223 |
| 224 TEST_F(DiskCacheBackendTest, V3NewEvictionKeying) { |
| 225 UseVersion3(); |
| 226 SetNewEviction(); |
| 227 BackendKeying(); |
| 228 } |
| 229 |
| 209 TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { | 230 TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { |
| 210 SetMemoryOnlyMode(); | 231 SetMemoryOnlyMode(); |
| 211 BackendKeying(); | 232 BackendKeying(); |
| 212 } | 233 } |
| 213 | 234 |
| 214 TEST_F(DiskCacheBackendTest, AppCacheKeying) { | 235 TEST_F(DiskCacheBackendTest, AppCacheKeying) { |
| 215 SetCacheType(net::APP_CACHE); | 236 SetCacheType(net::APP_CACHE); |
| 216 BackendKeying(); | 237 BackendKeying(); |
| 217 } | 238 } |
| 218 | 239 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { | 329 void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { |
| 309 net::TestCompletionCallback cb; | 330 net::TestCompletionCallback cb; |
| 310 int rv; | 331 int rv; |
| 311 | 332 |
| 312 { | 333 { |
| 313 ASSERT_TRUE(CleanupCacheDir()); | 334 ASSERT_TRUE(CleanupCacheDir()); |
| 314 base::Thread cache_thread("CacheThread"); | 335 base::Thread cache_thread("CacheThread"); |
| 315 ASSERT_TRUE(cache_thread.StartWithOptions( | 336 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 316 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 337 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 317 | 338 |
| 318 uint32 flags = disk_cache::kNoBuffering; | 339 if (fast) |
| 319 if (!fast) | 340 AvoidTestFlag(); |
| 320 flags |= disk_cache::kNoRandom; | |
| 321 | 341 |
| 322 UseCurrentThread(); | 342 UseCurrentThread(); |
| 323 CreateBackend(flags, NULL); | 343 CreateBackend(NULL); |
| 344 SetNoBuffering(); |
| 324 | 345 |
| 325 disk_cache::EntryImpl* entry; | 346 disk_cache::EntryImpl* entry; |
| 326 rv = cache_->CreateEntry( | 347 rv = cache_->CreateEntry( |
| 327 "some key", reinterpret_cast<disk_cache::Entry**>(&entry), | 348 "some key", reinterpret_cast<disk_cache::Entry**>(&entry), |
| 328 cb.callback()); | 349 cb.callback()); |
| 329 ASSERT_EQ(net::OK, cb.GetResult(rv)); | 350 ASSERT_EQ(net::OK, cb.GetResult(rv)); |
| 330 | 351 |
| 331 const int kSize = 25000; | 352 const int kSize = 25000; |
| 332 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 353 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 333 CacheTestFillBuffer(buffer->data(), kSize, false); | 354 CacheTestFillBuffer(buffer->data(), kSize, false); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 // Tests that we deal with background-thread pending operations. | 406 // Tests that we deal with background-thread pending operations. |
| 386 void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { | 407 void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { |
| 387 net::TestCompletionCallback cb; | 408 net::TestCompletionCallback cb; |
| 388 | 409 |
| 389 { | 410 { |
| 390 ASSERT_TRUE(CleanupCacheDir()); | 411 ASSERT_TRUE(CleanupCacheDir()); |
| 391 base::Thread cache_thread("CacheThread"); | 412 base::Thread cache_thread("CacheThread"); |
| 392 ASSERT_TRUE(cache_thread.StartWithOptions( | 413 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 393 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 414 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 394 | 415 |
| 395 uint32 flags = disk_cache::kNoBuffering; | 416 if (fast) |
| 396 if (!fast) | 417 AvoidTestFlag(); |
| 397 flags |= disk_cache::kNoRandom; | |
| 398 | 418 |
| 399 CreateBackend(flags, &cache_thread); | 419 CreateBackend(&cache_thread); |
| 420 SetNoBuffering(); |
| 400 | 421 |
| 401 disk_cache::Entry* entry; | 422 disk_cache::Entry* entry; |
| 402 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); | 423 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); |
| 403 ASSERT_EQ(net::OK, cb.GetResult(rv)); | 424 ASSERT_EQ(net::OK, cb.GetResult(rv)); |
| 404 | 425 |
| 405 entry->Close(); | 426 entry->Close(); |
| 406 | 427 |
| 407 // The cache destructor will see one pending operation here. | 428 // The cache destructor will see one pending operation here. |
| 408 delete cache_; | 429 delete cache_; |
| 409 // Prevent the TearDown() to delete the backend again. | 430 // Prevent the TearDown() to delete the backend again. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 428 // Tests that we deal with create-type pending operations. | 449 // Tests that we deal with create-type pending operations. |
| 429 void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { | 450 void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { |
| 430 net::TestCompletionCallback cb; | 451 net::TestCompletionCallback cb; |
| 431 | 452 |
| 432 { | 453 { |
| 433 ASSERT_TRUE(CleanupCacheDir()); | 454 ASSERT_TRUE(CleanupCacheDir()); |
| 434 base::Thread cache_thread("CacheThread"); | 455 base::Thread cache_thread("CacheThread"); |
| 435 ASSERT_TRUE(cache_thread.StartWithOptions( | 456 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 436 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 457 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 437 | 458 |
| 438 disk_cache::BackendFlags flags = | 459 if (fast) |
| 439 fast ? disk_cache::kNone : disk_cache::kNoRandom; | 460 AvoidTestFlag(); |
| 440 CreateBackend(flags, &cache_thread); | 461 CreateBackend(&cache_thread); |
| 441 | 462 |
| 442 disk_cache::Entry* entry; | 463 disk_cache::Entry* entry; |
| 443 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); | 464 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); |
| 444 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 465 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 445 | 466 |
| 446 delete cache_; | 467 delete cache_; |
| 447 // Prevent the TearDown() to delete the backend again. | 468 // Prevent the TearDown() to delete the backend again. |
| 448 cache_ = NULL; | 469 cache_ = NULL; |
| 449 EXPECT_FALSE(cb.have_result()); | 470 EXPECT_FALSE(cb.have_result()); |
| 450 } | 471 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 | 537 |
| 517 SetMaxSize(cache_size); | 538 SetMaxSize(cache_size); |
| 518 | 539 |
| 519 // The cache is 95% full. | 540 // The cache is 95% full. |
| 520 | 541 |
| 521 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); | 542 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); |
| 522 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, | 543 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, |
| 523 false)); | 544 false)); |
| 524 | 545 |
| 525 disk_cache::Entry* entry2; | 546 disk_cache::Entry* entry2; |
| 526 ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); | 547 std::string extra_key("an extra key"); |
| 548 ASSERT_EQ(net::OK, CreateEntry(extra_key, &entry2)); |
| 527 EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, | 549 EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, |
| 528 false)); | 550 false)); |
| 529 entry2->Close(); // This will trigger the cache trim. | 551 entry2->Close(); // This will trigger the cache trim. |
| 530 | 552 WaitForEntryToClose(extra_key); |
| 531 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); | |
| 532 | 553 |
| 533 FlushQueueForTest(); // Make sure that we are done trimming the cache. | 554 FlushQueueForTest(); // Make sure that we are done trimming the cache. |
| 534 FlushQueueForTest(); // We may have posted two tasks to evict stuff. | 555 FlushQueueForTest(); // We may have posted two tasks to evict stuff. |
| 535 | 556 |
| 536 entry->Close(); | 557 entry->Close(); |
| 558 WaitForEntryToClose(second); |
| 559 |
| 560 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); |
| 537 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); | 561 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); |
| 538 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); | 562 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); |
| 539 entry->Close(); | 563 entry->Close(); |
| 540 } | 564 } |
| 541 | 565 |
| 542 TEST_F(DiskCacheBackendTest, SetSize) { | 566 TEST_F(DiskCacheBackendTest, SetSize) { |
| 543 BackendSetSize(); | 567 BackendSetSize(); |
| 544 } | 568 } |
| 545 | 569 |
| 570 TEST_F(DiskCacheBackendTest, V3SetSize) { |
| 571 UseVersion3(); |
| 572 UseVersion3(); |
| 573 SetNewEviction(); |
| 574 BackendSetSize(); |
| 575 } |
| 576 |
| 546 TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { | 577 TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { |
| 547 SetNewEviction(); | 578 SetNewEviction(); |
| 548 BackendSetSize(); | 579 BackendSetSize(); |
| 549 } | 580 } |
| 550 | 581 |
| 582 TEST_F(DiskCacheBackendTest, V3NewEvictionSetSize) { |
| 583 UseVersion3(); |
| 584 SetNewEviction(); |
| 585 BackendSetSize(); |
| 586 } |
| 587 |
| 551 TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { | 588 TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { |
| 552 SetMemoryOnlyMode(); | 589 SetMemoryOnlyMode(); |
| 553 BackendSetSize(); | 590 BackendSetSize(); |
| 554 } | 591 } |
| 555 | 592 |
| 556 void DiskCacheBackendTest::BackendLoad() { | 593 void DiskCacheBackendTest::BackendLoad() { |
| 557 InitCache(); | 594 InitCache(); |
| 558 int seed = static_cast<int>(Time::Now().ToInternalValue()); | 595 int seed = static_cast<int>(Time::Now().ToInternalValue()); |
| 559 srand(seed); | 596 srand(seed); |
| 560 | 597 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 TEST_F(DiskCacheBackendTest, AppCacheChain) { | 684 TEST_F(DiskCacheBackendTest, AppCacheChain) { |
| 648 SetCacheType(net::APP_CACHE); | 685 SetCacheType(net::APP_CACHE); |
| 649 BackendChain(); | 686 BackendChain(); |
| 650 } | 687 } |
| 651 | 688 |
| 652 TEST_F(DiskCacheBackendTest, ShaderCacheChain) { | 689 TEST_F(DiskCacheBackendTest, ShaderCacheChain) { |
| 653 SetCacheType(net::SHADER_CACHE); | 690 SetCacheType(net::SHADER_CACHE); |
| 654 BackendChain(); | 691 BackendChain(); |
| 655 } | 692 } |
| 656 | 693 |
| 657 TEST_F(DiskCacheBackendTest, NewEvictionTrim) { | 694 // Tests the proper use of cell buckets while the index grow. |
| 695 void DiskCacheBackendTest::BucketUse() { |
| 696 UseVersion3(); |
| 697 InitCache(); |
| 698 const int kNumEntries = 20; |
| 699 disk_cache::Entry* entries[kNumEntries]; |
| 700 std::string key("The first key"); |
| 701 |
| 702 // This generates kNumEntries collisions so the extra table has to be used. |
| 703 // There are only 2 extra buckets on the test setup, so the index has to grow. |
| 704 for (int i = 0; i < kNumEntries; i++) { |
| 705 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 706 entries[i]->Doom(); |
| 707 FlushQueueForTest(); |
| 708 } |
| 709 |
| 710 for (int i = 0; i < kNumEntries / 2; i++) |
| 711 entries[i]->Close(); |
| 712 |
| 713 for (int i = 0; i < kNumEntries / 2; i++) { |
| 714 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 715 entries[i]->Doom(); |
| 716 } |
| 717 |
| 718 for (int i = 0; i < kNumEntries; i++) |
| 719 entries[i]->Close(); |
| 720 } |
| 721 |
| 722 TEST_F(DiskCacheBackendTest, V3BucketUse) { |
| 723 BucketUse(); |
| 724 } |
| 725 |
| 726 TEST_F(DiskCacheBackendTest, V3DoubleIndexBucketUse) { |
| 727 PresetTestMode(); // Doubles the index instead of a slow growth. |
| 728 BucketUse(); |
| 729 } |
| 730 |
| 731 TEST_F(DiskCacheBackendTest, V3DoubleIndex) { |
| 732 UseVersion3(); |
| 733 PresetTestMode(); |
| 734 InitCache(); |
| 735 |
| 736 disk_cache::Entry* entry; |
| 737 const int kNumEntries = 200; |
| 738 for (int i = 0; i < kNumEntries; i++) { |
| 739 std::string name(base::StringPrintf("Key %d", i)); |
| 740 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); |
| 741 entry->Close(); |
| 742 FlushQueueForTest(); |
| 743 } |
| 744 |
| 745 // Generate enough collisions to force growing the extra table (and with it, |
| 746 // the index). |
| 747 const int kNumSavedEntries = 5; |
| 748 disk_cache::Entry* entries[kNumSavedEntries]; |
| 749 std::string key("The first key"); |
| 750 for (int i = 0; i < kNumSavedEntries; i++) { |
| 751 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 752 entries[i]->Doom(); |
| 753 FlushQueueForTest(); |
| 754 } |
| 755 |
| 756 for (int i = 0; i < kNumSavedEntries; i++) |
| 757 entries[i]->Close(); |
| 758 |
| 759 // Verify that all entries are there. |
| 760 for (int i = 0; i < kNumEntries; i++) { |
| 761 std::string name(base::StringPrintf("Key %d", i)); |
| 762 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); |
| 763 entry->Close(); |
| 764 } |
| 765 } |
| 766 |
| 767 void DiskCacheBackendTest::BackendNewEvictionTrim() { |
| 658 SetNewEviction(); | 768 SetNewEviction(); |
| 659 InitCache(); | 769 InitCache(); |
| 660 | 770 |
| 661 disk_cache::Entry* entry; | 771 disk_cache::Entry* entry; |
| 662 for (int i = 0; i < 100; i++) { | 772 for (int i = 0; i < 100; i++) { |
| 663 std::string name(base::StringPrintf("Key %d", i)); | 773 std::string name(base::StringPrintf("Key %d", i)); |
| 664 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); | 774 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); |
| 665 entry->Close(); | 775 entry->Close(); |
| 666 if (i < 90) { | 776 if (i < 90) { |
| 667 // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. | 777 // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. |
| 668 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); | 778 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); |
| 669 entry->Close(); | 779 entry->Close(); |
| 670 } | 780 } |
| 781 if (!(i % 10)) |
| 782 FlushQueueForTest(); |
| 783 |
| 784 if (i == 0 || i == 90) { |
| 785 WaitForEntryToClose(name); |
| 786 AddDelayForTest(70); |
| 787 } |
| 671 } | 788 } |
| 672 | 789 |
| 673 // The first eviction must come from list 1 (10% limit), the second must come | 790 // The first eviction must come from list 1 (10% limit), the second must come |
| 674 // from list 0. | 791 // from list 0. |
| 675 TrimForTest(false); | 792 TrimForTest(false); |
| 676 EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); | 793 EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); |
| 677 TrimForTest(false); | 794 TrimForTest(false); |
| 678 EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); | 795 EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); |
| 679 | 796 |
| 680 // Double check that we still have the list tails. | 797 // Double check that we still have the list tails. |
| 681 ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); | 798 ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); |
| 682 entry->Close(); | 799 entry->Close(); |
| 683 ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); | 800 ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); |
| 684 entry->Close(); | 801 entry->Close(); |
| 685 } | 802 } |
| 686 | 803 |
| 804 TEST_F(DiskCacheBackendTest, NewEvictionTrim) { |
| 805 BackendNewEvictionTrim(); |
| 806 } |
| 807 |
| 808 TEST_F(DiskCacheBackendTest, V3NewEvictionTrim) { |
| 809 UseVersion3(); |
| 810 BackendNewEvictionTrim(); |
| 811 } |
| 812 |
| 687 // Before looking for invalid entries, let's check a valid entry. | 813 // Before looking for invalid entries, let's check a valid entry. |
| 688 void DiskCacheBackendTest::BackendValidEntry() { | 814 void DiskCacheBackendTest::BackendValidEntry() { |
| 689 InitCache(); | 815 InitCache(); |
| 690 | 816 |
| 691 std::string key("Some key"); | 817 std::string key("Some key"); |
| 692 disk_cache::Entry* entry; | 818 disk_cache::Entry* entry; |
| 693 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 819 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 694 | 820 |
| 695 const int kSize = 50; | 821 const int kSize = 50; |
| 696 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 822 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 Time initial = Time::Now(); | 1137 Time initial = Time::Now(); |
| 1012 int seed = static_cast<int>(initial.ToInternalValue()); | 1138 int seed = static_cast<int>(initial.ToInternalValue()); |
| 1013 srand(seed); | 1139 srand(seed); |
| 1014 | 1140 |
| 1015 const int kNumEntries = 100; | 1141 const int kNumEntries = 100; |
| 1016 for (int i = 0; i < kNumEntries; i++) { | 1142 for (int i = 0; i < kNumEntries; i++) { |
| 1017 std::string key = GenerateKey(true); | 1143 std::string key = GenerateKey(true); |
| 1018 disk_cache::Entry* entry; | 1144 disk_cache::Entry* entry; |
| 1019 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1145 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1020 entry->Close(); | 1146 entry->Close(); |
| 1147 if (!(i % 10)) |
| 1148 FlushQueueForTest(); |
| 1021 } | 1149 } |
| 1022 EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); | 1150 EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); |
| 1023 Time final = Time::Now(); | 1151 Time final = Time::Now(); |
| 1024 | 1152 |
| 1025 disk_cache::Entry* entry; | 1153 disk_cache::Entry* entry; |
| 1026 void* iter = NULL; | 1154 void* iter = NULL; |
| 1027 int count = 0; | 1155 int count = 0; |
| 1028 Time last_modified[kNumEntries]; | 1156 Time last_modified[kNumEntries]; |
| 1029 Time last_used[kNumEntries]; | 1157 Time last_used[kNumEntries]; |
| 1030 while (OpenNextEntry(&iter, &entry) == net::OK) { | 1158 while (OpenNextEntry(&iter, &entry) == net::OK) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1053 entry->Close(); | 1181 entry->Close(); |
| 1054 count++; | 1182 count++; |
| 1055 }; | 1183 }; |
| 1056 EXPECT_EQ(kNumEntries, count); | 1184 EXPECT_EQ(kNumEntries, count); |
| 1057 } | 1185 } |
| 1058 | 1186 |
| 1059 TEST_F(DiskCacheBackendTest, Enumerations) { | 1187 TEST_F(DiskCacheBackendTest, Enumerations) { |
| 1060 BackendEnumerations(); | 1188 BackendEnumerations(); |
| 1061 } | 1189 } |
| 1062 | 1190 |
| 1191 TEST_F(DiskCacheBackendTest, V3Enumerations) { |
| 1192 UseVersion3(); |
| 1193 BackendEnumerations(); |
| 1194 } |
| 1195 |
| 1063 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { | 1196 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { |
| 1064 SetNewEviction(); | 1197 SetNewEviction(); |
| 1065 BackendEnumerations(); | 1198 BackendEnumerations(); |
| 1066 } | 1199 } |
| 1067 | 1200 |
| 1201 TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations) { |
| 1202 UseVersion3(); |
| 1203 SetNewEviction(); |
| 1204 BackendEnumerations(); |
| 1205 } |
| 1206 |
| 1068 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { | 1207 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { |
| 1069 SetMemoryOnlyMode(); | 1208 SetMemoryOnlyMode(); |
| 1070 BackendEnumerations(); | 1209 BackendEnumerations(); |
| 1071 } | 1210 } |
| 1072 | 1211 |
| 1073 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) { | 1212 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) { |
| 1074 SetCacheType(net::SHADER_CACHE); | 1213 SetCacheType(net::SHADER_CACHE); |
| 1075 BackendEnumerations(); | 1214 BackendEnumerations(); |
| 1076 } | 1215 } |
| 1077 | 1216 |
| 1078 TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { | 1217 TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { |
| 1079 SetCacheType(net::APP_CACHE); | 1218 SetCacheType(net::APP_CACHE); |
| 1080 BackendEnumerations(); | 1219 BackendEnumerations(); |
| 1081 } | 1220 } |
| 1082 | 1221 |
| 1083 // Verifies enumerations while entries are open. | 1222 // Verifies enumerations while entries are open. |
| 1084 void DiskCacheBackendTest::BackendEnumerations2() { | 1223 void DiskCacheBackendTest::BackendEnumerations2() { |
| 1085 InitCache(); | 1224 InitCache(); |
| 1086 const std::string first("first"); | 1225 const std::string first("first"); |
| 1087 const std::string second("second"); | 1226 const std::string second("second"); |
| 1088 disk_cache::Entry *entry1, *entry2; | 1227 disk_cache::Entry *entry1, *entry2; |
| 1089 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); | 1228 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); |
| 1090 entry1->Close(); | 1229 entry1->Close(); |
| 1091 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); | 1230 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); |
| 1092 entry2->Close(); | 1231 entry2->Close(); |
| 1093 FlushQueueForTest(); | 1232 FlushQueueForTest(); |
| 1094 | 1233 |
| 1095 // Make sure that the timestamp is not the same. | 1234 // Make sure that the timestamp is not the same. |
| 1096 AddDelay(); | 1235 AddDelayForTest(70); |
| 1097 ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); | 1236 ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); |
| 1098 void* iter = NULL; | 1237 void* iter = NULL; |
| 1099 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); | 1238 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); |
| 1100 EXPECT_EQ(entry2->GetKey(), second); | 1239 EXPECT_EQ(entry2->GetKey(), second); |
| 1101 | 1240 |
| 1102 // Two entries and the iterator pointing at "first". | 1241 // Two entries and the iterator pointing at "first". |
| 1103 entry1->Close(); | 1242 entry1->Close(); |
| 1104 entry2->Close(); | 1243 entry2->Close(); |
| 1105 | 1244 |
| 1106 // The iterator should still be valid, so we should not crash. | 1245 // The iterator should still be valid, so we should not crash. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1122 | 1261 |
| 1123 entry1->Close(); | 1262 entry1->Close(); |
| 1124 entry2->Close(); | 1263 entry2->Close(); |
| 1125 cache_->EndEnumeration(&iter); | 1264 cache_->EndEnumeration(&iter); |
| 1126 } | 1265 } |
| 1127 | 1266 |
| 1128 TEST_F(DiskCacheBackendTest, Enumerations2) { | 1267 TEST_F(DiskCacheBackendTest, Enumerations2) { |
| 1129 BackendEnumerations2(); | 1268 BackendEnumerations2(); |
| 1130 } | 1269 } |
| 1131 | 1270 |
| 1271 TEST_F(DiskCacheBackendTest, V3Enumerations2) { |
| 1272 UseVersion3(); |
| 1273 BackendEnumerations2(); |
| 1274 } |
| 1275 |
| 1132 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { | 1276 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { |
| 1133 SetNewEviction(); | 1277 SetNewEviction(); |
| 1134 BackendEnumerations2(); | 1278 BackendEnumerations2(); |
| 1135 } | 1279 } |
| 1136 | 1280 |
| 1281 TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations2) { |
| 1282 UseVersion3(); |
| 1283 SetNewEviction(); |
| 1284 BackendEnumerations2(); |
| 1285 } |
| 1286 |
| 1137 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { | 1287 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { |
| 1138 SetMemoryOnlyMode(); | 1288 SetMemoryOnlyMode(); |
| 1139 BackendEnumerations2(); | 1289 BackendEnumerations2(); |
| 1140 } | 1290 } |
| 1141 | 1291 |
| 1142 TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { | 1292 TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { |
| 1143 SetCacheType(net::APP_CACHE); | 1293 SetCacheType(net::APP_CACHE); |
| 1144 BackendEnumerations2(); | 1294 BackendEnumerations2(); |
| 1145 } | 1295 } |
| 1146 | 1296 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 void DiskCacheBackendTest::BackendDoomRecent() { | 1450 void DiskCacheBackendTest::BackendDoomRecent() { |
| 1301 InitCache(); | 1451 InitCache(); |
| 1302 | 1452 |
| 1303 disk_cache::Entry *entry; | 1453 disk_cache::Entry *entry; |
| 1304 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); | 1454 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); |
| 1305 entry->Close(); | 1455 entry->Close(); |
| 1306 ASSERT_EQ(net::OK, CreateEntry("second", &entry)); | 1456 ASSERT_EQ(net::OK, CreateEntry("second", &entry)); |
| 1307 entry->Close(); | 1457 entry->Close(); |
| 1308 FlushQueueForTest(); | 1458 FlushQueueForTest(); |
| 1309 | 1459 |
| 1310 AddDelay(); | 1460 AddDelayForTest(70); |
| 1311 Time middle = Time::Now(); | 1461 Time middle = GetCurrentTime(); |
| 1312 | 1462 |
| 1313 ASSERT_EQ(net::OK, CreateEntry("third", &entry)); | 1463 ASSERT_EQ(net::OK, CreateEntry("third", &entry)); |
| 1314 entry->Close(); | 1464 entry->Close(); |
| 1315 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); | 1465 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); |
| 1316 entry->Close(); | 1466 entry->Close(); |
| 1317 FlushQueueForTest(); | 1467 FlushQueueForTest(); |
| 1318 | 1468 |
| 1319 AddDelay(); | 1469 AddDelayForTest(70); |
| 1320 Time final = Time::Now(); | 1470 Time final = GetCurrentTime(); |
| 1321 | 1471 |
| 1322 ASSERT_EQ(4, cache_->GetEntryCount()); | 1472 ASSERT_EQ(4, cache_->GetEntryCount()); |
| 1323 EXPECT_EQ(net::OK, DoomEntriesSince(final)); | 1473 EXPECT_EQ(net::OK, DoomEntriesSince(final)); |
| 1324 ASSERT_EQ(4, cache_->GetEntryCount()); | 1474 ASSERT_EQ(4, cache_->GetEntryCount()); |
| 1325 | 1475 |
| 1326 EXPECT_EQ(net::OK, DoomEntriesSince(middle)); | 1476 EXPECT_EQ(net::OK, DoomEntriesSince(middle)); |
| 1327 ASSERT_EQ(2, cache_->GetEntryCount()); | 1477 ASSERT_EQ(2, cache_->GetEntryCount()); |
| 1328 | 1478 |
| 1329 ASSERT_EQ(net::OK, OpenEntry("second", &entry)); | 1479 ASSERT_EQ(net::OK, OpenEntry("second", &entry)); |
| 1330 entry->Close(); | 1480 entry->Close(); |
| 1331 } | 1481 } |
| 1332 | 1482 |
| 1333 TEST_F(DiskCacheBackendTest, DoomRecent) { | 1483 TEST_F(DiskCacheBackendTest, DoomRecent) { |
| 1334 BackendDoomRecent(); | 1484 BackendDoomRecent(); |
| 1335 } | 1485 } |
| 1336 | 1486 |
| 1487 TEST_F(DiskCacheBackendTest, V3DoomRecent) { |
| 1488 UseVersion3(); |
| 1489 BackendDoomRecent(); |
| 1490 } |
| 1491 |
| 1337 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { | 1492 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { |
| 1338 SetNewEviction(); | 1493 SetNewEviction(); |
| 1339 BackendDoomRecent(); | 1494 BackendDoomRecent(); |
| 1340 } | 1495 } |
| 1341 | 1496 |
| 1497 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomRecent) { |
| 1498 UseVersion3(); |
| 1499 SetNewEviction(); |
| 1500 BackendDoomRecent(); |
| 1501 } |
| 1502 |
| 1342 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { | 1503 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { |
| 1343 SetMemoryOnlyMode(); | 1504 SetMemoryOnlyMode(); |
| 1344 BackendDoomRecent(); | 1505 BackendDoomRecent(); |
| 1345 } | 1506 } |
| 1346 | 1507 |
| 1347 void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start, | 1508 void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start, |
| 1348 base::Time* doomed_end) { | 1509 base::Time* doomed_end) { |
| 1349 InitCache(); | 1510 InitCache(); |
| 1350 | 1511 |
| 1351 const int kSize = 50; | 1512 const int kSize = 50; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) { | 1580 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) { |
| 1420 base::Time start; | 1581 base::Time start; |
| 1421 InitSparseCache(&start, NULL); | 1582 InitSparseCache(&start, NULL); |
| 1422 DoomEntriesSince(start); | 1583 DoomEntriesSince(start); |
| 1423 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while | 1584 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while |
| 1424 // MemBackendImpl does not. Thats why expected value differs here from | 1585 // MemBackendImpl does not. Thats why expected value differs here from |
| 1425 // MemoryOnlyDoomEntriesSinceSparse. | 1586 // MemoryOnlyDoomEntriesSinceSparse. |
| 1426 EXPECT_EQ(3, cache_->GetEntryCount()); | 1587 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1427 } | 1588 } |
| 1428 | 1589 |
| 1590 TEST_F(DiskCacheBackendTest, V3DoomEntriesSinceSparse) { |
| 1591 base::Time start; |
| 1592 UseVersion3(); |
| 1593 InitSparseCache(&start, NULL); |
| 1594 DoomEntriesSince(start); |
| 1595 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while |
| 1596 // MemBackendImpl does not. Thats why expected value differs here from |
| 1597 // MemoryOnlyDoomEntriesSinceSparse. |
| 1598 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1599 } |
| 1600 |
| 1429 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) { | 1601 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) { |
| 1430 SetMemoryOnlyMode(); | 1602 SetMemoryOnlyMode(); |
| 1431 InitSparseCache(NULL, NULL); | 1603 InitSparseCache(NULL, NULL); |
| 1432 EXPECT_EQ(net::OK, DoomAllEntries()); | 1604 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1433 EXPECT_EQ(0, cache_->GetEntryCount()); | 1605 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1434 } | 1606 } |
| 1435 | 1607 |
| 1436 TEST_F(DiskCacheBackendTest, DoomAllSparse) { | 1608 TEST_F(DiskCacheBackendTest, DoomAllSparse) { |
| 1437 InitSparseCache(NULL, NULL); | 1609 InitSparseCache(NULL, NULL); |
| 1438 EXPECT_EQ(net::OK, DoomAllEntries()); | 1610 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1439 EXPECT_EQ(0, cache_->GetEntryCount()); | 1611 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1440 } | 1612 } |
| 1441 | 1613 |
| 1614 TEST_F(DiskCacheBackendTest, V3DoomAllSparse) { |
| 1615 UseVersion3(); |
| 1616 InitSparseCache(NULL, NULL); |
| 1617 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1618 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1619 } |
| 1620 |
| 1442 void DiskCacheBackendTest::BackendDoomBetween() { | 1621 void DiskCacheBackendTest::BackendDoomBetween() { |
| 1443 InitCache(); | 1622 InitCache(); |
| 1444 | 1623 |
| 1445 disk_cache::Entry *entry; | 1624 disk_cache::Entry *entry; |
| 1446 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); | 1625 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); |
| 1447 entry->Close(); | 1626 entry->Close(); |
| 1448 FlushQueueForTest(); | 1627 FlushQueueForTest(); |
| 1449 | 1628 |
| 1450 AddDelay(); | 1629 AddDelay(); |
| 1451 Time middle_start = Time::Now(); | 1630 Time middle_start = Time::Now(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1479 ASSERT_EQ(1, cache_->GetEntryCount()); | 1658 ASSERT_EQ(1, cache_->GetEntryCount()); |
| 1480 | 1659 |
| 1481 ASSERT_EQ(net::OK, OpenEntry("first", &entry)); | 1660 ASSERT_EQ(net::OK, OpenEntry("first", &entry)); |
| 1482 entry->Close(); | 1661 entry->Close(); |
| 1483 } | 1662 } |
| 1484 | 1663 |
| 1485 TEST_F(DiskCacheBackendTest, DoomBetween) { | 1664 TEST_F(DiskCacheBackendTest, DoomBetween) { |
| 1486 BackendDoomBetween(); | 1665 BackendDoomBetween(); |
| 1487 } | 1666 } |
| 1488 | 1667 |
| 1668 TEST_F(DiskCacheBackendTest, V3DoomBetween) { |
| 1669 UseVersion3(); |
| 1670 BackendDoomBetween(); |
| 1671 } |
| 1672 |
| 1489 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { | 1673 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { |
| 1490 SetNewEviction(); | 1674 SetNewEviction(); |
| 1491 BackendDoomBetween(); | 1675 BackendDoomBetween(); |
| 1492 } | 1676 } |
| 1493 | 1677 |
| 1678 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomBetween) { |
| 1679 UseVersion3(); |
| 1680 SetNewEviction(); |
| 1681 BackendDoomBetween(); |
| 1682 } |
| 1683 |
| 1494 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { | 1684 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { |
| 1495 SetMemoryOnlyMode(); | 1685 SetMemoryOnlyMode(); |
| 1496 BackendDoomBetween(); | 1686 BackendDoomBetween(); |
| 1497 } | 1687 } |
| 1498 | 1688 |
| 1499 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) { | 1689 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) { |
| 1500 SetMemoryOnlyMode(); | 1690 SetMemoryOnlyMode(); |
| 1501 base::Time start, end; | 1691 base::Time start, end; |
| 1502 InitSparseCache(&start, &end); | 1692 InitSparseCache(&start, &end); |
| 1503 DoomEntriesBetween(start, end); | 1693 DoomEntriesBetween(start, end); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1514 InitSparseCache(&start, &end); | 1704 InitSparseCache(&start, &end); |
| 1515 DoomEntriesBetween(start, end); | 1705 DoomEntriesBetween(start, end); |
| 1516 EXPECT_EQ(9, cache_->GetEntryCount()); | 1706 EXPECT_EQ(9, cache_->GetEntryCount()); |
| 1517 | 1707 |
| 1518 start = end; | 1708 start = end; |
| 1519 end = base::Time::Now(); | 1709 end = base::Time::Now(); |
| 1520 DoomEntriesBetween(start, end); | 1710 DoomEntriesBetween(start, end); |
| 1521 EXPECT_EQ(3, cache_->GetEntryCount()); | 1711 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1522 } | 1712 } |
| 1523 | 1713 |
| 1714 TEST_F(DiskCacheBackendTest, V3DoomEntriesBetweenSparse) { |
| 1715 base::Time start, end; |
| 1716 UseVersion3(); |
| 1717 InitSparseCache(&start, &end); |
| 1718 DoomEntriesBetween(start, end); |
| 1719 EXPECT_EQ(9, cache_->GetEntryCount()); |
| 1720 |
| 1721 start = end; |
| 1722 end = base::Time::Now(); |
| 1723 DoomEntriesBetween(start, end); |
| 1724 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1725 } |
| 1726 |
| 1524 void DiskCacheBackendTest::BackendTransaction(const std::string& name, | 1727 void DiskCacheBackendTest::BackendTransaction(const std::string& name, |
| 1525 int num_entries, bool load) { | 1728 int num_entries, bool load) { |
| 1526 success_ = false; | 1729 success_ = false; |
| 1527 ASSERT_TRUE(CopyTestCache(name)); | 1730 ASSERT_TRUE(CopyTestCache(name)); |
| 1528 DisableFirstCleanup(); | 1731 DisableFirstCleanup(); |
| 1529 | 1732 |
| 1530 uint32 mask; | 1733 uint32 mask; |
| 1531 if (load) { | 1734 if (load) { |
| 1532 mask = 0xf; | 1735 mask = 0xf; |
| 1533 SetMaxSize(0x100000); | 1736 SetMaxSize(0x100000); |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2507 EXPECT_EQ(net::OK, DoomAllEntries()); | 2710 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 2508 ASSERT_EQ(0, cache_->GetEntryCount()); | 2711 ASSERT_EQ(0, cache_->GetEntryCount()); |
| 2509 | 2712 |
| 2510 EXPECT_EQ(net::OK, DoomAllEntries()); | 2713 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 2511 } | 2714 } |
| 2512 | 2715 |
| 2513 TEST_F(DiskCacheBackendTest, DoomAll) { | 2716 TEST_F(DiskCacheBackendTest, DoomAll) { |
| 2514 BackendDoomAll(); | 2717 BackendDoomAll(); |
| 2515 } | 2718 } |
| 2516 | 2719 |
| 2720 TEST_F(DiskCacheBackendTest, V3DoomAll) { |
| 2721 UseVersion3(); |
| 2722 BackendDoomAll(); |
| 2723 } |
| 2724 |
| 2517 TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { | 2725 TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { |
| 2518 SetNewEviction(); | 2726 SetNewEviction(); |
| 2519 BackendDoomAll(); | 2727 BackendDoomAll(); |
| 2520 } | 2728 } |
| 2521 | 2729 |
| 2730 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomAll) { |
| 2731 UseVersion3(); |
| 2732 SetNewEviction(); |
| 2733 BackendDoomAll(); |
| 2734 } |
| 2735 |
| 2522 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { | 2736 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { |
| 2523 SetMemoryOnlyMode(); | 2737 SetMemoryOnlyMode(); |
| 2524 BackendDoomAll(); | 2738 BackendDoomAll(); |
| 2525 } | 2739 } |
| 2526 | 2740 |
| 2527 TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { | 2741 TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { |
| 2528 SetCacheType(net::APP_CACHE); | 2742 SetCacheType(net::APP_CACHE); |
| 2529 BackendDoomAll(); | 2743 BackendDoomAll(); |
| 2530 } | 2744 } |
| 2531 | 2745 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2655 InitCache(); | 2869 InitCache(); |
| 2656 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. | 2870 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. |
| 2657 | 2871 |
| 2658 for (int i = 1; i < 3; i++) { | 2872 for (int i = 1; i < 3; i++) { |
| 2659 CACHE_UMA(HOURS, "FillupTime", i, 28); | 2873 CACHE_UMA(HOURS, "FillupTime", i, 28); |
| 2660 } | 2874 } |
| 2661 } | 2875 } |
| 2662 | 2876 |
| 2663 // Make sure that we keep the total memory used by the internal buffers under | 2877 // Make sure that we keep the total memory used by the internal buffers under |
| 2664 // control. | 2878 // control. |
| 2665 TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { | 2879 void DiskCacheBackendTest::BackendTotalBuffersSize1() { |
| 2666 InitCache(); | 2880 InitCache(); |
| 2667 std::string key("the first key"); | 2881 std::string key("the first key"); |
| 2668 disk_cache::Entry* entry; | 2882 disk_cache::Entry* entry; |
| 2669 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2883 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2670 | 2884 |
| 2671 const int kSize = 200; | 2885 const int kSize = 200; |
| 2672 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 2886 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 2673 CacheTestFillBuffer(buffer->data(), kSize, true); | 2887 CacheTestFillBuffer(buffer->data(), kSize, true); |
| 2674 | 2888 |
| 2675 for (int i = 0; i < 10; i++) { | 2889 for (int i = 0; i < 10; i++) { |
| 2676 SCOPED_TRACE(i); | 2890 SCOPED_TRACE(i); |
| 2677 // Allocate 2MB for this entry. | 2891 // Allocate 2MB for this entry. |
| 2678 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); | 2892 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); |
| 2679 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); | 2893 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); |
| 2680 EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); | 2894 EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); |
| 2681 EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); | 2895 EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); |
| 2682 | 2896 |
| 2683 // Delete one of the buffers and truncate the other. | 2897 // Delete one of the buffers and truncate the other. |
| 2684 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); | 2898 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); |
| 2685 EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); | 2899 EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); |
| 2686 | 2900 |
| 2687 // Delete the second buffer, writing 10 bytes to disk. | 2901 // Delete the second buffer, writing 10 bytes to disk. |
| 2688 entry->Close(); | 2902 entry->Close(); |
| 2689 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 2903 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 2690 } | 2904 } |
| 2691 | 2905 |
| 2692 entry->Close(); | 2906 entry->Close(); |
| 2693 EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); | 2907 EXPECT_EQ(0, GetTotalBuffersSize()); |
| 2908 } |
| 2909 |
| 2910 TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { |
| 2911 BackendTotalBuffersSize1(); |
| 2912 } |
| 2913 |
| 2914 TEST_F(DiskCacheBackendTest, V3TotalBuffersSize1) { |
| 2915 UseVersion3(); |
| 2916 BackendTotalBuffersSize1(); |
| 2694 } | 2917 } |
| 2695 | 2918 |
| 2696 // This test assumes at least 150MB of system memory. | 2919 // This test assumes at least 150MB of system memory. |
| 2697 TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { | 2920 void DiskCacheBackendTest::BackendTotalBuffersSize2() { |
| 2698 InitCache(); | 2921 InitCache(); |
| 2699 | 2922 |
| 2700 const int kOneMB = 1024 * 1024; | 2923 const int kOneMB = 1024 * 1024; |
| 2701 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 2924 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2702 EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); | 2925 EXPECT_EQ(kOneMB, GetTotalBuffersSize()); |
| 2703 | 2926 |
| 2704 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 2927 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2705 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | 2928 EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize()); |
| 2706 | 2929 |
| 2707 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 2930 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2708 EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); | 2931 EXPECT_EQ(kOneMB * 3, GetTotalBuffersSize()); |
| 2709 | 2932 |
| 2710 cache_impl_->BufferDeleted(kOneMB); | 2933 BufferDeleted(kOneMB); |
| 2711 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | 2934 EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize()); |
| 2712 | 2935 |
| 2713 // Check the upper limit. | 2936 // Check the upper limit. |
| 2714 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); | 2937 EXPECT_FALSE(IsAllocAllowed(0, 30 * kOneMB)); |
| 2715 | 2938 |
| 2716 for (int i = 0; i < 30; i++) | 2939 for (int i = 0; i < 30; i++) |
| 2717 cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. | 2940 IsAllocAllowed(0, kOneMB); // Ignore the result. |
| 2718 | 2941 |
| 2719 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 2942 EXPECT_FALSE(IsAllocAllowed(0, kOneMB)); |
| 2943 } |
| 2944 |
| 2945 TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { |
| 2946 BackendTotalBuffersSize2(); |
| 2947 } |
| 2948 |
| 2949 TEST_F(DiskCacheBackendTest, V3TotalBuffersSize2) { |
| 2950 UseVersion3(); |
| 2951 BackendTotalBuffersSize2(); |
| 2720 } | 2952 } |
| 2721 | 2953 |
| 2722 // Tests that sharing of external files works and we are able to delete the | 2954 // Tests that sharing of external files works and we are able to delete the |
| 2723 // files when we need to. | 2955 // files when we need to. |
| 2724 TEST_F(DiskCacheBackendTest, FileSharing) { | 2956 TEST_F(DiskCacheBackendTest, FileSharing) { |
| 2725 InitCache(); | 2957 InitCache(); |
| 2726 | 2958 |
| 2727 disk_cache::Addr address(0x80000001); | 2959 disk_cache::Addr address(0x80000001); |
| 2728 ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); | 2960 ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); |
| 2729 base::FilePath name = cache_impl_->GetFileName(address); | 2961 base::FilePath name = cache_impl_->GetFileName(address); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2752 char buffer2[kSize]; | 2984 char buffer2[kSize]; |
| 2753 memset(buffer1, 't', kSize); | 2985 memset(buffer1, 't', kSize); |
| 2754 memset(buffer2, 0, kSize); | 2986 memset(buffer2, 0, kSize); |
| 2755 EXPECT_TRUE(file->Write(buffer1, kSize, 0)); | 2987 EXPECT_TRUE(file->Write(buffer1, kSize, 0)); |
| 2756 EXPECT_TRUE(file->Read(buffer2, kSize, 0)); | 2988 EXPECT_TRUE(file->Read(buffer2, kSize, 0)); |
| 2757 EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); | 2989 EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); |
| 2758 | 2990 |
| 2759 EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); | 2991 EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); |
| 2760 } | 2992 } |
| 2761 | 2993 |
| 2762 TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { | 2994 void DiskCacheBackendTest::BackendUpdateRankForExternalCacheHit() { |
| 2763 InitCache(); | 2995 InitCache(); |
| 2764 | 2996 |
| 2765 disk_cache::Entry* entry; | 2997 disk_cache::Entry* entry; |
| 2766 | 2998 |
| 2767 for (int i = 0; i < 2; ++i) { | 2999 for (int i = 0; i < 2; ++i) { |
| 2768 std::string key = base::StringPrintf("key%d", i); | 3000 std::string key = base::StringPrintf("key%d", i); |
| 2769 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 3001 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2770 entry->Close(); | 3002 entry->Close(); |
| 3003 AddDelayForTest(70); |
| 2771 } | 3004 } |
| 3005 FlushQueueForTest(); |
| 2772 | 3006 |
| 2773 // Ping the oldest entry. | 3007 // Ping the oldest entry. |
| 3008 SetTestMode(); |
| 2774 cache_->OnExternalCacheHit("key0"); | 3009 cache_->OnExternalCacheHit("key0"); |
| 3010 FlushQueueForTest(); |
| 2775 | 3011 |
| 2776 TrimForTest(false); | 3012 TrimForTest(false); |
| 2777 | 3013 |
| 2778 // Make sure the older key remains. | 3014 // Make sure the older key remains. |
| 2779 EXPECT_EQ(1, cache_->GetEntryCount()); | 3015 EXPECT_NE(net::OK, OpenEntry("key1", &entry)); |
| 2780 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); | 3016 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); |
| 2781 entry->Close(); | 3017 entry->Close(); |
| 2782 } | 3018 } |
| 2783 | 3019 |
| 3020 TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { |
| 3021 BackendUpdateRankForExternalCacheHit(); |
| 3022 } |
| 3023 |
| 3024 TEST_F(DiskCacheBackendTest, V3UpdateRankForExternalCacheHit) { |
| 3025 UseVersion3(); |
| 3026 BackendUpdateRankForExternalCacheHit(); |
| 3027 } |
| 3028 |
| 2784 TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) { | 3029 TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) { |
| 2785 SetCacheType(net::SHADER_CACHE); | 3030 SetCacheType(net::SHADER_CACHE); |
| 2786 InitCache(); | 3031 BackendUpdateRankForExternalCacheHit(); |
| 3032 } |
| 2787 | 3033 |
| 2788 disk_cache::Entry* entry; | 3034 TEST_F(DiskCacheBackendTest, V3ShaderCacheUpdateRankForExternalCacheHit) { |
| 2789 | 3035 UseVersion3(); |
| 2790 for (int i = 0; i < 2; ++i) { | 3036 SetCacheType(net::SHADER_CACHE); |
| 2791 std::string key = base::StringPrintf("key%d", i); | 3037 BackendUpdateRankForExternalCacheHit(); |
| 2792 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | |
| 2793 entry->Close(); | |
| 2794 } | |
| 2795 | |
| 2796 // Ping the oldest entry. | |
| 2797 cache_->OnExternalCacheHit("key0"); | |
| 2798 | |
| 2799 TrimForTest(false); | |
| 2800 | |
| 2801 // Make sure the older key remains. | |
| 2802 EXPECT_EQ(1, cache_->GetEntryCount()); | |
| 2803 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); | |
| 2804 entry->Close(); | |
| 2805 } | 3038 } |
| 2806 | 3039 |
| 2807 void DiskCacheBackendTest::TracingBackendBasics() { | 3040 void DiskCacheBackendTest::TracingBackendBasics() { |
| 2808 InitCache(); | 3041 InitCache(); |
| 2809 cache_ = new disk_cache::TracingCacheBackend(cache_); | 3042 cache_ = new disk_cache::TracingCacheBackend(cache_); |
| 2810 cache_impl_ = NULL; | 3043 cache_impl_ = NULL; |
| 2811 EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType()); | 3044 EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType()); |
| 2812 if (!simple_cache_mode_) { | 3045 if (!simple_cache_mode_) { |
| 2813 EXPECT_EQ(0, cache_->GetEntryCount()); | 3046 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 2814 } | 3047 } |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3020 NULL); | 3253 NULL); |
| 3021 cache->SetUnitTestMode(); | 3254 cache->SetUnitTestMode(); |
| 3022 net::TestCompletionCallback cb; | 3255 net::TestCompletionCallback cb; |
| 3023 int rv = cache->Init(cb.callback()); | 3256 int rv = cache->Init(cb.callback()); |
| 3024 EXPECT_NE(net::OK, cb.GetResult(rv)); | 3257 EXPECT_NE(net::OK, cb.GetResult(rv)); |
| 3025 delete cache; | 3258 delete cache; |
| 3026 DisableIntegrityCheck(); | 3259 DisableIntegrityCheck(); |
| 3027 } | 3260 } |
| 3028 | 3261 |
| 3029 #endif // !defined(OS_WIN) | 3262 #endif // !defined(OS_WIN) |
| OLD | NEW |