| 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 10 matching lines...) Expand all Loading... |
| 21 #include "net/disk_cache/entry_impl.h" | 21 #include "net/disk_cache/entry_impl.h" |
| 22 #include "net/disk_cache/histogram_macros.h" | 22 #include "net/disk_cache/histogram_macros.h" |
| 23 #include "net/disk_cache/mapped_file.h" | 23 #include "net/disk_cache/mapped_file.h" |
| 24 #include "net/disk_cache/mem_backend_impl.h" | 24 #include "net/disk_cache/mem_backend_impl.h" |
| 25 #include "net/disk_cache/simple/simple_backend_impl.h" | 25 #include "net/disk_cache/simple/simple_backend_impl.h" |
| 26 #include "net/disk_cache/simple/simple_entry_format.h" | 26 #include "net/disk_cache/simple/simple_entry_format.h" |
| 27 #include "net/disk_cache/simple/simple_util.h" | 27 #include "net/disk_cache/simple/simple_util.h" |
| 28 #include "net/disk_cache/tracing_cache_backend.h" | 28 #include "net/disk_cache/tracing_cache_backend.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 30 | 30 |
| 31 #if defined(OS_WIN) | 31 using base::Time; |
| 32 #include "base/win/scoped_handle.h" | |
| 33 #endif | |
| 34 | 32 |
| 35 using base::Time; | 33 namespace { |
| 34 const int kDelayToNextTimestamp = 60; |
| 35 } |
| 36 | 36 |
| 37 // Tests that can run with different types of caches. | 37 // Tests that can run with different types of caches. |
| 38 class DiskCacheBackendTest : public DiskCacheTestWithCache { | 38 class DiskCacheBackendTest : public DiskCacheTestWithCache { |
| 39 protected: | 39 protected: |
| 40 // Some utility methods: |
| 41 |
| 42 // Perform IO operations on the cache until there is pending IO. |
| 43 int GeneratePendingIO(net::TestCompletionCallback* cb); |
| 44 |
| 45 // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL, |
| 46 // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween. |
| 47 // There are 4 entries after doomed_start and 2 after doomed_end. |
| 48 void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end); |
| 49 |
| 50 bool CreateSetOfRandomEntries(std::set<std::string>* key_pool); |
| 51 bool EnumerateAndMatchKeys(int max_to_open, |
| 52 void** iter, |
| 53 std::set<std::string>* keys_to_match, |
| 54 size_t* count); |
| 55 |
| 56 // Actual tests: |
| 40 void BackendBasics(); | 57 void BackendBasics(); |
| 41 void BackendKeying(); | 58 void BackendKeying(); |
| 42 void BackendShutdownWithPendingFileIO(bool fast); | 59 void BackendShutdownWithPendingFileIO(bool fast); |
| 43 void BackendShutdownWithPendingIO(bool fast); | 60 void BackendShutdownWithPendingIO(bool fast); |
| 44 void BackendShutdownWithPendingCreate(bool fast); | 61 void BackendShutdownWithPendingCreate(bool fast); |
| 45 void BackendSetSize(); | 62 void BackendSetSize(); |
| 46 void BackendLoad(); | 63 void BackendLoad(); |
| 47 void BackendChain(); | 64 void BackendChain(); |
| 65 void BucketUse(); |
| 66 void BackendNewEvictionTrim(); |
| 48 void BackendValidEntry(); | 67 void BackendValidEntry(); |
| 49 void BackendInvalidEntry(); | 68 void BackendInvalidEntry(); |
| 50 void BackendInvalidEntryRead(); | 69 void BackendInvalidEntryRead(); |
| 51 void BackendInvalidEntryWithLoad(); | 70 void BackendInvalidEntryWithLoad(); |
| 52 void BackendTrimInvalidEntry(); | 71 void BackendTrimInvalidEntry(); |
| 53 void BackendTrimInvalidEntry2(); | 72 void BackendTrimInvalidEntry2(); |
| 54 void BackendEnumerations(); | 73 void BackendEnumerations(); |
| 55 void BackendEnumerations2(); | 74 void BackendEnumerations2(); |
| 56 void BackendInvalidEntryEnumeration(); | 75 void BackendInvalidEntryEnumeration(); |
| 57 void BackendFixEnumerators(); | 76 void BackendFixEnumerators(); |
| 58 void BackendDoomRecent(); | 77 void BackendDoomRecent(); |
| 59 | |
| 60 // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL, | |
| 61 // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween. | |
| 62 // There are 4 entries after doomed_start and 2 after doomed_end. | |
| 63 void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end); | |
| 64 | |
| 65 void BackendDoomBetween(); | 78 void BackendDoomBetween(); |
| 66 void BackendTransaction(const std::string& name, int num_entries, bool load); | 79 void BackendTransaction(const std::string& name, int num_entries, bool load); |
| 67 void BackendRecoverInsert(); | 80 void BackendRecoverInsert(); |
| 68 void BackendRecoverRemove(); | 81 void BackendRecoverRemove(); |
| 69 void BackendRecoverWithEviction(); | 82 void BackendRecoverWithEviction(); |
| 70 void BackendInvalidEntry2(); | 83 void BackendInvalidEntry2(); |
| 71 void BackendInvalidEntry3(); | 84 void BackendInvalidEntry3(); |
| 72 void BackendInvalidEntry7(); | 85 void BackendInvalidEntry7(); |
| 73 void BackendInvalidEntry8(); | 86 void BackendInvalidEntry8(); |
| 74 void BackendInvalidEntry9(bool eviction); | 87 void BackendInvalidEntry9(bool eviction); |
| 75 void BackendInvalidEntry10(bool eviction); | 88 void BackendInvalidEntry10(bool eviction); |
| 76 void BackendInvalidEntry11(bool eviction); | 89 void BackendInvalidEntry11(bool eviction); |
| 77 void BackendTrimInvalidEntry12(); | 90 void BackendTrimInvalidEntry12(); |
| 78 void BackendDoomAll(); | 91 void BackendDoomAll(); |
| 79 void BackendDoomAll2(); | 92 void BackendDoomAll2(); |
| 80 void BackendInvalidRankings(); | 93 void BackendInvalidRankings(); |
| 81 void BackendInvalidRankings2(); | 94 void BackendInvalidRankings2(); |
| 82 void BackendDisable(); | 95 void BackendDisable(); |
| 83 void BackendDisable2(); | 96 void BackendDisable2(); |
| 84 void BackendDisable3(); | 97 void BackendDisable3(); |
| 85 void BackendDisable4(); | 98 void BackendDisable4(); |
| 99 void BackendTotalBuffersSize1(); |
| 100 void BackendTotalBuffersSize2(); |
| 101 void BackendUpdateRankForExternalCacheHit(); |
| 86 void TracingBackendBasics(); | 102 void TracingBackendBasics(); |
| 87 }; | 103 }; |
| 88 | 104 |
| 105 int DiskCacheBackendTest::GeneratePendingIO(net::TestCompletionCallback* cb) { |
| 106 if (!use_current_thread_) { |
| 107 ADD_FAILURE(); |
| 108 return net::ERR_FAILED; |
| 109 } |
| 110 |
| 111 disk_cache::Entry* entry; |
| 112 int rv = cache_->CreateEntry("some key", &entry, cb->callback()); |
| 113 if (cb->GetResult(rv) != net::OK) |
| 114 return net::ERR_CACHE_CREATE_FAILURE; |
| 115 |
| 116 const int kSize = 25000; |
| 117 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 118 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 119 |
| 120 for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) { |
| 121 // We are using the current thread as the cache thread because we want to |
| 122 // be able to call directly this method to make sure that the OS (instead |
| 123 // of us switching thread) is returning IO pending. |
| 124 if (!simple_cache_mode_) { |
| 125 rv = static_cast<disk_cache::EntryImpl*>(entry)->WriteDataImpl( |
| 126 0, i, buffer.get(), kSize, cb->callback(), false); |
| 127 } else { |
| 128 rv = entry->WriteData(0, i, buffer.get(), kSize, cb->callback(), false); |
| 129 } |
| 130 |
| 131 if (rv == net::ERR_IO_PENDING) |
| 132 break; |
| 133 if (rv != kSize) |
| 134 rv = net::ERR_FAILED; |
| 135 } |
| 136 |
| 137 // Don't call Close() to avoid going through the queue or we'll deadlock |
| 138 // waiting for the operation to finish. |
| 139 if (!simple_cache_mode_) |
| 140 static_cast<disk_cache::EntryImpl*>(entry)->Release(); |
| 141 else |
| 142 entry->Close(); |
| 143 |
| 144 return rv; |
| 145 } |
| 146 |
| 147 void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start, |
| 148 base::Time* doomed_end) { |
| 149 InitCache(); |
| 150 |
| 151 const int kSize = 50; |
| 152 // This must be greater then MemEntryImpl::kMaxSparseEntrySize. |
| 153 const int kOffset = 10 + 1024 * 1024; |
| 154 |
| 155 disk_cache::Entry* entry0 = NULL; |
| 156 disk_cache::Entry* entry1 = NULL; |
| 157 disk_cache::Entry* entry2 = NULL; |
| 158 |
| 159 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 160 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 161 |
| 162 ASSERT_EQ(net::OK, CreateEntry("zeroth", &entry0)); |
| 163 ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize)); |
| 164 ASSERT_EQ(kSize, |
| 165 WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize)); |
| 166 entry0->Close(); |
| 167 |
| 168 FlushQueueForTest(); |
| 169 AddDelay(); |
| 170 if (doomed_start) |
| 171 *doomed_start = base::Time::Now(); |
| 172 |
| 173 // Order in rankings list: |
| 174 // first_part1, first_part2, second_part1, second_part2 |
| 175 ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); |
| 176 ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize)); |
| 177 ASSERT_EQ(kSize, |
| 178 WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize)); |
| 179 entry1->Close(); |
| 180 |
| 181 ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); |
| 182 ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize)); |
| 183 ASSERT_EQ(kSize, |
| 184 WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize)); |
| 185 entry2->Close(); |
| 186 |
| 187 FlushQueueForTest(); |
| 188 AddDelay(); |
| 189 if (doomed_end) |
| 190 *doomed_end = base::Time::Now(); |
| 191 |
| 192 // Order in rankings list: |
| 193 // third_part1, fourth_part1, third_part2, fourth_part2 |
| 194 disk_cache::Entry* entry3 = NULL; |
| 195 disk_cache::Entry* entry4 = NULL; |
| 196 ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); |
| 197 ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize)); |
| 198 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); |
| 199 ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize)); |
| 200 ASSERT_EQ(kSize, |
| 201 WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize)); |
| 202 ASSERT_EQ(kSize, |
| 203 WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize)); |
| 204 entry3->Close(); |
| 205 entry4->Close(); |
| 206 |
| 207 FlushQueueForTest(); |
| 208 AddDelay(); |
| 209 } |
| 210 |
| 211 // Creates entries based on random keys. Stores these keys in |key_pool|. |
| 212 bool DiskCacheBackendTest::CreateSetOfRandomEntries( |
| 213 std::set<std::string>* key_pool) { |
| 214 const int kNumEntries = 10; |
| 215 |
| 216 for (int i = 0; i < kNumEntries; ++i) { |
| 217 std::string key = GenerateKey(true); |
| 218 disk_cache::Entry* entry; |
| 219 if (CreateEntry(key, &entry) != net::OK) |
| 220 return false; |
| 221 key_pool->insert(key); |
| 222 entry->Close(); |
| 223 } |
| 224 return key_pool->size() == implicit_cast<size_t>(cache_->GetEntryCount()); |
| 225 } |
| 226 |
| 227 // Performs iteration over the backend and checks that the keys of entries |
| 228 // opened are in |keys_to_match|, then erases them. Up to |max_to_open| entries |
| 229 // will be opened, if it is positive. Otherwise, iteration will continue until |
| 230 // OpenNextEntry stops returning net::OK. |
| 231 bool DiskCacheBackendTest::EnumerateAndMatchKeys( |
| 232 int max_to_open, |
| 233 void** iter, |
| 234 std::set<std::string>* keys_to_match, |
| 235 size_t* count) { |
| 236 disk_cache::Entry* entry; |
| 237 |
| 238 while (OpenNextEntry(iter, &entry) == net::OK) { |
| 239 if (!entry) |
| 240 return false; |
| 241 EXPECT_EQ(1U, keys_to_match->erase(entry->GetKey())); |
| 242 entry->Close(); |
| 243 ++(*count); |
| 244 if (max_to_open >= 0 && implicit_cast<int>(*count) >= max_to_open) |
| 245 break; |
| 246 }; |
| 247 |
| 248 return true; |
| 249 } |
| 250 |
| 89 void DiskCacheBackendTest::BackendBasics() { | 251 void DiskCacheBackendTest::BackendBasics() { |
| 90 InitCache(); | 252 InitCache(); |
| 91 disk_cache::Entry *entry1 = NULL, *entry2 = NULL; | 253 disk_cache::Entry *entry1 = NULL, *entry2 = NULL; |
| 92 EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); | 254 EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); |
| 93 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 255 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); |
| 94 ASSERT_TRUE(NULL != entry1); | 256 ASSERT_TRUE(NULL != entry1); |
| 95 entry1->Close(); | 257 entry1->Close(); |
| 96 entry1 = NULL; | 258 entry1 = NULL; |
| 97 | 259 |
| 98 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); | 260 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 TEST_F(DiskCacheBackendTest, AppCacheBasics) { | 311 TEST_F(DiskCacheBackendTest, AppCacheBasics) { |
| 150 SetCacheType(net::APP_CACHE); | 312 SetCacheType(net::APP_CACHE); |
| 151 BackendBasics(); | 313 BackendBasics(); |
| 152 } | 314 } |
| 153 | 315 |
| 154 TEST_F(DiskCacheBackendTest, ShaderCacheBasics) { | 316 TEST_F(DiskCacheBackendTest, ShaderCacheBasics) { |
| 155 SetCacheType(net::SHADER_CACHE); | 317 SetCacheType(net::SHADER_CACHE); |
| 156 BackendBasics(); | 318 BackendBasics(); |
| 157 } | 319 } |
| 158 | 320 |
| 321 TEST_F(DiskCacheBackendTest, V3Basics) { |
| 322 UseVersion3(); |
| 323 BackendBasics(); |
| 324 } |
| 325 |
| 159 void DiskCacheBackendTest::BackendKeying() { | 326 void DiskCacheBackendTest::BackendKeying() { |
| 160 InitCache(); | 327 InitCache(); |
| 161 const char* kName1 = "the first key"; | 328 const char* kName1 = "the first key"; |
| 162 const char* kName2 = "the first Key"; | 329 const char* kName2 = "the first Key"; |
| 163 disk_cache::Entry *entry1, *entry2; | 330 disk_cache::Entry *entry1, *entry2; |
| 164 ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); | 331 ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); |
| 165 | 332 |
| 166 ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); | 333 ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); |
| 167 EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; | 334 EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; |
| 168 entry2->Close(); | 335 entry2->Close(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 194 buffer2[19999] = '\0'; | 361 buffer2[19999] = '\0'; |
| 195 ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; | 362 ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; |
| 196 entry2->Close(); | 363 entry2->Close(); |
| 197 entry1->Close(); | 364 entry1->Close(); |
| 198 } | 365 } |
| 199 | 366 |
| 200 TEST_F(DiskCacheBackendTest, Keying) { | 367 TEST_F(DiskCacheBackendTest, Keying) { |
| 201 BackendKeying(); | 368 BackendKeying(); |
| 202 } | 369 } |
| 203 | 370 |
| 371 TEST_F(DiskCacheBackendTest, V3Keying) { |
| 372 UseVersion3(); |
| 373 BackendKeying(); |
| 374 } |
| 375 |
| 204 TEST_F(DiskCacheBackendTest, NewEvictionKeying) { | 376 TEST_F(DiskCacheBackendTest, NewEvictionKeying) { |
| 205 SetNewEviction(); | 377 SetNewEviction(); |
| 206 BackendKeying(); | 378 BackendKeying(); |
| 207 } | 379 } |
| 208 | 380 |
| 381 TEST_F(DiskCacheBackendTest, V3NewEvictionKeying) { |
| 382 UseVersion3(); |
| 383 SetNewEviction(); |
| 384 BackendKeying(); |
| 385 } |
| 386 |
| 209 TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { | 387 TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { |
| 210 SetMemoryOnlyMode(); | 388 SetMemoryOnlyMode(); |
| 211 BackendKeying(); | 389 BackendKeying(); |
| 212 } | 390 } |
| 213 | 391 |
| 214 TEST_F(DiskCacheBackendTest, AppCacheKeying) { | 392 TEST_F(DiskCacheBackendTest, AppCacheKeying) { |
| 215 SetCacheType(net::APP_CACHE); | 393 SetCacheType(net::APP_CACHE); |
| 216 BackendKeying(); | 394 BackendKeying(); |
| 217 } | 395 } |
| 218 | 396 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 base::FilePath filename = cache_path_.AppendASCII("f_000001"); | 466 base::FilePath filename = cache_path_.AppendASCII("f_000001"); |
| 289 | 467 |
| 290 const int kSize = 50; | 468 const int kSize = 50; |
| 291 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 469 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 292 CacheTestFillBuffer(buffer1->data(), kSize, false); | 470 CacheTestFillBuffer(buffer1->data(), kSize, false); |
| 293 ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); | 471 ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); |
| 294 | 472 |
| 295 // Now let's create a file with the cache. | 473 // Now let's create a file with the cache. |
| 296 disk_cache::Entry* entry; | 474 disk_cache::Entry* entry; |
| 297 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); | 475 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); |
| 298 ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1, 0, false)); | 476 ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1.get(), 0, false)); |
| 299 entry->Close(); | 477 entry->Close(); |
| 300 | 478 |
| 301 // And verify that the first file is still there. | 479 // And verify that the first file is still there. |
| 302 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); | 480 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); |
| 303 ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); | 481 ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); |
| 304 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); | 482 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 305 } | 483 } |
| 306 | 484 |
| 307 // Tests that we deal with file-level pending operations at destruction time. | 485 // Tests that we deal with file-level pending operations at destruction time. |
| 308 void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { | 486 void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { |
| 487 ASSERT_TRUE(CleanupCacheDir()); |
| 488 if (fast) |
| 489 AvoidTestFlag(); |
| 490 |
| 491 UseCurrentThread(); |
| 492 CreateBackend(NULL); |
| 493 SetNoBuffering(); |
| 494 |
| 309 net::TestCompletionCallback cb; | 495 net::TestCompletionCallback cb; |
| 310 int rv; | 496 int rv = GeneratePendingIO(&cb); |
| 311 | 497 |
| 312 { | 498 // The cache destructor will see one pending operation here. |
| 313 ASSERT_TRUE(CleanupCacheDir()); | 499 delete cache_; |
| 314 base::Thread cache_thread("CacheThread"); | 500 // Prevent the TearDown() to delete the backend again. |
| 315 ASSERT_TRUE(cache_thread.StartWithOptions( | 501 cache_ = NULL; |
| 316 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | |
| 317 | 502 |
| 318 uint32 flags = disk_cache::kNoBuffering; | 503 if (rv == net::ERR_IO_PENDING) { |
| 319 if (!fast) | 504 if (fast) |
| 320 flags |= disk_cache::kNoRandom; | 505 EXPECT_FALSE(cb.have_result()); |
| 321 | 506 else |
| 322 UseCurrentThread(); | 507 EXPECT_TRUE(cb.have_result()); |
| 323 CreateBackend(flags, NULL); | |
| 324 | |
| 325 disk_cache::EntryImpl* entry; | |
| 326 rv = cache_->CreateEntry( | |
| 327 "some key", reinterpret_cast<disk_cache::Entry**>(&entry), | |
| 328 cb.callback()); | |
| 329 ASSERT_EQ(net::OK, cb.GetResult(rv)); | |
| 330 | |
| 331 const int kSize = 25000; | |
| 332 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | |
| 333 CacheTestFillBuffer(buffer->data(), kSize, false); | |
| 334 | |
| 335 for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) { | |
| 336 // We are using the current thread as the cache thread because we want to | |
| 337 // be able to call directly this method to make sure that the OS (instead | |
| 338 // of us switching thread) is returning IO pending. | |
| 339 rv = entry->WriteDataImpl(0, i, buffer, kSize, cb.callback(), false); | |
| 340 if (rv == net::ERR_IO_PENDING) | |
| 341 break; | |
| 342 EXPECT_EQ(kSize, rv); | |
| 343 } | |
| 344 | |
| 345 // Don't call Close() to avoid going through the queue or we'll deadlock | |
| 346 // waiting for the operation to finish. | |
| 347 entry->Release(); | |
| 348 | |
| 349 // The cache destructor will see one pending operation here. | |
| 350 delete cache_; | |
| 351 // Prevent the TearDown() to delete the backend again. | |
| 352 cache_ = NULL; | |
| 353 | |
| 354 if (rv == net::ERR_IO_PENDING) { | |
| 355 if (fast) | |
| 356 EXPECT_FALSE(cb.have_result()); | |
| 357 else | |
| 358 EXPECT_TRUE(cb.have_result()); | |
| 359 } | |
| 360 } | 508 } |
| 361 | 509 |
| 362 MessageLoop::current()->RunUntilIdle(); | 510 MessageLoop::current()->RunUntilIdle(); |
| 363 | 511 |
| 364 #if defined(OS_WIN) | |
| 365 // Wait for the actual operation to complete, or we'll keep a file handle that | 512 // Wait for the actual operation to complete, or we'll keep a file handle that |
| 366 // may cause issues later. Note that on Posix systems even though this test | 513 // may cause issues later. |
| 367 // uses a single thread, the actual IO is posted to a worker thread and the | |
| 368 // cache destructor breaks the link to reach cb when the operation completes. | |
| 369 rv = cb.GetResult(rv); | 514 rv = cb.GetResult(rv); |
| 370 #endif | |
| 371 } | 515 } |
| 372 | 516 |
| 373 TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) { | 517 TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) { |
| 374 BackendShutdownWithPendingFileIO(false); | 518 BackendShutdownWithPendingFileIO(false); |
| 375 } | 519 } |
| 376 | 520 |
| 377 // We'll be leaking from this test. | 521 // We'll be leaking from this test. |
| 378 TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) { | 522 TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) { |
| 379 // The integrity test sets kNoRandom so there's a version mismatch if we don't | 523 // The integrity test sets kNoRandom so there's a version mismatch if we don't |
| 380 // force new eviction. | 524 // force new eviction. |
| 381 SetNewEviction(); | 525 SetNewEviction(); |
| 382 BackendShutdownWithPendingFileIO(true); | 526 BackendShutdownWithPendingFileIO(true); |
| 383 } | 527 } |
| 384 | 528 |
| 385 // Tests that we deal with background-thread pending operations. | 529 // Tests that we deal with background-thread pending operations. |
| 386 void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { | 530 void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { |
| 387 net::TestCompletionCallback cb; | 531 net::TestCompletionCallback cb; |
| 388 | 532 |
| 389 { | 533 { |
| 390 ASSERT_TRUE(CleanupCacheDir()); | 534 ASSERT_TRUE(CleanupCacheDir()); |
| 391 base::Thread cache_thread("CacheThread"); | 535 base::Thread cache_thread("CacheThread"); |
| 392 ASSERT_TRUE(cache_thread.StartWithOptions( | 536 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 393 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 537 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 394 | 538 |
| 395 uint32 flags = disk_cache::kNoBuffering; | 539 if (fast) |
| 396 if (!fast) | 540 AvoidTestFlag(); |
| 397 flags |= disk_cache::kNoRandom; | |
| 398 | 541 |
| 399 CreateBackend(flags, &cache_thread); | 542 CreateBackend(&cache_thread); |
| 543 SetNoBuffering(); |
| 400 | 544 |
| 401 disk_cache::Entry* entry; | 545 disk_cache::Entry* entry; |
| 402 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); | 546 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); |
| 403 ASSERT_EQ(net::OK, cb.GetResult(rv)); | 547 ASSERT_EQ(net::OK, cb.GetResult(rv)); |
| 404 | 548 |
| 405 entry->Close(); | 549 entry->Close(); |
| 406 | 550 |
| 407 // The cache destructor will see one pending operation here. | 551 // The cache destructor will see one pending operation here. |
| 408 delete cache_; | 552 delete cache_; |
| 409 // Prevent the TearDown() to delete the backend again. | 553 // 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. | 572 // Tests that we deal with create-type pending operations. |
| 429 void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { | 573 void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { |
| 430 net::TestCompletionCallback cb; | 574 net::TestCompletionCallback cb; |
| 431 | 575 |
| 432 { | 576 { |
| 433 ASSERT_TRUE(CleanupCacheDir()); | 577 ASSERT_TRUE(CleanupCacheDir()); |
| 434 base::Thread cache_thread("CacheThread"); | 578 base::Thread cache_thread("CacheThread"); |
| 435 ASSERT_TRUE(cache_thread.StartWithOptions( | 579 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 436 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 580 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 437 | 581 |
| 438 disk_cache::BackendFlags flags = | 582 if (fast) |
| 439 fast ? disk_cache::kNone : disk_cache::kNoRandom; | 583 AvoidTestFlag(); |
| 440 CreateBackend(flags, &cache_thread); | 584 CreateBackend(&cache_thread); |
| 441 | 585 |
| 442 disk_cache::Entry* entry; | 586 disk_cache::Entry* entry; |
| 443 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); | 587 int rv = cache_->CreateEntry("some key", &entry, cb.callback()); |
| 444 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 588 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 445 | 589 |
| 446 delete cache_; | 590 delete cache_; |
| 447 // Prevent the TearDown() to delete the backend again. | 591 // Prevent the TearDown() to delete the backend again. |
| 448 cache_ = NULL; | 592 cache_ = NULL; |
| 449 EXPECT_FALSE(cb.have_result()); | 593 EXPECT_FALSE(cb.have_result()); |
| 450 } | 594 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 SetMaxSize(cache_size); | 633 SetMaxSize(cache_size); |
| 490 InitCache(); | 634 InitCache(); |
| 491 | 635 |
| 492 std::string first("some key"); | 636 std::string first("some key"); |
| 493 std::string second("something else"); | 637 std::string second("something else"); |
| 494 disk_cache::Entry* entry; | 638 disk_cache::Entry* entry; |
| 495 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); | 639 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); |
| 496 | 640 |
| 497 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size)); | 641 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size)); |
| 498 memset(buffer->data(), 0, cache_size); | 642 memset(buffer->data(), 0, cache_size); |
| 499 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, | 643 EXPECT_EQ(cache_size / 10, |
| 500 false)) << "normal file"; | 644 WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false)) << |
| 645 "normal file"; |
| 501 | 646 |
| 502 EXPECT_EQ(net::ERR_FAILED, WriteData(entry, 1, 0, buffer, cache_size / 5, | 647 EXPECT_EQ(net::ERR_FAILED, |
| 503 false)) << "file size above the limit"; | 648 WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false)) << |
| 649 "file size above the limit"; |
| 504 | 650 |
| 505 // By doubling the total size, we make this file cacheable. | 651 // By doubling the total size, we make this file cacheable. |
| 506 SetMaxSize(cache_size * 2); | 652 SetMaxSize(cache_size * 2); |
| 507 EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer, cache_size / 5, | 653 EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer.get(), cache_size / 5, |
| 508 false)); | 654 false)); |
| 509 | 655 |
| 510 // Let's fill up the cache!. | 656 // Let's fill up the cache!. |
| 511 SetMaxSize(cache_size * 10); | 657 SetMaxSize(cache_size * 10); |
| 512 EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer, | 658 EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer.get(), |
| 513 cache_size * 3 / 4, false)); | 659 cache_size * 3 / 4, false)); |
| 514 entry->Close(); | 660 entry->Close(); |
| 515 FlushQueueForTest(); | 661 FlushQueueForTest(); |
| 516 | 662 |
| 517 SetMaxSize(cache_size); | 663 SetMaxSize(cache_size); |
| 518 | 664 |
| 519 // The cache is 95% full. | 665 // The cache is 95% full. |
| 520 | 666 |
| 521 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); | 667 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); |
| 522 EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10, | 668 EXPECT_EQ(cache_size / 10, |
| 523 false)); | 669 WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false)); |
| 524 | 670 |
| 525 disk_cache::Entry* entry2; | 671 disk_cache::Entry* entry2; |
| 526 ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); | 672 std::string extra_key("an extra key"); |
| 527 EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10, | 673 ASSERT_EQ(net::OK, CreateEntry(extra_key, &entry2)); |
| 528 false)); | 674 EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer.get(), |
| 675 cache_size / 10, false)); |
| 529 entry2->Close(); // This will trigger the cache trim. | 676 entry2->Close(); // This will trigger the cache trim. |
| 530 | 677 WaitForEntryToClose(extra_key); |
| 531 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); | |
| 532 | 678 |
| 533 FlushQueueForTest(); // Make sure that we are done trimming the cache. | 679 FlushQueueForTest(); // Make sure that we are done trimming the cache. |
| 534 FlushQueueForTest(); // We may have posted two tasks to evict stuff. | 680 FlushQueueForTest(); // We may have posted two tasks to evict stuff. |
| 535 | 681 |
| 536 entry->Close(); | 682 entry->Close(); |
| 683 WaitForEntryToClose(second); |
| 684 |
| 685 EXPECT_NE(net::OK, OpenEntry(first, &entry2)); |
| 537 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); | 686 ASSERT_EQ(net::OK, OpenEntry(second, &entry)); |
| 538 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); | 687 EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); |
| 539 entry->Close(); | 688 entry->Close(); |
| 540 } | 689 } |
| 541 | 690 |
| 542 TEST_F(DiskCacheBackendTest, SetSize) { | 691 TEST_F(DiskCacheBackendTest, SetSize) { |
| 543 BackendSetSize(); | 692 BackendSetSize(); |
| 544 } | 693 } |
| 545 | 694 |
| 695 TEST_F(DiskCacheBackendTest, V3SetSize) { |
| 696 UseVersion3(); |
| 697 UseVersion3(); |
| 698 SetNewEviction(); |
| 699 BackendSetSize(); |
| 700 } |
| 701 |
| 546 TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { | 702 TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { |
| 547 SetNewEviction(); | 703 SetNewEviction(); |
| 548 BackendSetSize(); | 704 BackendSetSize(); |
| 549 } | 705 } |
| 550 | 706 |
| 707 TEST_F(DiskCacheBackendTest, V3NewEvictionSetSize) { |
| 708 UseVersion3(); |
| 709 SetNewEviction(); |
| 710 BackendSetSize(); |
| 711 } |
| 712 |
| 551 TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { | 713 TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { |
| 552 SetMemoryOnlyMode(); | 714 SetMemoryOnlyMode(); |
| 553 BackendSetSize(); | 715 BackendSetSize(); |
| 554 } | 716 } |
| 555 | 717 |
| 556 void DiskCacheBackendTest::BackendLoad() { | 718 void DiskCacheBackendTest::BackendLoad() { |
| 557 InitCache(); | 719 InitCache(); |
| 558 int seed = static_cast<int>(Time::Now().ToInternalValue()); | 720 int seed = static_cast<int>(Time::Now().ToInternalValue()); |
| 559 srand(seed); | 721 srand(seed); |
| 560 | 722 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 TEST_F(DiskCacheBackendTest, AppCacheChain) { | 809 TEST_F(DiskCacheBackendTest, AppCacheChain) { |
| 648 SetCacheType(net::APP_CACHE); | 810 SetCacheType(net::APP_CACHE); |
| 649 BackendChain(); | 811 BackendChain(); |
| 650 } | 812 } |
| 651 | 813 |
| 652 TEST_F(DiskCacheBackendTest, ShaderCacheChain) { | 814 TEST_F(DiskCacheBackendTest, ShaderCacheChain) { |
| 653 SetCacheType(net::SHADER_CACHE); | 815 SetCacheType(net::SHADER_CACHE); |
| 654 BackendChain(); | 816 BackendChain(); |
| 655 } | 817 } |
| 656 | 818 |
| 657 TEST_F(DiskCacheBackendTest, NewEvictionTrim) { | 819 // Tests the proper use of cell buckets while the index grow. |
| 820 void DiskCacheBackendTest::BucketUse() { |
| 821 UseVersion3(); |
| 822 InitCache(); |
| 823 const int kNumEntries = 20; |
| 824 disk_cache::Entry* entries[kNumEntries]; |
| 825 std::string key("The first key"); |
| 826 |
| 827 // This generates kNumEntries collisions so the extra table has to be used. |
| 828 // There are only 2 extra buckets on the test setup, so the index has to grow. |
| 829 for (int i = 0; i < kNumEntries; i++) { |
| 830 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 831 entries[i]->Doom(); |
| 832 FlushQueueForTest(); |
| 833 } |
| 834 |
| 835 for (int i = 0; i < kNumEntries / 2; i++) |
| 836 entries[i]->Close(); |
| 837 |
| 838 for (int i = 0; i < kNumEntries / 2; i++) { |
| 839 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 840 entries[i]->Doom(); |
| 841 } |
| 842 |
| 843 for (int i = 0; i < kNumEntries; i++) |
| 844 entries[i]->Close(); |
| 845 } |
| 846 |
| 847 TEST_F(DiskCacheBackendTest, V3BucketUse) { |
| 848 BucketUse(); |
| 849 } |
| 850 |
| 851 TEST_F(DiskCacheBackendTest, V3DoubleIndexBucketUse) { |
| 852 PresetTestMode(); // Doubles the index instead of a slow growth. |
| 853 BucketUse(); |
| 854 } |
| 855 |
| 856 TEST_F(DiskCacheBackendTest, V3DoubleIndex) { |
| 857 UseVersion3(); |
| 858 PresetTestMode(); |
| 859 InitCache(); |
| 860 |
| 861 disk_cache::Entry* entry; |
| 862 const int kNumEntries = 200; |
| 863 for (int i = 0; i < kNumEntries; i++) { |
| 864 std::string name(base::StringPrintf("Key %d", i)); |
| 865 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); |
| 866 entry->Close(); |
| 867 FlushQueueForTest(); |
| 868 } |
| 869 |
| 870 // Generate enough collisions to force growing the extra table (and with it, |
| 871 // the index). |
| 872 const int kNumSavedEntries = 5; |
| 873 disk_cache::Entry* entries[kNumSavedEntries]; |
| 874 std::string key("The first key"); |
| 875 for (int i = 0; i < kNumSavedEntries; i++) { |
| 876 ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); |
| 877 entries[i]->Doom(); |
| 878 FlushQueueForTest(); |
| 879 } |
| 880 |
| 881 for (int i = 0; i < kNumSavedEntries; i++) |
| 882 entries[i]->Close(); |
| 883 |
| 884 // Verify that all entries are there. |
| 885 for (int i = 0; i < kNumEntries; i++) { |
| 886 std::string name(base::StringPrintf("Key %d", i)); |
| 887 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); |
| 888 entry->Close(); |
| 889 } |
| 890 } |
| 891 |
| 892 // This test leaks memory because it simulates a crash. |
| 893 TEST_F(DiskCacheBackendTest, DISABLED_V3Backup) { |
| 894 UseVersion3(); |
| 895 PresetTestMode(); |
| 896 InitCache(); |
| 897 |
| 898 disk_cache::Entry* entry; |
| 899 std::string name1("First entry"); |
| 900 ASSERT_EQ(net::OK, CreateEntry(name1, &entry)); |
| 901 entry->Close(); |
| 902 WaitForEntryToClose(name1); |
| 903 |
| 904 std::string name2("Another entry"); |
| 905 ASSERT_EQ(net::OK, CreateEntry(name2, &entry)); |
| 906 |
| 907 SimulateCrash(); |
| 908 EXPECT_EQ(net::OK, OpenEntry(name1, &entry)); |
| 909 entry->Close(); |
| 910 EXPECT_NE(net::OK, OpenEntry(name2, &entry)); |
| 911 } |
| 912 |
| 913 void DiskCacheBackendTest::BackendNewEvictionTrim() { |
| 658 SetNewEviction(); | 914 SetNewEviction(); |
| 659 InitCache(); | 915 InitCache(); |
| 660 | 916 |
| 661 disk_cache::Entry* entry; | 917 disk_cache::Entry* entry; |
| 662 for (int i = 0; i < 100; i++) { | 918 for (int i = 0; i < 100; i++) { |
| 663 std::string name(base::StringPrintf("Key %d", i)); | 919 std::string name(base::StringPrintf("Key %d", i)); |
| 664 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); | 920 ASSERT_EQ(net::OK, CreateEntry(name, &entry)); |
| 665 entry->Close(); | 921 entry->Close(); |
| 922 AddDelayForTest(kDelayToNextTimestamp); |
| 923 |
| 666 if (i < 90) { | 924 if (i < 90) { |
| 667 // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. | 925 // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. |
| 668 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); | 926 ASSERT_EQ(net::OK, OpenEntry(name, &entry)); |
| 669 entry->Close(); | 927 entry->Close(); |
| 670 } | 928 } |
| 929 if (!(i % 10)) |
| 930 FlushQueueForTest(); |
| 931 |
| 932 if (i == 0 || i == 90) |
| 933 WaitForEntryToClose(name); |
| 671 } | 934 } |
| 672 | 935 |
| 673 // The first eviction must come from list 1 (10% limit), the second must come | 936 // The first eviction must come from list 1 (10% limit), the second must come |
| 674 // from list 0. | 937 // from list 0. |
| 675 TrimForTest(false); | 938 TrimForTest(false); |
| 676 EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); | 939 EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); |
| 677 TrimForTest(false); | 940 TrimForTest(false); |
| 678 EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); | 941 EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); |
| 679 | 942 |
| 680 // Double check that we still have the list tails. | 943 // Double check that we still have the list tails. |
| 681 ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); | 944 ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); |
| 682 entry->Close(); | 945 entry->Close(); |
| 683 ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); | 946 ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); |
| 684 entry->Close(); | 947 entry->Close(); |
| 685 } | 948 } |
| 686 | 949 |
| 950 TEST_F(DiskCacheBackendTest, NewEvictionTrim) { |
| 951 BackendNewEvictionTrim(); |
| 952 } |
| 953 |
| 954 TEST_F(DiskCacheBackendTest, V3NewEvictionTrim) { |
| 955 UseVersion3(); |
| 956 BackendNewEvictionTrim(); |
| 957 } |
| 958 |
| 687 // Before looking for invalid entries, let's check a valid entry. | 959 // Before looking for invalid entries, let's check a valid entry. |
| 688 void DiskCacheBackendTest::BackendValidEntry() { | 960 void DiskCacheBackendTest::BackendValidEntry() { |
| 689 InitCache(); | 961 InitCache(); |
| 690 | 962 |
| 691 std::string key("Some key"); | 963 std::string key("Some key"); |
| 692 disk_cache::Entry* entry; | 964 disk_cache::Entry* entry; |
| 693 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 965 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 694 | 966 |
| 695 const int kSize = 50; | 967 const int kSize = 50; |
| 696 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 968 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 697 memset(buffer1->data(), 0, kSize); | 969 memset(buffer1->data(), 0, kSize); |
| 698 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 970 base::strlcpy(buffer1->data(), "And the data to save", kSize); |
| 699 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1, kSize, false)); | 971 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); |
| 700 entry->Close(); | 972 entry->Close(); |
| 701 SimulateCrash(); | 973 SimulateCrash(); |
| 702 | 974 |
| 703 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 975 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 704 | 976 |
| 705 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); | 977 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); |
| 706 memset(buffer2->data(), 0, kSize); | 978 memset(buffer2->data(), 0, kSize); |
| 707 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2, kSize)); | 979 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2.get(), kSize)); |
| 708 entry->Close(); | 980 entry->Close(); |
| 709 EXPECT_STREQ(buffer1->data(), buffer2->data()); | 981 EXPECT_STREQ(buffer1->data(), buffer2->data()); |
| 710 } | 982 } |
| 711 | 983 |
| 712 TEST_F(DiskCacheBackendTest, ValidEntry) { | 984 TEST_F(DiskCacheBackendTest, ValidEntry) { |
| 713 BackendValidEntry(); | 985 BackendValidEntry(); |
| 714 } | 986 } |
| 715 | 987 |
| 716 TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { | 988 TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { |
| 717 SetNewEviction(); | 989 SetNewEviction(); |
| 718 BackendValidEntry(); | 990 BackendValidEntry(); |
| 719 } | 991 } |
| 720 | 992 |
| 721 // The same logic of the previous test (ValidEntry), but this time force the | 993 // The same logic of the previous test (ValidEntry), but this time force the |
| 722 // entry to be invalid, simulating a crash in the middle. | 994 // entry to be invalid, simulating a crash in the middle. |
| 723 // We'll be leaking memory from this test. | 995 // We'll be leaking memory from this test. |
| 724 void DiskCacheBackendTest::BackendInvalidEntry() { | 996 void DiskCacheBackendTest::BackendInvalidEntry() { |
| 725 InitCache(); | 997 InitCache(); |
| 726 | 998 |
| 727 std::string key("Some key"); | 999 std::string key("Some key"); |
| 728 disk_cache::Entry* entry; | 1000 disk_cache::Entry* entry; |
| 729 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1001 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 730 | 1002 |
| 731 const int kSize = 50; | 1003 const int kSize = 50; |
| 732 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1004 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 733 memset(buffer->data(), 0, kSize); | 1005 memset(buffer->data(), 0, kSize); |
| 734 base::strlcpy(buffer->data(), "And the data to save", kSize); | 1006 base::strlcpy(buffer->data(), "And the data to save", kSize); |
| 735 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1007 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 736 SimulateCrash(); | 1008 SimulateCrash(); |
| 737 | 1009 |
| 738 EXPECT_NE(net::OK, OpenEntry(key, &entry)); | 1010 EXPECT_NE(net::OK, OpenEntry(key, &entry)); |
| 739 EXPECT_EQ(0, cache_->GetEntryCount()); | 1011 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 740 } | 1012 } |
| 741 | 1013 |
| 742 // This and the other intentionally leaky tests below are excluded from | 1014 #if !defined(LEAK_SANITIZER) |
| 743 // valgrind runs by naming them in the files | 1015 // We'll be leaking memory from this test. |
| 744 // net/data/valgrind/net_unittests.gtest.txt | |
| 745 // The scripts tools/valgrind/chrome_tests.sh | |
| 746 // read those files and pass the appropriate --gtest_filter to net_unittests. | |
| 747 TEST_F(DiskCacheBackendTest, InvalidEntry) { | 1016 TEST_F(DiskCacheBackendTest, InvalidEntry) { |
| 748 BackendInvalidEntry(); | 1017 BackendInvalidEntry(); |
| 749 } | 1018 } |
| 750 | 1019 |
| 751 // We'll be leaking memory from this test. | 1020 // We'll be leaking memory from this test. |
| 752 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { | 1021 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { |
| 753 SetNewEviction(); | 1022 SetNewEviction(); |
| 754 BackendInvalidEntry(); | 1023 BackendInvalidEntry(); |
| 755 } | 1024 } |
| 756 | 1025 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 772 InitCache(); | 1041 InitCache(); |
| 773 | 1042 |
| 774 std::string key("Some key"); | 1043 std::string key("Some key"); |
| 775 disk_cache::Entry* entry; | 1044 disk_cache::Entry* entry; |
| 776 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1045 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 777 | 1046 |
| 778 const int kSize = 50; | 1047 const int kSize = 50; |
| 779 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1048 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 780 memset(buffer->data(), 0, kSize); | 1049 memset(buffer->data(), 0, kSize); |
| 781 base::strlcpy(buffer->data(), "And the data to save", kSize); | 1050 base::strlcpy(buffer->data(), "And the data to save", kSize); |
| 782 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1051 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 783 entry->Close(); | 1052 entry->Close(); |
| 784 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1053 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 785 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize)); | 1054 EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize)); |
| 786 | 1055 |
| 787 SimulateCrash(); | 1056 SimulateCrash(); |
| 788 | 1057 |
| 789 if (type_ == net::APP_CACHE) { | 1058 if (type_ == net::APP_CACHE) { |
| 790 // Reading an entry and crashing should not make it dirty. | 1059 // Reading an entry and crashing should not make it dirty. |
| 791 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1060 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 792 EXPECT_EQ(1, cache_->GetEntryCount()); | 1061 EXPECT_EQ(1, cache_->GetEntryCount()); |
| 793 entry->Close(); | 1062 entry->Close(); |
| 794 } else { | 1063 } else { |
| 795 EXPECT_NE(net::OK, OpenEntry(key, &entry)); | 1064 EXPECT_NE(net::OK, OpenEntry(key, &entry)); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 SetMaxSize(kSize * 10); | 1167 SetMaxSize(kSize * 10); |
| 899 InitCache(); | 1168 InitCache(); |
| 900 | 1169 |
| 901 std::string first("some key"); | 1170 std::string first("some key"); |
| 902 std::string second("something else"); | 1171 std::string second("something else"); |
| 903 disk_cache::Entry* entry; | 1172 disk_cache::Entry* entry; |
| 904 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); | 1173 ASSERT_EQ(net::OK, CreateEntry(first, &entry)); |
| 905 | 1174 |
| 906 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1175 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 907 memset(buffer->data(), 0, kSize); | 1176 memset(buffer->data(), 0, kSize); |
| 908 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1177 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 909 | 1178 |
| 910 // Simulate a crash. | 1179 // Simulate a crash. |
| 911 SimulateCrash(); | 1180 SimulateCrash(); |
| 912 | 1181 |
| 913 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); | 1182 ASSERT_EQ(net::OK, CreateEntry(second, &entry)); |
| 914 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1183 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 915 | 1184 |
| 916 EXPECT_EQ(2, cache_->GetEntryCount()); | 1185 EXPECT_EQ(2, cache_->GetEntryCount()); |
| 917 SetMaxSize(kSize); | 1186 SetMaxSize(kSize); |
| 918 entry->Close(); // Trim the cache. | 1187 entry->Close(); // Trim the cache. |
| 919 FlushQueueForTest(); | 1188 FlushQueueForTest(); |
| 920 | 1189 |
| 921 // If we evicted the entry in less than 20mS, we have one entry in the cache; | 1190 // If we evicted the entry in less than 20mS, we have one entry in the cache; |
| 922 // if it took more than that, we posted a task and we'll delete the second | 1191 // if it took more than that, we posted a task and we'll delete the second |
| 923 // entry too. | 1192 // entry too. |
| 924 MessageLoop::current()->RunUntilIdle(); | 1193 MessageLoop::current()->RunUntilIdle(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 953 InitCache(); | 1222 InitCache(); |
| 954 | 1223 |
| 955 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 1224 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 956 memset(buffer->data(), 0, kSize); | 1225 memset(buffer->data(), 0, kSize); |
| 957 disk_cache::Entry* entry; | 1226 disk_cache::Entry* entry; |
| 958 | 1227 |
| 959 // Writing 32 entries to this cache chains most of them. | 1228 // Writing 32 entries to this cache chains most of them. |
| 960 for (int i = 0; i < 32; i++) { | 1229 for (int i = 0; i < 32; i++) { |
| 961 std::string key(base::StringPrintf("some key %d", i)); | 1230 std::string key(base::StringPrintf("some key %d", i)); |
| 962 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1231 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 963 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1232 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 964 entry->Close(); | 1233 entry->Close(); |
| 965 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1234 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 966 // Note that we are not closing the entries. | 1235 // Note that we are not closing the entries. |
| 967 } | 1236 } |
| 968 | 1237 |
| 969 // Simulate a crash. | 1238 // Simulate a crash. |
| 970 SimulateCrash(); | 1239 SimulateCrash(); |
| 971 | 1240 |
| 972 ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); | 1241 ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); |
| 973 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false)); | 1242 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
| 974 | 1243 |
| 975 FlushQueueForTest(); | 1244 FlushQueueForTest(); |
| 976 EXPECT_EQ(33, cache_->GetEntryCount()); | 1245 EXPECT_EQ(33, cache_->GetEntryCount()); |
| 977 SetMaxSize(kSize); | 1246 SetMaxSize(kSize); |
| 978 | 1247 |
| 979 // For the new eviction code, all corrupt entries are on the second list so | 1248 // For the new eviction code, all corrupt entries are on the second list so |
| 980 // they are not going away that easy. | 1249 // they are not going away that easy. |
| 981 if (new_eviction_) { | 1250 if (new_eviction_) { |
| 982 EXPECT_EQ(net::OK, DoomAllEntries()); | 1251 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 983 } | 1252 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 998 // We'll be leaking memory from this test. | 1267 // We'll be leaking memory from this test. |
| 999 TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) { | 1268 TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) { |
| 1000 BackendTrimInvalidEntry2(); | 1269 BackendTrimInvalidEntry2(); |
| 1001 } | 1270 } |
| 1002 | 1271 |
| 1003 // We'll be leaking memory from this test. | 1272 // We'll be leaking memory from this test. |
| 1004 TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) { | 1273 TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) { |
| 1005 SetNewEviction(); | 1274 SetNewEviction(); |
| 1006 BackendTrimInvalidEntry2(); | 1275 BackendTrimInvalidEntry2(); |
| 1007 } | 1276 } |
| 1277 #endif // !defined(LEAK_SANITIZER) |
| 1008 | 1278 |
| 1009 void DiskCacheBackendTest::BackendEnumerations() { | 1279 void DiskCacheBackendTest::BackendEnumerations() { |
| 1010 InitCache(); | 1280 InitCache(); |
| 1011 Time initial = Time::Now(); | 1281 Time initial = Time::Now(); |
| 1012 int seed = static_cast<int>(initial.ToInternalValue()); | 1282 int seed = static_cast<int>(initial.ToInternalValue()); |
| 1013 srand(seed); | 1283 srand(seed); |
| 1014 | 1284 |
| 1015 const int kNumEntries = 100; | 1285 const int kNumEntries = 100; |
| 1016 for (int i = 0; i < kNumEntries; i++) { | 1286 for (int i = 0; i < kNumEntries; i++) { |
| 1017 std::string key = GenerateKey(true); | 1287 std::string key = GenerateKey(true); |
| 1018 disk_cache::Entry* entry; | 1288 disk_cache::Entry* entry; |
| 1019 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1289 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1020 entry->Close(); | 1290 entry->Close(); |
| 1291 if (!(i % 10)) |
| 1292 FlushQueueForTest(); |
| 1021 } | 1293 } |
| 1022 EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); | 1294 EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); |
| 1023 Time final = Time::Now(); | 1295 Time final = Time::Now(); |
| 1024 | 1296 |
| 1025 disk_cache::Entry* entry; | 1297 disk_cache::Entry* entry; |
| 1026 void* iter = NULL; | 1298 void* iter = NULL; |
| 1027 int count = 0; | 1299 int count = 0; |
| 1028 Time last_modified[kNumEntries]; | 1300 Time last_modified[kNumEntries]; |
| 1029 Time last_used[kNumEntries]; | 1301 Time last_used[kNumEntries]; |
| 1030 while (OpenNextEntry(&iter, &entry) == net::OK) { | 1302 while (OpenNextEntry(&iter, &entry) == net::OK) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1053 entry->Close(); | 1325 entry->Close(); |
| 1054 count++; | 1326 count++; |
| 1055 }; | 1327 }; |
| 1056 EXPECT_EQ(kNumEntries, count); | 1328 EXPECT_EQ(kNumEntries, count); |
| 1057 } | 1329 } |
| 1058 | 1330 |
| 1059 TEST_F(DiskCacheBackendTest, Enumerations) { | 1331 TEST_F(DiskCacheBackendTest, Enumerations) { |
| 1060 BackendEnumerations(); | 1332 BackendEnumerations(); |
| 1061 } | 1333 } |
| 1062 | 1334 |
| 1335 TEST_F(DiskCacheBackendTest, V3Enumerations) { |
| 1336 UseVersion3(); |
| 1337 BackendEnumerations(); |
| 1338 } |
| 1339 |
| 1063 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { | 1340 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { |
| 1064 SetNewEviction(); | 1341 SetNewEviction(); |
| 1065 BackendEnumerations(); | 1342 BackendEnumerations(); |
| 1066 } | 1343 } |
| 1067 | 1344 |
| 1345 TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations) { |
| 1346 UseVersion3(); |
| 1347 SetNewEviction(); |
| 1348 BackendEnumerations(); |
| 1349 } |
| 1350 |
| 1068 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { | 1351 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { |
| 1069 SetMemoryOnlyMode(); | 1352 SetMemoryOnlyMode(); |
| 1070 BackendEnumerations(); | 1353 BackendEnumerations(); |
| 1071 } | 1354 } |
| 1072 | 1355 |
| 1073 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) { | 1356 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) { |
| 1074 SetCacheType(net::SHADER_CACHE); | 1357 SetCacheType(net::SHADER_CACHE); |
| 1075 BackendEnumerations(); | 1358 BackendEnumerations(); |
| 1076 } | 1359 } |
| 1077 | 1360 |
| 1078 TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { | 1361 TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { |
| 1079 SetCacheType(net::APP_CACHE); | 1362 SetCacheType(net::APP_CACHE); |
| 1080 BackendEnumerations(); | 1363 BackendEnumerations(); |
| 1081 } | 1364 } |
| 1082 | 1365 |
| 1083 // Verifies enumerations while entries are open. | 1366 // Verifies enumerations while entries are open. |
| 1084 void DiskCacheBackendTest::BackendEnumerations2() { | 1367 void DiskCacheBackendTest::BackendEnumerations2() { |
| 1085 InitCache(); | 1368 InitCache(); |
| 1086 const std::string first("first"); | 1369 const std::string first("first"); |
| 1087 const std::string second("second"); | 1370 const std::string second("second"); |
| 1088 disk_cache::Entry *entry1, *entry2; | 1371 disk_cache::Entry *entry1, *entry2; |
| 1089 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); | 1372 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); |
| 1090 entry1->Close(); | 1373 entry1->Close(); |
| 1091 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); | 1374 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); |
| 1092 entry2->Close(); | 1375 entry2->Close(); |
| 1093 FlushQueueForTest(); | 1376 FlushQueueForTest(); |
| 1094 | 1377 |
| 1095 // Make sure that the timestamp is not the same. | 1378 // Make sure that the timestamp is not the same. |
| 1096 AddDelay(); | 1379 AddDelayForTest(kDelayToNextTimestamp); |
| 1097 ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); | 1380 ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); |
| 1098 void* iter = NULL; | 1381 void* iter = NULL; |
| 1099 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); | 1382 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); |
| 1100 EXPECT_EQ(entry2->GetKey(), second); | 1383 EXPECT_EQ(entry2->GetKey(), second); |
| 1101 | 1384 |
| 1102 // Two entries and the iterator pointing at "first". | 1385 // Two entries and the iterator pointing at "first". |
| 1103 entry1->Close(); | 1386 entry1->Close(); |
| 1104 entry2->Close(); | 1387 entry2->Close(); |
| 1105 | 1388 |
| 1106 // The iterator should still be valid, so we should not crash. | 1389 // The iterator should still be valid, so we should not crash. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1122 | 1405 |
| 1123 entry1->Close(); | 1406 entry1->Close(); |
| 1124 entry2->Close(); | 1407 entry2->Close(); |
| 1125 cache_->EndEnumeration(&iter); | 1408 cache_->EndEnumeration(&iter); |
| 1126 } | 1409 } |
| 1127 | 1410 |
| 1128 TEST_F(DiskCacheBackendTest, Enumerations2) { | 1411 TEST_F(DiskCacheBackendTest, Enumerations2) { |
| 1129 BackendEnumerations2(); | 1412 BackendEnumerations2(); |
| 1130 } | 1413 } |
| 1131 | 1414 |
| 1415 TEST_F(DiskCacheBackendTest, V3Enumerations2) { |
| 1416 UseVersion3(); |
| 1417 BackendEnumerations2(); |
| 1418 } |
| 1419 |
| 1132 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { | 1420 TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { |
| 1133 SetNewEviction(); | 1421 SetNewEviction(); |
| 1134 BackendEnumerations2(); | 1422 BackendEnumerations2(); |
| 1135 } | 1423 } |
| 1136 | 1424 |
| 1425 TEST_F(DiskCacheBackendTest, V3NewEvictionEnumerations2) { |
| 1426 UseVersion3(); |
| 1427 SetNewEviction(); |
| 1428 BackendEnumerations2(); |
| 1429 } |
| 1430 |
| 1137 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { | 1431 TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { |
| 1138 SetMemoryOnlyMode(); | 1432 SetMemoryOnlyMode(); |
| 1139 BackendEnumerations2(); | 1433 BackendEnumerations2(); |
| 1140 } | 1434 } |
| 1141 | 1435 |
| 1142 TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { | 1436 TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { |
| 1143 SetCacheType(net::APP_CACHE); | 1437 SetCacheType(net::APP_CACHE); |
| 1144 BackendEnumerations2(); | 1438 BackendEnumerations2(); |
| 1145 } | 1439 } |
| 1146 | 1440 |
| 1147 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations2) { | 1441 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations2) { |
| 1148 SetCacheType(net::SHADER_CACHE); | 1442 SetCacheType(net::SHADER_CACHE); |
| 1149 BackendEnumerations2(); | 1443 BackendEnumerations2(); |
| 1150 } | 1444 } |
| 1151 | 1445 |
| 1152 // Verify that ReadData calls do not update the LRU cache | 1446 // Verify that ReadData calls do not update the LRU cache |
| 1153 // when using the SHADER_CACHE type. | 1447 // when using the SHADER_CACHE type. |
| 1154 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerationReadData) { | 1448 TEST_F(DiskCacheBackendTest, ShaderCacheEnumerationReadData) { |
| 1155 SetCacheType(net::SHADER_CACHE); | 1449 SetCacheType(net::SHADER_CACHE); |
| 1156 InitCache(); | 1450 InitCache(); |
| 1157 const std::string first("first"); | 1451 const std::string first("first"); |
| 1158 const std::string second("second"); | 1452 const std::string second("second"); |
| 1159 disk_cache::Entry *entry1, *entry2; | 1453 disk_cache::Entry *entry1, *entry2; |
| 1160 const int kSize = 50; | 1454 const int kSize = 50; |
| 1161 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 1455 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 1162 | 1456 |
| 1163 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); | 1457 ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); |
| 1164 memset(buffer1->data(), 0, kSize); | 1458 memset(buffer1->data(), 0, kSize); |
| 1165 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 1459 base::strlcpy(buffer1->data(), "And the data to save", kSize); |
| 1166 EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false)); | 1460 EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false)); |
| 1167 | 1461 |
| 1168 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); | 1462 ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); |
| 1169 entry2->Close(); | 1463 entry2->Close(); |
| 1170 | 1464 |
| 1171 FlushQueueForTest(); | 1465 FlushQueueForTest(); |
| 1172 | 1466 |
| 1173 // Make sure that the timestamp is not the same. | 1467 // Make sure that the timestamp is not the same. |
| 1174 AddDelay(); | 1468 AddDelay(); |
| 1175 | 1469 |
| 1176 // Read from the last item in the LRU. | 1470 // Read from the last item in the LRU. |
| 1177 EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize)); | 1471 EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize)); |
| 1178 entry1->Close(); | 1472 entry1->Close(); |
| 1179 | 1473 |
| 1180 void* iter = NULL; | 1474 void* iter = NULL; |
| 1181 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); | 1475 ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); |
| 1182 EXPECT_EQ(entry2->GetKey(), second); | 1476 EXPECT_EQ(entry2->GetKey(), second); |
| 1183 entry2->Close(); | 1477 entry2->Close(); |
| 1184 cache_->EndEnumeration(&iter); | 1478 cache_->EndEnumeration(&iter); |
| 1185 } | 1479 } |
| 1186 | 1480 |
| 1481 #if !defined(LEAK_SANITIZER) |
| 1187 // Verify handling of invalid entries while doing enumerations. | 1482 // Verify handling of invalid entries while doing enumerations. |
| 1188 // We'll be leaking memory from this test. | 1483 // We'll be leaking memory from this test. |
| 1189 void DiskCacheBackendTest::BackendInvalidEntryEnumeration() { | 1484 void DiskCacheBackendTest::BackendInvalidEntryEnumeration() { |
| 1190 InitCache(); | 1485 InitCache(); |
| 1191 | 1486 |
| 1192 std::string key("Some key"); | 1487 std::string key("Some key"); |
| 1193 disk_cache::Entry *entry, *entry1, *entry2; | 1488 disk_cache::Entry *entry, *entry1, *entry2; |
| 1194 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); | 1489 ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); |
| 1195 | 1490 |
| 1196 const int kSize = 50; | 1491 const int kSize = 50; |
| 1197 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); | 1492 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); |
| 1198 memset(buffer1->data(), 0, kSize); | 1493 memset(buffer1->data(), 0, kSize); |
| 1199 base::strlcpy(buffer1->data(), "And the data to save", kSize); | 1494 base::strlcpy(buffer1->data(), "And the data to save", kSize); |
| 1200 EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false)); | 1495 EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false)); |
| 1201 entry1->Close(); | 1496 entry1->Close(); |
| 1202 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); | 1497 ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); |
| 1203 EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize)); | 1498 EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize)); |
| 1204 | 1499 |
| 1205 std::string key2("Another key"); | 1500 std::string key2("Another key"); |
| 1206 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); | 1501 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); |
| 1207 entry2->Close(); | 1502 entry2->Close(); |
| 1208 ASSERT_EQ(2, cache_->GetEntryCount()); | 1503 ASSERT_EQ(2, cache_->GetEntryCount()); |
| 1209 | 1504 |
| 1210 SimulateCrash(); | 1505 SimulateCrash(); |
| 1211 | 1506 |
| 1212 void* iter = NULL; | 1507 void* iter = NULL; |
| 1213 int count = 0; | 1508 int count = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1224 // We'll be leaking memory from this test. | 1519 // We'll be leaking memory from this test. |
| 1225 TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { | 1520 TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { |
| 1226 BackendInvalidEntryEnumeration(); | 1521 BackendInvalidEntryEnumeration(); |
| 1227 } | 1522 } |
| 1228 | 1523 |
| 1229 // We'll be leaking memory from this test. | 1524 // We'll be leaking memory from this test. |
| 1230 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) { | 1525 TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) { |
| 1231 SetNewEviction(); | 1526 SetNewEviction(); |
| 1232 BackendInvalidEntryEnumeration(); | 1527 BackendInvalidEntryEnumeration(); |
| 1233 } | 1528 } |
| 1529 #endif // !defined(LEAK_SANITIZER) |
| 1234 | 1530 |
| 1235 // Tests that if for some reason entries are modified close to existing cache | 1531 // Tests that if for some reason entries are modified close to existing cache |
| 1236 // iterators, we don't generate fatal errors or reset the cache. | 1532 // iterators, we don't generate fatal errors or reset the cache. |
| 1237 void DiskCacheBackendTest::BackendFixEnumerators() { | 1533 void DiskCacheBackendTest::BackendFixEnumerators() { |
| 1238 InitCache(); | 1534 InitCache(); |
| 1239 | 1535 |
| 1240 int seed = static_cast<int>(Time::Now().ToInternalValue()); | 1536 int seed = static_cast<int>(Time::Now().ToInternalValue()); |
| 1241 srand(seed); | 1537 srand(seed); |
| 1242 | 1538 |
| 1243 const int kNumEntries = 10; | 1539 const int kNumEntries = 10; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 void DiskCacheBackendTest::BackendDoomRecent() { | 1596 void DiskCacheBackendTest::BackendDoomRecent() { |
| 1301 InitCache(); | 1597 InitCache(); |
| 1302 | 1598 |
| 1303 disk_cache::Entry *entry; | 1599 disk_cache::Entry *entry; |
| 1304 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); | 1600 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); |
| 1305 entry->Close(); | 1601 entry->Close(); |
| 1306 ASSERT_EQ(net::OK, CreateEntry("second", &entry)); | 1602 ASSERT_EQ(net::OK, CreateEntry("second", &entry)); |
| 1307 entry->Close(); | 1603 entry->Close(); |
| 1308 FlushQueueForTest(); | 1604 FlushQueueForTest(); |
| 1309 | 1605 |
| 1310 AddDelay(); | 1606 AddDelayForTest(kDelayToNextTimestamp); |
| 1311 Time middle = Time::Now(); | 1607 Time middle = GetTime(); |
| 1312 | 1608 |
| 1313 ASSERT_EQ(net::OK, CreateEntry("third", &entry)); | 1609 ASSERT_EQ(net::OK, CreateEntry("third", &entry)); |
| 1314 entry->Close(); | 1610 entry->Close(); |
| 1315 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); | 1611 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); |
| 1316 entry->Close(); | 1612 entry->Close(); |
| 1317 FlushQueueForTest(); | 1613 FlushQueueForTest(); |
| 1318 | 1614 |
| 1319 AddDelay(); | 1615 AddDelayForTest(kDelayToNextTimestamp); |
| 1320 Time final = Time::Now(); | 1616 Time final = GetTime(); |
| 1321 | 1617 |
| 1322 ASSERT_EQ(4, cache_->GetEntryCount()); | 1618 ASSERT_EQ(4, cache_->GetEntryCount()); |
| 1323 EXPECT_EQ(net::OK, DoomEntriesSince(final)); | 1619 EXPECT_EQ(net::OK, DoomEntriesSince(final)); |
| 1324 ASSERT_EQ(4, cache_->GetEntryCount()); | 1620 ASSERT_EQ(4, cache_->GetEntryCount()); |
| 1325 | 1621 |
| 1326 EXPECT_EQ(net::OK, DoomEntriesSince(middle)); | 1622 EXPECT_EQ(net::OK, DoomEntriesSince(middle)); |
| 1327 ASSERT_EQ(2, cache_->GetEntryCount()); | 1623 ASSERT_EQ(2, cache_->GetEntryCount()); |
| 1328 | 1624 |
| 1329 ASSERT_EQ(net::OK, OpenEntry("second", &entry)); | 1625 ASSERT_EQ(net::OK, OpenEntry("second", &entry)); |
| 1330 entry->Close(); | 1626 entry->Close(); |
| 1331 } | 1627 } |
| 1332 | 1628 |
| 1333 TEST_F(DiskCacheBackendTest, DoomRecent) { | 1629 TEST_F(DiskCacheBackendTest, DoomRecent) { |
| 1334 BackendDoomRecent(); | 1630 BackendDoomRecent(); |
| 1335 } | 1631 } |
| 1336 | 1632 |
| 1633 TEST_F(DiskCacheBackendTest, V3DoomRecent) { |
| 1634 UseVersion3(); |
| 1635 BackendDoomRecent(); |
| 1636 } |
| 1637 |
| 1337 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { | 1638 TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { |
| 1338 SetNewEviction(); | 1639 SetNewEviction(); |
| 1339 BackendDoomRecent(); | 1640 BackendDoomRecent(); |
| 1340 } | 1641 } |
| 1341 | 1642 |
| 1643 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomRecent) { |
| 1644 UseVersion3(); |
| 1645 SetNewEviction(); |
| 1646 BackendDoomRecent(); |
| 1647 } |
| 1648 |
| 1342 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { | 1649 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { |
| 1343 SetMemoryOnlyMode(); | 1650 SetMemoryOnlyMode(); |
| 1344 BackendDoomRecent(); | 1651 BackendDoomRecent(); |
| 1345 } | 1652 } |
| 1346 | 1653 |
| 1347 void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start, | |
| 1348 base::Time* doomed_end) { | |
| 1349 InitCache(); | |
| 1350 | |
| 1351 const int kSize = 50; | |
| 1352 // This must be greater then MemEntryImpl::kMaxSparseEntrySize. | |
| 1353 const int kOffset = 10 + 1024 * 1024; | |
| 1354 | |
| 1355 disk_cache::Entry* entry0 = NULL; | |
| 1356 disk_cache::Entry* entry1 = NULL; | |
| 1357 disk_cache::Entry* entry2 = NULL; | |
| 1358 | |
| 1359 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | |
| 1360 CacheTestFillBuffer(buffer->data(), kSize, false); | |
| 1361 | |
| 1362 ASSERT_EQ(net::OK, CreateEntry("zeroth", &entry0)); | |
| 1363 ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize)); | |
| 1364 ASSERT_EQ(kSize, | |
| 1365 WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize)); | |
| 1366 entry0->Close(); | |
| 1367 | |
| 1368 FlushQueueForTest(); | |
| 1369 AddDelay(); | |
| 1370 if (doomed_start) | |
| 1371 *doomed_start = base::Time::Now(); | |
| 1372 | |
| 1373 // Order in rankings list: | |
| 1374 // first_part1, first_part2, second_part1, second_part2 | |
| 1375 ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); | |
| 1376 ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize)); | |
| 1377 ASSERT_EQ(kSize, | |
| 1378 WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize)); | |
| 1379 entry1->Close(); | |
| 1380 | |
| 1381 ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); | |
| 1382 ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize)); | |
| 1383 ASSERT_EQ(kSize, | |
| 1384 WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize)); | |
| 1385 entry2->Close(); | |
| 1386 | |
| 1387 FlushQueueForTest(); | |
| 1388 AddDelay(); | |
| 1389 if (doomed_end) | |
| 1390 *doomed_end = base::Time::Now(); | |
| 1391 | |
| 1392 // Order in rankings list: | |
| 1393 // third_part1, fourth_part1, third_part2, fourth_part2 | |
| 1394 disk_cache::Entry* entry3 = NULL; | |
| 1395 disk_cache::Entry* entry4 = NULL; | |
| 1396 ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); | |
| 1397 ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize)); | |
| 1398 ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); | |
| 1399 ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize)); | |
| 1400 ASSERT_EQ(kSize, | |
| 1401 WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize)); | |
| 1402 ASSERT_EQ(kSize, | |
| 1403 WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize)); | |
| 1404 entry3->Close(); | |
| 1405 entry4->Close(); | |
| 1406 | |
| 1407 FlushQueueForTest(); | |
| 1408 AddDelay(); | |
| 1409 } | |
| 1410 | |
| 1411 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) { | 1654 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) { |
| 1412 SetMemoryOnlyMode(); | 1655 SetMemoryOnlyMode(); |
| 1413 base::Time start; | 1656 base::Time start; |
| 1414 InitSparseCache(&start, NULL); | 1657 InitSparseCache(&start, NULL); |
| 1415 DoomEntriesSince(start); | 1658 DoomEntriesSince(start); |
| 1416 EXPECT_EQ(1, cache_->GetEntryCount()); | 1659 EXPECT_EQ(1, cache_->GetEntryCount()); |
| 1417 } | 1660 } |
| 1418 | 1661 |
| 1419 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) { | 1662 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) { |
| 1420 base::Time start; | 1663 base::Time start; |
| 1421 InitSparseCache(&start, NULL); | 1664 InitSparseCache(&start, NULL); |
| 1422 DoomEntriesSince(start); | 1665 DoomEntriesSince(start); |
| 1423 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while | 1666 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while |
| 1424 // MemBackendImpl does not. Thats why expected value differs here from | 1667 // MemBackendImpl does not. Thats why expected value differs here from |
| 1425 // MemoryOnlyDoomEntriesSinceSparse. | 1668 // MemoryOnlyDoomEntriesSinceSparse. |
| 1426 EXPECT_EQ(3, cache_->GetEntryCount()); | 1669 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1427 } | 1670 } |
| 1428 | 1671 |
| 1672 TEST_F(DiskCacheBackendTest, V3DoomEntriesSinceSparse) { |
| 1673 base::Time start; |
| 1674 UseVersion3(); |
| 1675 InitSparseCache(&start, NULL); |
| 1676 DoomEntriesSince(start); |
| 1677 // NOTE: BackendImpl counts child entries in its GetEntryCount(), while |
| 1678 // MemBackendImpl does not. Thats why expected value differs here from |
| 1679 // MemoryOnlyDoomEntriesSinceSparse. |
| 1680 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1681 } |
| 1682 |
| 1429 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) { | 1683 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) { |
| 1430 SetMemoryOnlyMode(); | 1684 SetMemoryOnlyMode(); |
| 1431 InitSparseCache(NULL, NULL); | 1685 InitSparseCache(NULL, NULL); |
| 1432 EXPECT_EQ(net::OK, DoomAllEntries()); | 1686 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1433 EXPECT_EQ(0, cache_->GetEntryCount()); | 1687 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1434 } | 1688 } |
| 1435 | 1689 |
| 1436 TEST_F(DiskCacheBackendTest, DoomAllSparse) { | 1690 TEST_F(DiskCacheBackendTest, DoomAllSparse) { |
| 1437 InitSparseCache(NULL, NULL); | 1691 InitSparseCache(NULL, NULL); |
| 1438 EXPECT_EQ(net::OK, DoomAllEntries()); | 1692 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1439 EXPECT_EQ(0, cache_->GetEntryCount()); | 1693 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1440 } | 1694 } |
| 1441 | 1695 |
| 1696 TEST_F(DiskCacheBackendTest, V3DoomAllSparse) { |
| 1697 UseVersion3(); |
| 1698 InitSparseCache(NULL, NULL); |
| 1699 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 1700 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 1701 } |
| 1702 |
| 1442 void DiskCacheBackendTest::BackendDoomBetween() { | 1703 void DiskCacheBackendTest::BackendDoomBetween() { |
| 1443 InitCache(); | 1704 InitCache(); |
| 1444 | 1705 |
| 1445 disk_cache::Entry *entry; | 1706 disk_cache::Entry *entry; |
| 1446 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); | 1707 ASSERT_EQ(net::OK, CreateEntry("first", &entry)); |
| 1447 entry->Close(); | 1708 entry->Close(); |
| 1448 FlushQueueForTest(); | 1709 FlushQueueForTest(); |
| 1449 | 1710 |
| 1450 AddDelay(); | 1711 AddDelay(); |
| 1451 Time middle_start = Time::Now(); | 1712 Time middle_start = Time::Now(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1479 ASSERT_EQ(1, cache_->GetEntryCount()); | 1740 ASSERT_EQ(1, cache_->GetEntryCount()); |
| 1480 | 1741 |
| 1481 ASSERT_EQ(net::OK, OpenEntry("first", &entry)); | 1742 ASSERT_EQ(net::OK, OpenEntry("first", &entry)); |
| 1482 entry->Close(); | 1743 entry->Close(); |
| 1483 } | 1744 } |
| 1484 | 1745 |
| 1485 TEST_F(DiskCacheBackendTest, DoomBetween) { | 1746 TEST_F(DiskCacheBackendTest, DoomBetween) { |
| 1486 BackendDoomBetween(); | 1747 BackendDoomBetween(); |
| 1487 } | 1748 } |
| 1488 | 1749 |
| 1750 TEST_F(DiskCacheBackendTest, V3DoomBetween) { |
| 1751 UseVersion3(); |
| 1752 BackendDoomBetween(); |
| 1753 } |
| 1754 |
| 1489 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { | 1755 TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { |
| 1490 SetNewEviction(); | 1756 SetNewEviction(); |
| 1491 BackendDoomBetween(); | 1757 BackendDoomBetween(); |
| 1492 } | 1758 } |
| 1493 | 1759 |
| 1760 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomBetween) { |
| 1761 UseVersion3(); |
| 1762 SetNewEviction(); |
| 1763 BackendDoomBetween(); |
| 1764 } |
| 1765 |
| 1494 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { | 1766 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { |
| 1495 SetMemoryOnlyMode(); | 1767 SetMemoryOnlyMode(); |
| 1496 BackendDoomBetween(); | 1768 BackendDoomBetween(); |
| 1497 } | 1769 } |
| 1498 | 1770 |
| 1499 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) { | 1771 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) { |
| 1500 SetMemoryOnlyMode(); | 1772 SetMemoryOnlyMode(); |
| 1501 base::Time start, end; | 1773 base::Time start, end; |
| 1502 InitSparseCache(&start, &end); | 1774 InitSparseCache(&start, &end); |
| 1503 DoomEntriesBetween(start, end); | 1775 DoomEntriesBetween(start, end); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1514 InitSparseCache(&start, &end); | 1786 InitSparseCache(&start, &end); |
| 1515 DoomEntriesBetween(start, end); | 1787 DoomEntriesBetween(start, end); |
| 1516 EXPECT_EQ(9, cache_->GetEntryCount()); | 1788 EXPECT_EQ(9, cache_->GetEntryCount()); |
| 1517 | 1789 |
| 1518 start = end; | 1790 start = end; |
| 1519 end = base::Time::Now(); | 1791 end = base::Time::Now(); |
| 1520 DoomEntriesBetween(start, end); | 1792 DoomEntriesBetween(start, end); |
| 1521 EXPECT_EQ(3, cache_->GetEntryCount()); | 1793 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1522 } | 1794 } |
| 1523 | 1795 |
| 1796 TEST_F(DiskCacheBackendTest, V3DoomEntriesBetweenSparse) { |
| 1797 base::Time start, end; |
| 1798 UseVersion3(); |
| 1799 InitSparseCache(&start, &end); |
| 1800 DoomEntriesBetween(start, end); |
| 1801 EXPECT_EQ(9, cache_->GetEntryCount()); |
| 1802 |
| 1803 start = end; |
| 1804 end = base::Time::Now(); |
| 1805 DoomEntriesBetween(start, end); |
| 1806 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1807 } |
| 1808 |
| 1524 void DiskCacheBackendTest::BackendTransaction(const std::string& name, | 1809 void DiskCacheBackendTest::BackendTransaction(const std::string& name, |
| 1525 int num_entries, bool load) { | 1810 int num_entries, bool load) { |
| 1526 success_ = false; | 1811 success_ = false; |
| 1527 ASSERT_TRUE(CopyTestCache(name)); | 1812 ASSERT_TRUE(CopyTestCache(name)); |
| 1528 DisableFirstCleanup(); | 1813 DisableFirstCleanup(); |
| 1529 | 1814 |
| 1530 uint32 mask; | 1815 uint32 mask; |
| 1531 if (load) { | 1816 if (load) { |
| 1532 mask = 0xf; | 1817 mask = 0xf; |
| 1533 SetMaxSize(0x100000); | 1818 SetMaxSize(0x100000); |
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2394 CacheTestFillBuffer(key2, sizeof(key2), true); | 2679 CacheTestFillBuffer(key2, sizeof(key2), true); |
| 2395 CacheTestFillBuffer(key3, sizeof(key3), true); | 2680 CacheTestFillBuffer(key3, sizeof(key3), true); |
| 2396 key2[sizeof(key2) - 1] = '\0'; | 2681 key2[sizeof(key2) - 1] = '\0'; |
| 2397 key3[sizeof(key3) - 1] = '\0'; | 2682 key3[sizeof(key3) - 1] = '\0'; |
| 2398 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); | 2683 ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); |
| 2399 ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); | 2684 ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); |
| 2400 | 2685 |
| 2401 const int kBufSize = 20000; | 2686 const int kBufSize = 20000; |
| 2402 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); | 2687 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); |
| 2403 memset(buf->data(), 0, kBufSize); | 2688 memset(buf->data(), 0, kBufSize); |
| 2404 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); | 2689 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false)); |
| 2405 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); | 2690 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false)); |
| 2406 | 2691 |
| 2407 // This line should disable the cache but not delete it. | 2692 // This line should disable the cache but not delete it. |
| 2408 EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); | 2693 EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); |
| 2409 EXPECT_EQ(0, cache_->GetEntryCount()); | 2694 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 2410 | 2695 |
| 2411 EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); | 2696 EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); |
| 2412 | 2697 |
| 2413 EXPECT_EQ(100, ReadData(entry2, 0, 0, buf, 100)); | 2698 EXPECT_EQ(100, ReadData(entry2, 0, 0, buf.get(), 100)); |
| 2414 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false)); | 2699 EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false)); |
| 2415 EXPECT_EQ(100, WriteData(entry2, 1, 0, buf, 100, false)); | 2700 EXPECT_EQ(100, WriteData(entry2, 1, 0, buf.get(), 100, false)); |
| 2416 | 2701 |
| 2417 EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf, kBufSize)); | 2702 EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf.get(), kBufSize)); |
| 2418 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false)); | 2703 EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false)); |
| 2419 EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf, kBufSize, false)); | 2704 EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf.get(), kBufSize, false)); |
| 2420 | 2705 |
| 2421 std::string key = entry2->GetKey(); | 2706 std::string key = entry2->GetKey(); |
| 2422 EXPECT_EQ(sizeof(key2) - 1, key.size()); | 2707 EXPECT_EQ(sizeof(key2) - 1, key.size()); |
| 2423 key = entry3->GetKey(); | 2708 key = entry3->GetKey(); |
| 2424 EXPECT_EQ(sizeof(key3) - 1, key.size()); | 2709 EXPECT_EQ(sizeof(key3) - 1, key.size()); |
| 2425 | 2710 |
| 2426 entry1->Close(); | 2711 entry1->Close(); |
| 2427 entry2->Close(); | 2712 entry2->Close(); |
| 2428 entry3->Close(); | 2713 entry3->Close(); |
| 2429 FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. | 2714 FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2440 } | 2725 } |
| 2441 | 2726 |
| 2442 TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) { | 2727 TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) { |
| 2443 ASSERT_TRUE(CopyTestCache("bad_rankings")); | 2728 ASSERT_TRUE(CopyTestCache("bad_rankings")); |
| 2444 DisableFirstCleanup(); | 2729 DisableFirstCleanup(); |
| 2445 SetNewEviction(); | 2730 SetNewEviction(); |
| 2446 InitCache(); | 2731 InitCache(); |
| 2447 BackendDisable4(); | 2732 BackendDisable4(); |
| 2448 } | 2733 } |
| 2449 | 2734 |
| 2450 TEST_F(DiskCacheTest, Backend_UsageStats) { | 2735 TEST_F(DiskCacheTest, Backend_UsageStatsTimer) { |
| 2451 MessageLoopHelper helper; | 2736 MessageLoopHelper helper; |
| 2452 | 2737 |
| 2453 ASSERT_TRUE(CleanupCacheDir()); | 2738 ASSERT_TRUE(CleanupCacheDir()); |
| 2454 scoped_ptr<disk_cache::BackendImpl> cache; | 2739 scoped_ptr<disk_cache::BackendImpl> cache; |
| 2455 cache.reset(new disk_cache::BackendImpl( | 2740 cache.reset(new disk_cache::BackendImpl( |
| 2456 cache_path_, base::MessageLoopProxy::current(), | 2741 cache_path_, base::MessageLoopProxy::current(), |
| 2457 NULL)); | 2742 NULL)); |
| 2458 ASSERT_TRUE(NULL != cache.get()); | 2743 ASSERT_TRUE(NULL != cache.get()); |
| 2459 cache->SetUnitTestMode(); | 2744 cache->SetUnitTestMode(); |
| 2460 ASSERT_EQ(net::OK, cache->SyncInit()); | 2745 ASSERT_EQ(net::OK, cache->SyncInit()); |
| 2461 | 2746 |
| 2462 // Wait for a callback that never comes... about 2 secs :). The message loop | 2747 // Wait for a callback that never comes... about 2 secs :). The message loop |
| 2463 // has to run to allow invocation of the usage timer. | 2748 // has to run to allow invocation of the usage timer. |
| 2464 helper.WaitUntilCacheIoFinished(1); | 2749 helper.WaitUntilCacheIoFinished(1); |
| 2465 } | 2750 } |
| 2466 | 2751 |
| 2752 TEST_F(DiskCacheBackendTest, Backend_UsageStats) { |
| 2753 InitCache(); |
| 2754 disk_cache::Entry* entry; |
| 2755 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); |
| 2756 entry->Close(); |
| 2757 FlushQueueForTest(); |
| 2758 |
| 2759 disk_cache::StatsItems stats; |
| 2760 cache_->GetStats(&stats); |
| 2761 EXPECT_FALSE(stats.empty()); |
| 2762 |
| 2763 disk_cache::StatsItems::value_type hits("Create hit", "0x1"); |
| 2764 EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits)); |
| 2765 |
| 2766 delete cache_; |
| 2767 cache_ = NULL; |
| 2768 |
| 2769 // Now open the cache and verify that the stats are still there. |
| 2770 DisableFirstCleanup(); |
| 2771 InitCache(); |
| 2772 EXPECT_EQ(1, cache_->GetEntryCount()); |
| 2773 |
| 2774 stats.clear(); |
| 2775 cache_->GetStats(&stats); |
| 2776 EXPECT_FALSE(stats.empty()); |
| 2777 |
| 2778 EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits)); |
| 2779 } |
| 2780 |
| 2467 void DiskCacheBackendTest::BackendDoomAll() { | 2781 void DiskCacheBackendTest::BackendDoomAll() { |
| 2468 InitCache(); | 2782 InitCache(); |
| 2469 | 2783 |
| 2470 disk_cache::Entry *entry1, *entry2; | 2784 disk_cache::Entry *entry1, *entry2; |
| 2471 ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); | 2785 ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); |
| 2472 ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); | 2786 ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); |
| 2473 entry1->Close(); | 2787 entry1->Close(); |
| 2474 entry2->Close(); | 2788 entry2->Close(); |
| 2475 | 2789 |
| 2476 ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); | 2790 ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2507 EXPECT_EQ(net::OK, DoomAllEntries()); | 2821 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 2508 ASSERT_EQ(0, cache_->GetEntryCount()); | 2822 ASSERT_EQ(0, cache_->GetEntryCount()); |
| 2509 | 2823 |
| 2510 EXPECT_EQ(net::OK, DoomAllEntries()); | 2824 EXPECT_EQ(net::OK, DoomAllEntries()); |
| 2511 } | 2825 } |
| 2512 | 2826 |
| 2513 TEST_F(DiskCacheBackendTest, DoomAll) { | 2827 TEST_F(DiskCacheBackendTest, DoomAll) { |
| 2514 BackendDoomAll(); | 2828 BackendDoomAll(); |
| 2515 } | 2829 } |
| 2516 | 2830 |
| 2831 TEST_F(DiskCacheBackendTest, V3DoomAll) { |
| 2832 UseVersion3(); |
| 2833 BackendDoomAll(); |
| 2834 } |
| 2835 |
| 2517 TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { | 2836 TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { |
| 2518 SetNewEviction(); | 2837 SetNewEviction(); |
| 2519 BackendDoomAll(); | 2838 BackendDoomAll(); |
| 2520 } | 2839 } |
| 2521 | 2840 |
| 2841 TEST_F(DiskCacheBackendTest, V3NewEvictionDoomAll) { |
| 2842 UseVersion3(); |
| 2843 SetNewEviction(); |
| 2844 BackendDoomAll(); |
| 2845 } |
| 2846 |
| 2522 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { | 2847 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { |
| 2523 SetMemoryOnlyMode(); | 2848 SetMemoryOnlyMode(); |
| 2524 BackendDoomAll(); | 2849 BackendDoomAll(); |
| 2525 } | 2850 } |
| 2526 | 2851 |
| 2527 TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { | 2852 TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { |
| 2528 SetCacheType(net::APP_CACHE); | 2853 SetCacheType(net::APP_CACHE); |
| 2529 BackendDoomAll(); | 2854 BackendDoomAll(); |
| 2530 } | 2855 } |
| 2531 | 2856 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2655 InitCache(); | 2980 InitCache(); |
| 2656 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. | 2981 disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. |
| 2657 | 2982 |
| 2658 for (int i = 1; i < 3; i++) { | 2983 for (int i = 1; i < 3; i++) { |
| 2659 CACHE_UMA(HOURS, "FillupTime", i, 28); | 2984 CACHE_UMA(HOURS, "FillupTime", i, 28); |
| 2660 } | 2985 } |
| 2661 } | 2986 } |
| 2662 | 2987 |
| 2663 // Make sure that we keep the total memory used by the internal buffers under | 2988 // Make sure that we keep the total memory used by the internal buffers under |
| 2664 // control. | 2989 // control. |
| 2665 TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { | 2990 void DiskCacheBackendTest::BackendTotalBuffersSize1() { |
| 2666 InitCache(); | 2991 InitCache(); |
| 2667 std::string key("the first key"); | 2992 std::string key("the first key"); |
| 2668 disk_cache::Entry* entry; | 2993 disk_cache::Entry* entry; |
| 2669 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 2994 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2670 | 2995 |
| 2671 const int kSize = 200; | 2996 const int kSize = 200; |
| 2672 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 2997 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 2673 CacheTestFillBuffer(buffer->data(), kSize, true); | 2998 CacheTestFillBuffer(buffer->data(), kSize, true); |
| 2674 | 2999 |
| 2675 for (int i = 0; i < 10; i++) { | 3000 for (int i = 0; i < 10; i++) { |
| 2676 SCOPED_TRACE(i); | 3001 SCOPED_TRACE(i); |
| 2677 // Allocate 2MB for this entry. | 3002 // Allocate 2MB for this entry. |
| 2678 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true)); | 3003 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, true)); |
| 2679 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true)); | 3004 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, true)); |
| 2680 EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false)); | 3005 EXPECT_EQ(kSize, |
| 2681 EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false)); | 3006 WriteData(entry, 0, 1024 * 1024, buffer.get(), kSize, false)); |
| 3007 EXPECT_EQ(kSize, |
| 3008 WriteData(entry, 1, 1024 * 1024, buffer.get(), kSize, false)); |
| 2682 | 3009 |
| 2683 // Delete one of the buffers and truncate the other. | 3010 // Delete one of the buffers and truncate the other. |
| 2684 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); | 3011 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true)); |
| 2685 EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true)); | 3012 EXPECT_EQ(0, WriteData(entry, 1, 10, buffer.get(), 0, true)); |
| 2686 | 3013 |
| 2687 // Delete the second buffer, writing 10 bytes to disk. | 3014 // Delete the second buffer, writing 10 bytes to disk. |
| 2688 entry->Close(); | 3015 entry->Close(); |
| 2689 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 3016 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 2690 } | 3017 } |
| 2691 | 3018 |
| 2692 entry->Close(); | 3019 entry->Close(); |
| 2693 EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); | 3020 EXPECT_EQ(0, GetTotalBuffersSize()); |
| 3021 } |
| 3022 |
| 3023 TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { |
| 3024 BackendTotalBuffersSize1(); |
| 3025 } |
| 3026 |
| 3027 TEST_F(DiskCacheBackendTest, V3TotalBuffersSize1) { |
| 3028 UseVersion3(); |
| 3029 BackendTotalBuffersSize1(); |
| 2694 } | 3030 } |
| 2695 | 3031 |
| 2696 // This test assumes at least 150MB of system memory. | 3032 // This test assumes at least 150MB of system memory. |
| 2697 TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { | 3033 void DiskCacheBackendTest::BackendTotalBuffersSize2() { |
| 2698 InitCache(); | 3034 InitCache(); |
| 2699 | 3035 |
| 2700 const int kOneMB = 1024 * 1024; | 3036 const int kOneMB = 1024 * 1024; |
| 2701 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 3037 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2702 EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); | 3038 EXPECT_EQ(kOneMB, GetTotalBuffersSize()); |
| 2703 | 3039 |
| 2704 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 3040 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2705 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | 3041 EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize()); |
| 2706 | 3042 |
| 2707 EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 3043 EXPECT_TRUE(IsAllocAllowed(0, kOneMB)); |
| 2708 EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); | 3044 EXPECT_EQ(kOneMB * 3, GetTotalBuffersSize()); |
| 2709 | 3045 |
| 2710 cache_impl_->BufferDeleted(kOneMB); | 3046 BufferDeleted(kOneMB); |
| 2711 EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); | 3047 EXPECT_EQ(kOneMB * 2, GetTotalBuffersSize()); |
| 2712 | 3048 |
| 2713 // Check the upper limit. | 3049 // Check the upper limit. |
| 2714 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); | 3050 EXPECT_FALSE(IsAllocAllowed(0, 30 * kOneMB)); |
| 2715 | 3051 |
| 2716 for (int i = 0; i < 30; i++) | 3052 for (int i = 0; i < 30; i++) |
| 2717 cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. | 3053 IsAllocAllowed(0, kOneMB); // Ignore the result. |
| 2718 | 3054 |
| 2719 EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); | 3055 EXPECT_FALSE(IsAllocAllowed(0, kOneMB)); |
| 3056 } |
| 3057 |
| 3058 TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { |
| 3059 BackendTotalBuffersSize2(); |
| 3060 } |
| 3061 |
| 3062 TEST_F(DiskCacheBackendTest, V3TotalBuffersSize2) { |
| 3063 UseVersion3(); |
| 3064 BackendTotalBuffersSize2(); |
| 2720 } | 3065 } |
| 2721 | 3066 |
| 2722 // Tests that sharing of external files works and we are able to delete the | 3067 // Tests that sharing of external files works and we are able to delete the |
| 2723 // files when we need to. | 3068 // files when we need to. |
| 2724 TEST_F(DiskCacheBackendTest, FileSharing) { | 3069 TEST_F(DiskCacheBackendTest, FileSharing) { |
| 2725 InitCache(); | 3070 InitCache(); |
| 2726 | 3071 |
| 2727 disk_cache::Addr address(0x80000001); | 3072 disk_cache::Addr address(0x80000001); |
| 2728 ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); | 3073 ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); |
| 2729 base::FilePath name = cache_impl_->GetFileName(address); | 3074 base::FilePath name = cache_impl_->GetFileName(address); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2752 char buffer2[kSize]; | 3097 char buffer2[kSize]; |
| 2753 memset(buffer1, 't', kSize); | 3098 memset(buffer1, 't', kSize); |
| 2754 memset(buffer2, 0, kSize); | 3099 memset(buffer2, 0, kSize); |
| 2755 EXPECT_TRUE(file->Write(buffer1, kSize, 0)); | 3100 EXPECT_TRUE(file->Write(buffer1, kSize, 0)); |
| 2756 EXPECT_TRUE(file->Read(buffer2, kSize, 0)); | 3101 EXPECT_TRUE(file->Read(buffer2, kSize, 0)); |
| 2757 EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); | 3102 EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); |
| 2758 | 3103 |
| 2759 EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); | 3104 EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); |
| 2760 } | 3105 } |
| 2761 | 3106 |
| 2762 TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { | 3107 void DiskCacheBackendTest::BackendUpdateRankForExternalCacheHit() { |
| 2763 InitCache(); | 3108 InitCache(); |
| 2764 | 3109 |
| 2765 disk_cache::Entry* entry; | 3110 disk_cache::Entry* entry; |
| 2766 | 3111 |
| 2767 for (int i = 0; i < 2; ++i) { | 3112 for (int i = 0; i < 2; ++i) { |
| 2768 std::string key = base::StringPrintf("key%d", i); | 3113 std::string key = base::StringPrintf("key%d", i); |
| 2769 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 3114 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 2770 entry->Close(); | 3115 entry->Close(); |
| 3116 AddDelayForTest(kDelayToNextTimestamp); |
| 2771 } | 3117 } |
| 3118 FlushQueueForTest(); |
| 2772 | 3119 |
| 2773 // Ping the oldest entry. | 3120 // Ping the oldest entry. |
| 3121 SetTestMode(); |
| 2774 cache_->OnExternalCacheHit("key0"); | 3122 cache_->OnExternalCacheHit("key0"); |
| 3123 FlushQueueForTest(); |
| 2775 | 3124 |
| 2776 TrimForTest(false); | 3125 TrimForTest(false); |
| 2777 | 3126 |
| 2778 // Make sure the older key remains. | 3127 // Make sure the older key remains. |
| 2779 EXPECT_EQ(1, cache_->GetEntryCount()); | 3128 EXPECT_NE(net::OK, OpenEntry("key1", &entry)); |
| 2780 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); | 3129 ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); |
| 2781 entry->Close(); | 3130 entry->Close(); |
| 2782 } | 3131 } |
| 2783 | 3132 |
| 3133 TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { |
| 3134 BackendUpdateRankForExternalCacheHit(); |
| 3135 } |
| 3136 |
| 3137 TEST_F(DiskCacheBackendTest, V3UpdateRankForExternalCacheHit) { |
| 3138 UseVersion3(); |
| 3139 BackendUpdateRankForExternalCacheHit(); |
| 3140 } |
| 3141 |
| 2784 TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) { | 3142 TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) { |
| 2785 SetCacheType(net::SHADER_CACHE); | 3143 SetCacheType(net::SHADER_CACHE); |
| 2786 InitCache(); | 3144 BackendUpdateRankForExternalCacheHit(); |
| 3145 } |
| 2787 | 3146 |
| 2788 disk_cache::Entry* entry; | 3147 TEST_F(DiskCacheBackendTest, V3ShaderCacheUpdateRankForExternalCacheHit) { |
| 2789 | 3148 UseVersion3(); |
| 2790 for (int i = 0; i < 2; ++i) { | 3149 SetCacheType(net::SHADER_CACHE); |
| 2791 std::string key = base::StringPrintf("key%d", i); | 3150 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 } | 3151 } |
| 2806 | 3152 |
| 2807 void DiskCacheBackendTest::TracingBackendBasics() { | 3153 void DiskCacheBackendTest::TracingBackendBasics() { |
| 2808 InitCache(); | 3154 InitCache(); |
| 2809 cache_ = new disk_cache::TracingCacheBackend(cache_); | 3155 cache_ = new disk_cache::TracingCacheBackend(cache_); |
| 2810 cache_impl_ = NULL; | 3156 cache_impl_ = NULL; |
| 2811 EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType()); | 3157 EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType()); |
| 2812 if (!simple_cache_mode_) { | 3158 if (!simple_cache_mode_) { |
| 2813 EXPECT_EQ(0, cache_->GetEntryCount()); | 3159 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 2814 } | 3160 } |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2967 // Tests that the Simple Cache Backend fails to initialize with non-matching | 3313 // Tests that the Simple Cache Backend fails to initialize with non-matching |
| 2968 // file structure on disk. | 3314 // file structure on disk. |
| 2969 TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) { | 3315 TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) { |
| 2970 // Create a cache structure with the |BackendImpl|. | 3316 // Create a cache structure with the |BackendImpl|. |
| 2971 InitCache(); | 3317 InitCache(); |
| 2972 disk_cache::Entry* entry; | 3318 disk_cache::Entry* entry; |
| 2973 const int kSize = 50; | 3319 const int kSize = 50; |
| 2974 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 3320 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 2975 CacheTestFillBuffer(buffer->data(), kSize, false); | 3321 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 2976 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); | 3322 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); |
| 2977 ASSERT_EQ(0, WriteData(entry, 0, 0, buffer, 0, false)); | 3323 ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false)); |
| 2978 entry->Close(); | 3324 entry->Close(); |
| 2979 delete cache_; | 3325 delete cache_; |
| 2980 cache_ = NULL; | 3326 cache_ = NULL; |
| 2981 | 3327 |
| 2982 // Check that the |SimpleBackendImpl| does not favor this structure. | 3328 // Check that the |SimpleBackendImpl| does not favor this structure. |
| 2983 base::Thread cache_thread("CacheThread"); | 3329 base::Thread cache_thread("CacheThread"); |
| 2984 ASSERT_TRUE(cache_thread.StartWithOptions( | 3330 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 2985 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 3331 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 2986 disk_cache::SimpleBackendImpl* simple_cache = | 3332 disk_cache::SimpleBackendImpl* simple_cache = |
| 2987 new disk_cache::SimpleBackendImpl(cache_path_, 0, net::DISK_CACHE, | 3333 new disk_cache::SimpleBackendImpl(cache_path_, |
| 2988 cache_thread.message_loop_proxy(), | 3334 0, |
| 3335 net::DISK_CACHE, |
| 3336 cache_thread.message_loop_proxy().get(), |
| 2989 NULL); | 3337 NULL); |
| 2990 net::TestCompletionCallback cb; | 3338 net::TestCompletionCallback cb; |
| 2991 int rv = simple_cache->Init(cb.callback()); | 3339 int rv = simple_cache->Init(cb.callback()); |
| 2992 EXPECT_NE(net::OK, cb.GetResult(rv)); | 3340 EXPECT_NE(net::OK, cb.GetResult(rv)); |
| 2993 delete simple_cache; | 3341 delete simple_cache; |
| 2994 DisableIntegrityCheck(); | 3342 DisableIntegrityCheck(); |
| 2995 } | 3343 } |
| 2996 | 3344 |
| 2997 // Tests that the |BackendImpl| refuses to initialize on top of the files | 3345 // Tests that the |BackendImpl| refuses to initialize on top of the files |
| 2998 // generated by the Simple Cache Backend. | 3346 // generated by the Simple Cache Backend. |
| 2999 TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) { | 3347 TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) { |
| 3000 // Create a cache structure with the |SimpleBackendImpl|. | 3348 // Create a cache structure with the |SimpleBackendImpl|. |
| 3001 SetSimpleCacheMode(); | 3349 SetSimpleCacheMode(); |
| 3002 InitCache(); | 3350 InitCache(); |
| 3003 disk_cache::Entry* entry; | 3351 disk_cache::Entry* entry; |
| 3004 const int kSize = 50; | 3352 const int kSize = 50; |
| 3005 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); | 3353 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
| 3006 CacheTestFillBuffer(buffer->data(), kSize, false); | 3354 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 3007 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); | 3355 ASSERT_EQ(net::OK, CreateEntry("key", &entry)); |
| 3008 ASSERT_EQ(0, WriteData(entry, 0, 0, buffer, 0, false)); | 3356 ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false)); |
| 3009 entry->Close(); | 3357 entry->Close(); |
| 3010 delete cache_; | 3358 delete cache_; |
| 3011 cache_ = NULL; | 3359 cache_ = NULL; |
| 3012 | 3360 |
| 3013 // Check that the |BackendImpl| does not favor this structure. | 3361 // Check that the |BackendImpl| does not favor this structure. |
| 3014 base::Thread cache_thread("CacheThread"); | 3362 base::Thread cache_thread("CacheThread"); |
| 3015 ASSERT_TRUE(cache_thread.StartWithOptions( | 3363 ASSERT_TRUE(cache_thread.StartWithOptions( |
| 3016 base::Thread::Options(MessageLoop::TYPE_IO, 0))); | 3364 base::Thread::Options(MessageLoop::TYPE_IO, 0))); |
| 3017 disk_cache::BackendImpl* cache = | 3365 disk_cache::BackendImpl* cache = |
| 3018 new disk_cache::BackendImpl(cache_path_, | 3366 new disk_cache::BackendImpl(cache_path_, |
| 3019 base::MessageLoopProxy::current(), | 3367 base::MessageLoopProxy::current(), |
| 3020 NULL); | 3368 NULL); |
| 3021 cache->SetUnitTestMode(); | 3369 cache->SetUnitTestMode(); |
| 3022 net::TestCompletionCallback cb; | 3370 net::TestCompletionCallback cb; |
| 3023 int rv = cache->Init(cb.callback()); | 3371 int rv = cache->Init(cb.callback()); |
| 3024 EXPECT_NE(net::OK, cb.GetResult(rv)); | 3372 EXPECT_NE(net::OK, cb.GetResult(rv)); |
| 3025 delete cache; | 3373 delete cache; |
| 3026 DisableIntegrityCheck(); | 3374 DisableIntegrityCheck(); |
| 3027 } | 3375 } |
| 3028 | 3376 |
| 3029 #endif // !defined(OS_WIN) | 3377 #endif // !defined(OS_WIN) |
| OLD | NEW |