15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/metrics/field_trial.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/port.h" 95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "net/base/cache_type.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/backend_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/cache_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_base.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/entry_impl.h" 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/disk_cache/experiments.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/histogram_macros.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/mapped_file.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/mem_backend_impl.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_backend_impl.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_entry_format.h" 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/disk_cache/simple/simple_test_util.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_util.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/tracing_cache_backend.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace { 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kExistingEntryKey[] = "existing entry key"; 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<disk_cache::BackendImpl> CreateExistingEntryCache( 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::Thread& cache_thread, 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FilePath& cache_path) { 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch net::TestCompletionCallback cb; 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl( 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_path, cache_thread.message_loop_proxy(), NULL)); 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int rv = cache->Init(cb.callback()); 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (cb.GetResult(rv) != net::OK) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<disk_cache::BackendImpl>(); 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch disk_cache::Entry* entry = NULL; 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch rv = cache->CreateEntry(kExistingEntryKey, &entry, cb.callback()); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (cb.GetResult(rv) != net::OK) 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<disk_cache::BackendImpl>(); 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch entry->Close(); 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return cache.Pass(); 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that can run with different types of caches. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiskCacheBackendTest : public DiskCacheTestWithCache { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendBasics(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendKeying(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingFileIO(bool fast); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingIO(bool fast); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendShutdownWithPendingCreate(bool fast); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendSetSize(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendLoad(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendChain(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendValidEntry(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryRead(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryWithLoad(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry2(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendEnumerations(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendEnumerations2(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntryEnumeration(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendFixEnumerators(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomRecent(); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL, 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // There are 4 entries after doomed_start and 2 after doomed_end. 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomBetween(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTransaction(const std::string& name, int num_entries, bool load); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverInsert(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverRemove(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendRecoverWithEviction(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry2(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry3(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry7(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry8(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry9(bool eviction); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry10(bool eviction); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidEntry11(bool eviction); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendTrimInvalidEntry12(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomAll(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDoomAll2(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidRankings(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendInvalidRankings2(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable2(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable3(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BackendDisable4(); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void TracingBackendBasics(); 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool CreateSetOfRandomEntries(std::set<std::string>* key_pool); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool EnumerateAndMatchKeys(int max_to_open, 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void** iter, 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string>* keys_to_match, 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t* count); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendBasics() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1 = NULL, *entry2 = NULL; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("the first key", &entry1)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry3 = NULL; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry3); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry2 == entry3); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("some other key")); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("the first key")); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Doom(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntry("some other key")); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Basics) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionBasics) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyBasics) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheBasics) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendBasics(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheBasics) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendBasics(); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendKeying() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kName1 = "the first key"; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kName2 = "the first Key"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1)); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 != entry2) << "Case sensitive"; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer[30]; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer, kName1, arraysize(buffer)); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer, &entry2)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer + 1, kName1, arraysize(buffer) - 1); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer + 1, &entry2)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer + 3, kName1, arraysize(buffer) - 3); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(buffer + 3, &entry2)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry1 == entry2); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now verify long keys. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer2[20000]; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2, 's', sizeof(buffer2)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[1023] = '\0'; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file"; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[1023] = 'g'; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer2[19999] = '\0'; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file"; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Keying) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionKeying) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheKeying) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendKeying(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheKeying) { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendKeying(); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, CreateBackend) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test the private factory method(s). 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend> cache; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL); 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now test the public API. 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int rv = 2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) disk_cache::CreateCacheBackend(net::DISK_CACHE, 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_DEFAULT, 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_path_, 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL, 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &cache, 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cb.callback()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE, 290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::CACHE_BACKEND_DEFAULT, 291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::FilePath(), 0, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, NULL, NULL, &cache, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cb.callback()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that |BackendImpl| fails to initialize with a missing file. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_entry")); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filename = cache_path_.AppendASCII("data_1"); 3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(filename, false); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Thread cache_thread("CacheThread"); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback cb; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prev = base::ThreadRestrictions::SetIOAllowed(false); 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl( 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_path_, cache_thread.message_loop_proxy().get(), NULL)); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = cache->Init(cb.callback()); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::ERR_FAILED, cb.GetResult(rv)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(prev); 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableIntegrityCheck(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ExternalFiles) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, let's create a file on the folder. 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filename = cache_path_.AppendASCII("f_000001"); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer1->data(), kSize, false); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now let's create a file with the cache. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1.get(), 0, false)); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And verify that the first file is still there. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with file-level pending operations at destruction time. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags = disk_cache::kNoBuffering; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fast) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= disk_cache::kNoRandom; 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UseCurrentThread(); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateBackend(flags, NULL); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry; 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = cache_->CreateEntry( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "some key", reinterpret_cast<disk_cache::Entry**>(&entry), 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.callback()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 25000; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, false); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are using the current thread as the cache thread because we want to 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to call directly this method to make sure that the OS (instead 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of us switching thread) is returning IO pending. 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) rv = 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry->WriteDataImpl(0, i, buffer.get(), kSize, cb.callback(), false); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSize, rv); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't call Close() to avoid going through the queue or we'll deadlock 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // waiting for the operation to finish. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Release(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache destructor will see one pending operation here. 389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fast) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cb.have_result()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cb.have_result()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the actual operation to complete, or we'll keep a file handle that 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may cause issues later. Note that on Posix systems even though this test 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses a single thread, the actual IO is posted to a worker thread and the 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cache destructor breaks the link to reach cb when the operation completes. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cb.GetResult(rv); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingFileIO(false); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Here and below, tests that simulate crashes are not compiled in LeakSanitizer 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// builds because they contain a lot of intentional memory leaks. 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The wrapper scripts used to run tests under Valgrind Memcheck and 417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Heapchecker will also disable these tests under those tools. See: 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// tools/valgrind/gtest_exclude/net_unittests.gtest-memcheck.txt 419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// tools/heapcheck/net_unittests.gtest-heapcheck.txt 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingFileIO(true); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with background-thread pending operations. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags = disk_cache::kNoBuffering; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fast) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= disk_cache::kNoRandom; 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateBackend(flags, &cache_thread); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = cache_->CreateEntry("some key", &entry, cb.callback()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache destructor will see one pending operation here. 453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingIO(false); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO_Fast) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingIO(true); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with create-type pending operations. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 48190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::BackendFlags flags = 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fast ? disk_cache::kNone : disk_cache::kNoRandom; 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateBackend(flags, &cache_thread); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = cache_->CreateEntry("some key", &entry, cb.callback()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::ERR_IO_PENDING, rv); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cb.have_result()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingCreate(false); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking an entry from this test. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate_Fast) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The integrity test sets kNoRandom so there's a version mismatch if we don't 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // force new eviction. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendShutdownWithPendingCreate(true); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, TruncatedIndex) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath index = cache_path_.AppendASCII("index"); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(5, file_util::WriteFile(index, "hello", 5)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend> backend; 5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int rv = 5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) disk_cache::CreateCacheBackend(net::DISK_CACHE, 5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_BLOCKFILE, 5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_path_, 5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL, 5317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &backend, 5327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cb.callback()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, cb.GetResult(rv)); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_FALSE(backend); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendSetSize() { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int cache_size = 0x10000; // 64 kB 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size)); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, cache_size); 550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(cache_size / 10, 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false)) 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << "normal file"; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(net::ERR_FAILED, 555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false)) 556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << "file size above the limit"; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By doubling the total size, we make this file cacheable. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size * 2); 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(cache_size / 5, 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false)); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's fill up the cache!. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size * 10); 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(cache_size * 3 / 4, 566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 0, 0, buffer.get(), cache_size * 3 / 4, false)); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(cache_size); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache is 95% full. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(cache_size / 10, 576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false)); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry2; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2)); 580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(cache_size / 10, 581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry2, 0, 0, buffer.get(), cache_size / 10, false)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); // This will trigger the cache trim. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(first, &entry2)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Make sure that we are done trimming the cache. 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // We may have posted two tasks to evict stuff. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry)); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cache_size / 10, entry->GetDataSize(0)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, SetSize) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionSetSize) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendSetSize(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendLoad() { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entries[100]; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, cache_->GetEntryCount()); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source1 = rand() % 100; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source2 = rand() % 100; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* temp = entries[source1]; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source1] = entries[source2]; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source2] = temp; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(entries[i]->GetKey(), &entry)); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == entries[i]); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Doom(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Close(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Load) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionLoad) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyLoad) { 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheLoad) { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendLoad(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheLoad) { 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Work with a tiny index table (16 entries) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetMask(0xf); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetMaxSize(0x100000); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendLoad(); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the chaining of an entry to the current head. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendChain() { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The Second key", &entry)); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Chain) { 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionChain) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheChain) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendChain(); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheChain) { 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendChain(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrim) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 100; i++) { 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name(base::StringPrintf("Key %d", i)); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(name, &entry)); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < 90) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entries 0 to 89 are in list 1; 90 to 99 are in list 0. 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(name, &entry)); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first eviction must come from list 1 (10% limit), the second must come 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from list 0. 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("Key 0", &entry)); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("Key 90", &entry)); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double check that we still have the list tails. 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry)); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry)); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Before looking for invalid entries, let's check a valid entry. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendValidEntry() { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1->data(), 0, kSize); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer1->data(), "And the data to save", kSize); 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false)); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2->data(), 0, kSize); 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2.get(), kSize)); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(buffer1->data(), buffer2->data()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ValidEntry) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendValidEntry(); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendValidEntry(); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The same logic of the previous test (ValidEntry), but this time force the 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entry to be invalid, simulating a crash in the middle. 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry() { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer->data(), "And the data to save", kSize); 788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(key, &entry)); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER) 796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// We'll be leaking memory from this test. 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry(); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test. 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntry) { 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendInvalidEntry(); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Almost the same test, but this time crash the cache after reading an entry. 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryRead() { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer->data(), "And the data to save", kSize); 832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize)); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == net::APP_CACHE) { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reading an entry and crashing should not make it dirty. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(key, &entry)); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryRead) { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryRead(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryRead) { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendInvalidEntryRead(); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryWithLoad() { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Work with a tiny index table (16 entries) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 100; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entries[kNumEntries]; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entries[i])); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source1 = rand() % kNumEntries; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source2 = rand() % kNumEntries; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* temp = entries[source1]; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source1] = entries[source2]; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[source2] = temp; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string keys[kNumEntries]; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys[i] = entries[i]->GetKey(); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < kNumEntries / 2) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i]->Close(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = kNumEntries / 2; i < kNumEntries; i++) { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(keys[i], &entry)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries / 2; i++) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(keys[i], &entry)); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount()); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryWithLoad(); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryWithLoad) { 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendInvalidEntryWithLoad(); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test. 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry() { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a crash. 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); // Trim the cache. 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we evicted the entry in less than 20mS, we have one entry in the cache; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it took more than that, we posted a task and we'll delete the second 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry too. 97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This may be not thread-safe in general, but for now it's OK so add some 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ThreadSanitizer annotations to ignore data races on cache_. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/55970 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_BEGIN(); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(1, cache_->GetEntryCount()); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_END(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(first, &entry)); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry) { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry(); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry2() { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); // 16-entry table. 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 40); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer->data(), 0, kSize); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing 32 entries to this cache chains most of them. 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 32; i++) { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(base::StringPrintf("some key %d", i)); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we are not closing the entries. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a crash. 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something else", &entry)); 1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(33, cache_->GetEntryCount()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the new eviction code, all corrupt entries are on the second list so 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they are not going away that easy. 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_eviction_) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); // Trim the cache. 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may abort the eviction before cleaning up everything. 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's not clear enough: we may still have eviction tasks running at this 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, so the number of entries is changing while we read it. 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(30, cache_->GetEntryCount()); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_IGNORE_READS_AND_WRITES_END(); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry2(); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry2(); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // !defined(LEAK_SANITIZER) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations() { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time initial = Time::Now(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 100; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_modified[kNumEntries]; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_used[kNumEntries]; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count < kNumEntries) { 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_modified[count] = entry->GetLastModified(); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_used[count] = entry->GetLastUsed(); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial <= last_modified[count]); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(final >= last_modified[count]); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, count); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter = NULL; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = 0; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The previous enumeration should not have changed the timestamps. 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count < kNumEntries) { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_modified[count] == entry->GetLastModified()); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_used[count] == entry->GetLastUsed()); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, count); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations) { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) { 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendEnumerations(); 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations) { 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations(); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies enumerations while entries are open. 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations2() { 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string first("first"); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string second("second"); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the timestamp is not the same. 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry1)); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), second); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two entries and the iterator pointing at "first". 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iterator should still be valid, so we should not crash. 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), first); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify the oldest entry and get the newest element. 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry1)); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false)); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == net::APP_CACHE) { 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list is not updated. 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), second); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(entry2->GetKey(), first); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations2) { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendEnumerations2(); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations2) { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendEnumerations2(); 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that ReadData calls do not update the LRU cache 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when using the SHADER_CACHE type. 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerationReadData) { 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCache(); 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string first("first"); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string second("second"); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disk_cache::Entry *entry1, *entry2; 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kSize = 50; 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry1)); 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(buffer1->data(), 0, kSize); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::strlcpy(buffer1->data(), "And the data to save", kSize); 1215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false)); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry2)); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry2->Close(); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FlushQueueForTest(); 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that the timestamp is not the same. 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDelay(); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read from the last item in the LRU. 1226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize)); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry1->Close(); 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* iter = NULL; 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2)); 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(entry2->GetKey(), second); 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry2->Close(); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->EndEnumeration(&iter); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify handling of invalid entries while doing enumerations. 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryEnumeration() { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("Some key"); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry, *entry1, *entry2; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 50; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize)); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1->data(), 0, kSize); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(buffer1->data(), "And the data to save", kSize); 1250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false)); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); 1253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize)); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key2("Another key"); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateCrash(); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(key2, entry->GetKey()); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, count); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryEnumeration(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test. 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntryEnumeration(); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // !defined(LEAK_SANITIZER) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that if for some reason entries are modified close to existing cache 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iterators, we don't generate fatal errors or reset the cache. 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendFixEnumerators() { 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumEntries = 10; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries; i++) { 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = GenerateKey(true); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumEntries, cache_->GetEntryCount()); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter1 = NULL; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter2 = NULL; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1 = NULL; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's go to the middle of the list. 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumEntries / 2; i++) { 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry1) 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1)); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry1); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Messing up with entry1 will modify entry2->next. 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Doom(); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The link entry2->entry1 should be broken. 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(entry2->GetKey(), entry1->GetKey()); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the second iterator should keep working. 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2)); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry2); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter1); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->EndEnumeration(&iter2); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FixEnumerators) { 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFixEnumerators(); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) { 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFixEnumerators(); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomRecent() { 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle = Time::Now(); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesSince(final)); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesSince(middle)); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("second", &entry)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomRecent) { 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) { 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomRecent(); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start, 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time* doomed_end) { 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kSize = 50; 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This must be greater then MemEntryImpl::kMaxSparseEntrySize. 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kOffset = 10 + 1024 * 1024; 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry0 = NULL; 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry1 = NULL; 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry2 = NULL; 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, false); 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("zeroth", &entry0)); 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize)); 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize)); 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry0->Close(); 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FlushQueueForTest(); 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddDelay(); 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (doomed_start) 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *doomed_start = base::Time::Now(); 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Order in rankings list: 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // first_part1, first_part2, second_part1, second_part2 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize)); 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize)); 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry1->Close(); 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize)); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize)); 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry2->Close(); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FlushQueueForTest(); 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddDelay(); 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (doomed_end) 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *doomed_end = base::Time::Now(); 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Order in rankings list: 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // third_part1, fourth_part1, third_part2, fourth_part2 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry3 = NULL; 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry4 = NULL; 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize)); 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize)); 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize)); 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(kSize, 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize)); 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry3->Close(); 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry4->Close(); 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FlushQueueForTest(); 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddDelay(); 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) { 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetMemoryOnlyMode(); 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time start; 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(&start, NULL); 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesSince(start); 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) { 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time start; 1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(&start, NULL); 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesSince(start); 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NOTE: BackendImpl counts child entries in its GetEntryCount(), while 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // MemBackendImpl does not. Thats why expected value differs here from 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // MemoryOnlyDoomEntriesSinceSparse. 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) { 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetMemoryOnlyMode(); 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(NULL, NULL); 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAllSparse) { 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(NULL, NULL); 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomBetween() { 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry; 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry)); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle_start = Time::Now(); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry)); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time middle_end = Time::Now(); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDelay(); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time final = Time::Now(); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, middle_end)); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("fourth", &entry)); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final)); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, cache_->GetEntryCount()); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("first", &entry)); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomBetween) { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomBetween(); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) { 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetMemoryOnlyMode(); 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time start, end; 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(&start, &end); 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesBetween(start, end); 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start = end; 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) end = base::Time::Now(); 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesBetween(start, end); 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomEntriesBetweenSparse) { 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time start, end; 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitSparseCache(&start, &end); 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesBetween(start, end); 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(9, cache_->GetEntryCount()); 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start = end; 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) end = base::Time::Now(); 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DoomEntriesBetween(start, end); 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTransaction(const std::string& name, 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_entries, bool load) { 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = false; 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache(name)); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 mask; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load) { 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = 0xf; 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x100000); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the settings from the previous run. 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = 0; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(mask); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(num_entries + 1, cache_->GetEntryCount()); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry1; 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry(key, &entry1)); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual = cache_->GetEntryCount(); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_entries != actual) { 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(load); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a heavy load, inserting an entry will make another entry 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dirty (on the hash bucket) so two entries are removed. 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(num_entries - 1, actual); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_ = NULL; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask)); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = true; 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverInsert() { 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with an empty cache. 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty1", 0, false); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty1"; 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty2", 0, false); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty2"; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_empty3", 0, false); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_empty3"; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with one entry on the cache. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one1", 1, false); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one1"; 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one2", 1, false); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one2"; 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_one3", 1, false); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_one3"; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests with one hundred entries on the cache, tiny index. 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_load1", 100, true); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_load1"; 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("insert_load2", 100, true); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "insert_load2"; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverInsert) { 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverInsert(); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) { 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverInsert(); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverRemove() { 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the only element. 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one1", 0, false); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one1"; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one2", 0, false); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one2"; 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one3", 0, false); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one3"; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the head. 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head1", 1, false); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head1"; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head2", 1, false); 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head2"; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head3", 1, false); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head3"; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the tail. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail1", 1, false); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail1"; 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail2", 1, false); 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail2"; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_tail3", 1, false); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_tail3"; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing with one hundred entries on the cache, tiny index. 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load1", 100, true); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load1"; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load2", 100, true); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load2"; 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_load3", 100, true); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_load3"; 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This case cannot be reverted. 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_one4", 0, false); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_one4"; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTransaction("remove_head4", 1, false); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success_) << "remove_head4"; 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverRemove) { 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverRemove(); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverRemove) { 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverRemove(); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverWithEviction() { 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = false; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("insert_load1")); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0xf); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x1000); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not crash here. 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverWithEviction) { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverWithEviction(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) { 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendRecoverWithEviction(); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |BackendImpl| fails to start with the wrong cache version. 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheTest, WrongVersion) { 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("wrong_version")); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 172390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl( 1727a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_path_, cache_thread.message_loop_proxy().get(), NULL)); 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = cache->Init(cb.callback()); 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::ERR_FAILED, cb.GetResult(rv)); 1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass BadEntropyProvider : public base::FieldTrial::EntropyProvider { 1733ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 1734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~BadEntropyProvider() {} 1735ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1736ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual double GetEntropyForTrial(const std::string& trial_name, 1737ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint32 randomization_seed) const OVERRIDE { 1738ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return 0.5; 1739ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1740ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 1741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1742ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache successfully joins the control group, dropping the 1743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// existing cache in favour of a new empty cache. 1744ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlJoin) { 1745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread cache_thread("CacheThread"); 1746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 1747ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 1748ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache = 1750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateExistingEntryCache(cache_thread, cache_path_); 1751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 1752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(); 1753ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1754ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Instantiate the SimpleCacheTrial, forcing this run into the 1755ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // ExperimentControl group. 1756ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList field_trial_list(new BadEntropyProvider()); 1757ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", 1758ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "ExperimentControl"); 1759ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch net::TestCompletionCallback cb; 1760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend> base_cache; 1761ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int rv = 1762ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch disk_cache::CreateCacheBackend(net::DISK_CACHE, 1763ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch net::CACHE_BACKEND_BLOCKFILE, 1764ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cache_path_, 1765ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 0, 1766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch true, 1767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cache_thread.message_loop_proxy().get(), 1768ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NULL, 1769ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch &base_cache, 1770ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cb.callback()); 1771ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1772ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, base_cache->GetEntryCount()); 1773ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1774ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1775ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache can restart in the control group preserving 1776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// existing entries. 1777ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlRestart) { 1778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Instantiate the SimpleCacheTrial, forcing this run into the 1779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // ExperimentControl group. 1780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList field_trial_list(new BadEntropyProvider()); 1781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", 1782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "ExperimentControl"); 1783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread cache_thread("CacheThread"); 1785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 1786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 1787ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache = 1789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateExistingEntryCache(cache_thread, cache_path_); 1790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 1791ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch net::TestCompletionCallback cb; 1793ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1794ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const int kRestartCount = 5; 1795ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (int i=0; i < kRestartCount; ++i) { 1796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache.reset(new disk_cache::BackendImpl( 1797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_path_, cache_thread.message_loop_proxy(), NULL)); 1798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int rv = cache->Init(cb.callback()); 1799ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1800ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1, cache->GetEntryCount()); 1801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch disk_cache::Entry* entry = NULL; 1803ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch rv = cache->OpenEntry(kExistingEntryKey, &entry, cb.callback()); 1804ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(net::OK, cb.GetResult(rv)); 1805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(entry); 1806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch entry->Close(); 1807ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1808ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1809ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache can leave the control group preserving existing 1811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// entries. 1812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlLeave) { 1813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread cache_thread("CacheThread"); 1814ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(cache_thread.StartWithOptions( 1815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 1816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { 1818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Instantiate the SimpleCacheTrial, forcing this run into the 1819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // ExperimentControl group. 1820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList field_trial_list(new BadEntropyProvider()); 1821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", 1822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "ExperimentControl"); 1823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache = 1825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateExistingEntryCache(cache_thread, cache_path_); 1826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache.get()); 1827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Instantiate the SimpleCacheTrial, forcing this run into the 1830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // ExperimentNo group. 1831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList field_trial_list(new BadEntropyProvider()); 1832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", "ExperimentNo"); 1833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch net::TestCompletionCallback cb; 1834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const int kRestartCount = 5; 1836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (int i = 0; i < kRestartCount; ++i) { 1837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl( 1838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_path_, cache_thread.message_loop_proxy(), NULL)); 1839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int rv = cache->Init(cb.callback()); 1840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(net::OK, cb.GetResult(rv)); 1841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(1, cache->GetEntryCount()); 1842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch disk_cache::Entry* entry = NULL; 1844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch rv = cache->OpenEntry(kExistingEntryKey, &entry, cb.callback()); 1845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(net::OK, cb.GetResult(rv)); 1846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(entry); 1847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch entry->Close(); 1848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the cache is properly restarted on recovery error. 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DeleteOld) { 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(CopyTestCache("wrong_version")); 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetNewEviction(); 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Thread cache_thread("CacheThread"); 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 185790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback cb; 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool prev = base::ThreadRestrictions::SetIOAllowed(false); 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath path(cache_path_); 18627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int rv = 18637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) disk_cache::CreateCacheBackend(net::DISK_CACHE, 18647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_BLOCKFILE, 18657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) path, 18667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 18677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) true, 18687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 18697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL, 18707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &cache_, 18717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cb.callback()); 1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path.clear(); // Make sure path was captured by the previous call. 1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(prev); 1875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask_)); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk. 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry2() { 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_entry")); 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("some other key", &entry2)); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckCacheIntegrity will fail at this point. 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry2) { 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry2(); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) { 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry2(); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't crash or hang when enumerating this cache. 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry3() { 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry3) { 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry3")); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry3(); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) { 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry4")); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry3(); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the LRU list, already replaced with 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions. 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry4) { 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry3")); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the deleted list, already replaced with 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions. 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry5) { 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry4")); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimDeletedListForTest(false); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry6) { 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("dirty_entry5")); 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is a dirty entry (but marked as clean) at the end, pointing to a 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted entry through the hash collision list. We should not re-insert the 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted entry into the index table. 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache should be clean (as detected by CheckCacheIntegrity). 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list. 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135. 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry1) { 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop2")); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second entry points at itselft, and the first entry is not accessible 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // though the index, but it is at the head of the LRU. 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("The first key", &entry)); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("The first key", &entry)); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list. 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135. 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry2) { 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop3")); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMask(0x1); // 2-entry table. 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(0x3000); // 12 kB. 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is a wide loop of 5 entries. 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry("Not present key", &entry)); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings3")); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second entry is dirty, but removing it should not corrupt the list. 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(net::OK, OpenEntry("the second key", &entry)); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should not delete the cache. 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Doom(); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry)); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a fatal failure. 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry7() { 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Data()->next = 0; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Store(); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect the bad entry. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should delete the cache. The list still has a corrupt node. 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry7) { 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry7(); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry7) { 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry7(); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a non fatal failure. 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry8() { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Data()->contents = 0; 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->rankings()->Store(); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect the bad entry. 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not delete the cache. 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry8) { 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry8(); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry8) { 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry8(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. Note that these 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests (xx9 to xx11) are basically just going though slightly different 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// codepaths so they are tighlty coupled with the code, but that is better than 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not testing error handling code. 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry9(bool eviction) { 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry, just fail the iteration. 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now a full iteration will work, and return one entry. 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should detect what's left of the bad entry. 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry(second, &entry)); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry9) { 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(false); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry9) { 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(false); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry9) { 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(true); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry9) { 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry9(true); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry10(bool eviction) { 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry)); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have: 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 0: third -> second (bad). 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 1: first. 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: second -> first -> third. 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> second -> first. 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry. 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(first, entry->GetKey()); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry10) { 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry10(false); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry10) { 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry10(true); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry11(bool eviction) { 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(first, &entry)); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(second, &entry)); 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false)); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, cache_->GetEntryCount()); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have: 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 0: third. 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List 1: second (bad) -> first. 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eviction) { 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> first -> second. 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detection order: third -> second. 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should detect the problem through the list, but we should not delete 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entry, just fail the iteration. 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now a full iteration will work, and return two entries. 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry11) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry11(false); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry11) { 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidEntry11(true); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries in the middle of a long eviction run. 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry12() { 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 0x3000; // 12 kB 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(kSize * 10); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first("some key"); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second("something else"); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(first, &entry)); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(second, &entry)); 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Corrupt this entry. 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::EntryImpl* entry_impl = 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<disk_cache::EntryImpl*>(entry); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Data()->state = 0xbad; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_impl->entry()->Store(); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry)); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry)); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(true); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry12) { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry12(); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry12) { 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendTrimInvalidEntry12(); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk. 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings2() { 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("the first key", &entry1)); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("some other key", &entry2)); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckCacheIntegrity will fail at this point. 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIntegrityCheck(); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankings2) { 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings2(); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) { 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings2(); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt, we delete the cache. 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings() { 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry)); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry)); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Allow the restart to finish. 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) { 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsFailure) { 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) { 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendInvalidRankings(); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt and we have open entries, we disable the cache. 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable() { 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("Something new", &entry2)); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // This one actually allows that task to complete. 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess) { 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) { 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) { 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable(); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is another type of corruption on the LRU; disable the cache. 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable2() { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, cache_->GetEntryCount()); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (OpenNextEntry(&iter, &entry) == net::OK) { 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != entry); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(count, 9); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess2) { 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) { 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure2) { 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) { 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("list_loop")); 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTestMode(); // Fail cache reinitialization. 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable2(); 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we disable the cache, we should not crash. 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable3() { 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something new", &entry2)); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess3) { 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable3(); 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) { 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable3(); 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we disable the cache, already open entries should work as far as possible. 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable4() { 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2, *entry3, *entry4; 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char key2[2000]; 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char key3[20000]; 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(key2, sizeof(key2), true); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(key3, sizeof(key3), true); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key2[sizeof(key2) - 1] = '\0'; 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key3[sizeof(key3) - 1] = '\0'; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key2, &entry2)); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key3, &entry3)); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBufSize = 20000; 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buf->data(), 0, kBufSize); 2575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false)); 2576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false)); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This line should disable the cache but not delete it. 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(100, ReadData(entry2, 0, 0, buf.get(), 100)); 2585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false)); 2586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(100, WriteData(entry2, 1, 0, buf.get(), 100, false)); 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf.get(), kBufSize)); 2589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false)); 2590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf.get(), kBufSize, false)); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = entry2->GetKey(); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(key2) - 1, key.size()); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = entry3->GetKey(); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(key3) - 1, key.size()); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // Flushing the Close posts a task to restart the cache. 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlushQueueForTest(); // This one actually allows that task to complete. 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess4) { 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable4(); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) { 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings")); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDisable4(); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2621558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DiskCacheTest, Backend_UsageStatsTimer) { 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoopHelper helper; 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CleanupCacheDir()); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<disk_cache::BackendImpl> cache; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.reset(new disk_cache::BackendImpl( 26277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_path_, base::MessageLoopProxy::current().get(), NULL)); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NULL != cache.get()); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache->SetUnitTestMode(); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cache->SyncInit()); 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for a callback that never comes... about 2 secs :). The message loop 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has to run to allow invocation of the usage timer. 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper.WaitUntilCacheIoFinished(1); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2637558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DiskCacheBackendTest, Backend_UsageStats) { 2638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InitCache(); 2639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch disk_cache::Entry* entry; 2640558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 2641558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch entry->Close(); 2642558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FlushQueueForTest(); 2643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch disk_cache::StatsItems stats; 2645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch cache_->GetStats(&stats); 2646558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(stats.empty()); 2647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2648558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch disk_cache::StatsItems::value_type hits("Create hit", "0x1"); 2649558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits)); 2650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 2652558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now open the cache and verify that the stats are still there. 2654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DisableFirstCleanup(); 2655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InitCache(); 2656558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(1, cache_->GetEntryCount()); 2657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch stats.clear(); 2659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch cache_->GetStats(&stats); 2660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(stats.empty()); 2661558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2662558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits)); 2663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll() { 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry1, *entry2; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("first", &entry1)); 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("second", &entry2)); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4, cache_->GetEntryCount()); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should stop posting tasks at some point (if we post any). 268290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry *entry3, *entry4; 2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("third", &entry3)); 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry3)); 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4)); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Doom(); // The entry should be already doomed, but this must work. 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry3->Close(); 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry4->Close(); 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try with all references released. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("third", &entry1)); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2)); 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry1->Close(); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry2->Close(); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, cache_->GetEntryCount()); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, cache_->GetEntryCount()); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll) { 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) { 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryOnlyMode(); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) { 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCacheType(net::APP_CACHE); 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll(); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheOnlyDoomAll) { 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BackendDoomAll(); 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we doom the cache, we should not crash. 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll2() { 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, cache_->GetEntryCount()); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, DoomAllEntries()); 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("Something new", &entry)); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll2) { 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll2(); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) { 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(CopyTestCache("bad_rankings2")); 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableFirstCleanup(); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMaxSize(20 * 1024 * 1024); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNewEviction(); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDoomAll2(); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to create the same entry on multiple simultaneous instances 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the cache. 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, MultipleInstances) { 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir store1, store2; 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(store1.CreateUniqueTempDir()); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(store2.CreateUniqueTempDir()); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread cache_thread("CacheThread"); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 277390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumberOfCaches = 2; 2777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend> cache[kNumberOfCaches]; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int rv = 27807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) disk_cache::CreateCacheBackend(net::DISK_CACHE, 27817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_DEFAULT, 27827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) store1.path(), 27837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 27847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 27857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 27867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL, 27877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &cache[0], 27887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cb.callback()); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 27907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rv = disk_cache::CreateCacheBackend(net::MEDIA_CACHE, 27917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::CACHE_BACKEND_DEFAULT, 27927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) store2.path(), 27937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 27947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 27957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 27967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL, 27977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &cache[1], 27987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cb.callback()); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(cache[0].get() != NULL && cache[1].get() != NULL); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumberOfCaches; i++) { 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache[i]->CreateEntry(key, &entry, cb.callback()); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the six regions of the curve that determines the max cache size. 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, AutomaticMaxSize) { 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kDefaultSize = 80 * 1024 * 1024; 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 large_size = kDefaultSize; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 largest_size = kint32max; 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 1: expected = available * 0.8 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ((kDefaultSize - 1) * 8 / 10, 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size - 1)); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 8 / 10, 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size)); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize - 1, 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 / 8 - 1)); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 2: expected = default_size 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 / 8)); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10 - 1)); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 3: expected = available * 0.1 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize, 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 10)); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ((kDefaultSize * 25 - 1) / 10, 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 25 - 1)); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 4: expected = default_size * 2.5 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 25)); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 100 - 1)); 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 100)); 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 250 - 1)); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 5: expected = available * 0.1 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultSize * 25 / 10, 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(large_size * 250)); 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max - 1, 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 100 - 1)); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Region 6: expected = kint32max 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max, 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 100)); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kint32max, 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::PreferedCacheSize(largest_size * 10000)); 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can "migrate" a running instance from one experiment group to 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another. 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Histograms) { 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::BackendImpl* backend_ = cache_impl_; // Needed be the macro. 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 3; i++) { 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CACHE_UMA(HOURS, "FillupTime", i, 28); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that we keep the total memory used by the internal buffers under 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control. 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize1) { 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key("the first key"); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 200; 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, true); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; i++) { 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocate 2MB for this entry. 2887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, true)); 2888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, true)); 2889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, 2890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 0, 1024 * 1024, buffer.get(), kSize, false)); 2891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kSize, 2892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WriteData(entry, 1, 1024 * 1024, buffer.get(), kSize, false)); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete one of the buffers and truncate the other. 2895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true)); 2896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, WriteData(entry, 1, 10, buffer.get(), 0, true)); 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the second buffer, writing 10 bytes to disk. 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize()); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test assumes at least 150MB of system memory. 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize2) { 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kOneMB = 1024 * 1024; 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize()); 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB)); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize()); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_->BufferDeleted(kOneMB); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize()); 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the upper limit. 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB)); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 30; i++) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_impl_->IsAllocAllowed(0, kOneMB); // Ignore the result. 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB)); 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that sharing of external files works and we are able to delete the 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// files when we need to. 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FileSharing) { 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Addr address(0x80000001); 29397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(cache_impl_->CreateExternalFile(&address)); 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath name = cache_impl_->GetFileName(address); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<disk_cache::File> file(new disk_cache::File(false)); 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file->Init(name); 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD access = GENERIC_READ | GENERIC_WRITE; 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle file2(CreateFile( 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL)); 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(file2.IsValid()); 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sharing |= FILE_SHARE_DELETE; 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file2.Set(CreateFile(name.value().c_str(), access, sharing, NULL, 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OPEN_EXISTING, 0, NULL)); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file2.IsValid()); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(name, false)); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should be able to use the file. 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSize = 200; 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer1[kSize]; 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buffer2[kSize]; 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer1, 't', kSize); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer2, 0, kSize); 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file->Write(buffer1, kSize, 0)); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file->Read(buffer2, kSize, 0)); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize)); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(disk_cache::DeleteCacheFile(name)); 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) { 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCache(); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string key = base::StringPrintf("key%d", i); 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->Close(); 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ping the oldest entry. 29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->OnExternalCacheHit("key0"); 29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimForTest(false); 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the older key remains. 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->Close(); 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) { 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCacheType(net::SHADER_CACHE); 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCache(); 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disk_cache::Entry* entry; 30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < 2; ++i) { 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string key = base::StringPrintf("key%d", i); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ping the oldest entry. 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->OnExternalCacheHit("key0"); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimForTest(false); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the older key remains. 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("key0", &entry)); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DiskCacheBackendTest::TracingBackendBasics() { 3019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 3020a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(new disk_cache::TracingCacheBackend(cache_.Pass())); 3021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cache_impl_ = NULL; 3022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType()); 3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!simple_cache_mode_) { 3024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, cache_->GetEntryCount()); 3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback cb; 3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry = NULL; 3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::OK, OpenEntry("key", &entry)); 3030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(NULL == entry); 3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(NULL != entry); 3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* same_entry = NULL; 3036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry("key", &same_entry)); 3037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(NULL != same_entry); 3038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!simple_cache_mode_) { 3040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, cache_->GetEntryCount()); 3041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = NULL; 3044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) same_entry->Close(); 3045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) same_entry = NULL; 3046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, TracingBackendBasics) { 3049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TracingBackendBasics(); 3050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The simple cache backend isn't intended to work on windows, which has very 3053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// different file system guarantees from Windows. 3054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_WIN) 3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheBasics) { 3057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendBasics(); 3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3061bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheAppCacheBasics) { 3062bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetCacheType(net::APP_CACHE); 3063bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetSimpleCacheMode(); 3064bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BackendBasics(); 3065bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 3066bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheKeying) { 3068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendKeying(); 3070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3072bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheAppCacheKeying) { 3073bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetSimpleCacheMode(); 3074bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetCacheType(net::APP_CACHE); 3075bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BackendKeying(); 3076bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 3077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DISABLED_SimpleCacheSetSize) { 3079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendSetSize(); 3081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MacOS has a default open file limit of 256 files, which is incompatible with 3084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// this simple cache test. 3085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 3086bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define SIMPLE_MAYBE_MACOS(TestName) DISABLED_ ## TestName 3087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 3088bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define SIMPLE_MAYBE_MACOS(TestName) TestName 3089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 3090bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3091bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SIMPLE_MAYBE_MACOS(SimpleCacheLoad)) { 3092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetMaxSize(0x100000); 3093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendLoad(); 3095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3097bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SIMPLE_MAYBE_MACOS(SimpleCacheAppCacheLoad)) { 3098bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetCacheType(net::APP_CACHE); 3099bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetSimpleCacheMode(); 3100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetMaxSize(0x100000); 3101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BackendLoad(); 3102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 3103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleDoomRecent) { 3105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendDoomRecent(); 3107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleDoomBetween) { 3110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendDoomBetween(); 3112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See http://crbug.com/237450. 3115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, FLAKY_SimpleCacheDoomAll) { 3116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BackendDoomAll(); 3118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 3119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, FLAKY_SimpleCacheAppCacheOnlyDoomAll) { 3121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetCacheType(net::APP_CACHE); 3122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetSimpleCacheMode(); 3123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BackendDoomAll(); 3124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheTracingBackendBasics) { 3127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TracingBackendBasics(); 3129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(pasko): implement integrity checking on the Simple Backend. 3130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableIntegrityCheck(); 3131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOpenMissingFile) { 3134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 3136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* key = "the first key"; 3138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry = NULL; 3139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry != NULL); 3142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = NULL; 3144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // To make sure the file creation completed we need to call open again so that 3146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we block until it actually created the files. 3147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry != NULL); 3149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = NULL; 3151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Delete one of the files in the entry. 3153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath to_delete_file = cache_path_.AppendASCII( 3154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::simple_util::GetFilenameFromKeyAndIndex(key, 0)); 31557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(to_delete_file)); 3156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(disk_cache::DeleteCacheFile(to_delete_file)); 3157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Failing to open the entry should delete the rest of these files. 3159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::ERR_FAILED, OpenEntry(key, &entry)); 3160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Confirm the rest of the files are gone. 3162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 1; i < disk_cache::kSimpleEntryFileCount; ++i) { 3163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath 3164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) should_be_gone_file(cache_path_.AppendASCII( 3165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::simple_util::GetFilenameFromKeyAndIndex(key, i))); 31667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(should_be_gone_file)); 3167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOpenBadFile) { 3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 3173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* key = "the first key"; 3175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry = NULL; 3176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 3178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* null = NULL; 3179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(null, entry); 3180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = NULL; 3182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // To make sure the file creation completed we need to call open again so that 3184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we block until it actually created the files. 3185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, OpenEntry(key, &entry)); 3186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(null, entry); 3187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry = NULL; 3189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Write an invalid header on stream 1. 3191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath entry_file1_path = cache_path_.AppendASCII( 3192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::simple_util::GetFilenameFromKeyAndIndex(key, 1)); 3193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::SimpleFileHeader header; 3195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header.initial_magic_number = GG_UINT64_C(0xbadf00d); 3196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 3197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) implicit_cast<int>(sizeof(header)), 3198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::WriteFile(entry_file1_path, reinterpret_cast<char*>(&header), 3199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sizeof(header))); 3200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::ERR_FAILED, OpenEntry(key, &entry)); 3201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the Simple Cache Backend fails to initialize with non-matching 3204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// file structure on disk. 3205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) { 3206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a cache structure with the |BackendImpl|. 3207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 3208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry; 3209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kSize = 50; 3210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 3211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, false); 3212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 3213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false)); 3214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 3216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that the |SimpleBackendImpl| does not favor this structure. 3218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Thread cache_thread("CacheThread"); 3219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 322090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 3221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::SimpleBackendImpl* simple_cache = 32227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new disk_cache::SimpleBackendImpl(cache_path_, 32237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 32247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::DISK_CACHE, 32257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_thread.message_loop_proxy().get(), 3226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL); 3227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback cb; 3228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = simple_cache->Init(cb.callback()); 3229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::OK, cb.GetResult(rv)); 3230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete simple_cache; 3231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableIntegrityCheck(); 3232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |BackendImpl| refuses to initialize on top of the files 3235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// generated by the Simple Cache Backend. 3236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) { 3237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a cache structure with the |SimpleBackendImpl|. 3238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetSimpleCacheMode(); 3239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitCache(); 3240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disk_cache::Entry* entry; 3241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int kSize = 50; 3242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 3243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CacheTestFillBuffer(buffer->data(), kSize, false); 3244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, CreateEntry("key", &entry)); 3245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false)); 3246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->Close(); 3247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cache_.reset(); 3248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that the |BackendImpl| does not favor this structure. 3250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Thread cache_thread("CacheThread"); 3251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(cache_thread.StartWithOptions( 325290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); 325390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) disk_cache::BackendImpl* cache = new disk_cache::BackendImpl( 32547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cache_path_, base::MessageLoopProxy::current().get(), NULL); 3255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cache->SetUnitTestMode(); 3256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback cb; 3257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = cache->Init(cb.callback()); 3258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::OK, cb.GetResult(rv)); 3259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete cache; 3260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableIntegrityCheck(); 3261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DiskCacheBackendTest, SimpleCacheFixEnumerators) { 3264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetSimpleCacheMode(); 3265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BackendFixEnumerators(); 3266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Creates entries based on random keys. Stores these keys in |key_pool|. 32697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DiskCacheBackendTest::CreateSetOfRandomEntries( 32707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string>* key_pool) { 32717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const int kNumEntries = 10; 32727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < kNumEntries; ++i) { 32747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string key = GenerateKey(true); 32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disk_cache::Entry* entry; 32767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CreateEntry(key, &entry) != net::OK) 32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch key_pool->insert(key); 32797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch entry->Close(); 32807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return key_pool->size() == implicit_cast<size_t>(cache_->GetEntryCount()); 32827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 32837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Performs iteration over the backend and checks that the keys of entries 32857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// opened are in |keys_to_match|, then erases them. Up to |max_to_open| entries 32867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// will be opened, if it is positive. Otherwise, iteration will continue until 32877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// OpenNextEntry stops returning net::OK. 32887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DiskCacheBackendTest::EnumerateAndMatchKeys( 32897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int max_to_open, 32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void** iter, 32917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string>* keys_to_match, 32927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t* count) { 32937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disk_cache::Entry* entry; 32947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch while (OpenNextEntry(iter, &entry) == net::OK) { 32967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!entry) 32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 32987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1U, keys_to_match->erase(entry->GetKey())); 32997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch entry->Close(); 33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++(*count); 33017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (max_to_open >= 0 && implicit_cast<int>(*count) >= max_to_open) 33027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 33037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 33047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 33067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 33077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests basic functionality of the SimpleBackend implementation of the 33097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// enumeration API. 33107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationBasics) { 33117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetSimpleCacheMode(); 33127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitCache(); 33137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> key_pool; 33147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool)); 33157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check that enumeration returns all entries. 33177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> keys_to_match(key_pool); 33187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void* iter = NULL; 33197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t count = 0; 33207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count)); 33217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cache_->EndEnumeration(&iter); 33227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(key_pool.size(), count); 33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(keys_to_match.empty()); 33247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check that opening entries does not affect enumeration. 33267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch keys_to_match = key_pool; 33277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iter = NULL; 33287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch count = 0; 33297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disk_cache::Entry* entry_opened_before; 33307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(net::OK, OpenEntry(*(key_pool.begin()), &entry_opened_before)); 33317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size()/2, 33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &iter, 33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &keys_to_match, 33347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &count)); 33357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disk_cache::Entry* entry_opened_middle; 33377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(net::OK, 33387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OpenEntry(*(keys_to_match.begin()), &entry_opened_middle)); 33397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count)); 33407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cache_->EndEnumeration(&iter); 33417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch entry_opened_before->Close(); 33427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch entry_opened_middle->Close(); 33437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(key_pool.size(), count); 33457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(keys_to_match.empty()); 33467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 33477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests that the enumerations are not affected by dooming an entry in the 33497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// middle. 33507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationWhileDoomed) { 33517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetSimpleCacheMode(); 33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitCache(); 33537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> key_pool; 33547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool)); 33557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check that enumeration returns all entries but the doomed one. 33577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> keys_to_match(key_pool); 33587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void* iter = NULL; 33597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t count = 0; 33607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size()/2, 33617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &iter, 33627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &keys_to_match, 33637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &count)); 33647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string key_to_delete = *(keys_to_match.begin()); 33667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DoomEntry(key_to_delete); 33677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch keys_to_match.erase(key_to_delete); 33687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch key_pool.erase(key_to_delete); 33697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count)); 33707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cache_->EndEnumeration(&iter); 33717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(key_pool.size(), count); 33737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(keys_to_match.empty()); 33747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 33757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests that enumerations are not affected by corrupt files. 33777dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationCorruption) { 33787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetSimpleCacheMode(); 33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitCache(); 33807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> key_pool; 33817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool)); 33827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create a corrupt entry. The write/read sequence ensures that the entry will 33847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // have been created before corrupting the platform files, in the case of 33857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // optimistic operations. 33867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string key = "the key"; 33877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disk_cache::Entry* corrupted_entry; 33887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(net::OK, CreateEntry(key, &corrupted_entry)); 33907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(corrupted_entry); 33917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const int kSize = 50; 33927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); 33937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CacheTestFillBuffer(buffer->data(), kSize, false); 33947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(kSize, 33957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WriteData(corrupted_entry, 0, 0, buffer.get(), kSize, false)); 33967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(kSize, ReadData(corrupted_entry, 0, 0, buffer.get(), kSize)); 33977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch corrupted_entry->Close(); 33987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 33997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(disk_cache::simple_util::CreateCorruptFileForTests( 34007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch key, cache_path_)); 34017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(key_pool.size() + 1, 34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch implicit_cast<size_t>(cache_->GetEntryCount())); 34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check that enumeration returns all entries but the corrupt one. 34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<std::string> keys_to_match(key_pool); 34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void* iter = NULL; 34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t count = 0; 34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count)); 34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cache_->EndEnumeration(&iter); 34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(key_pool.size(), count); 34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(keys_to_match.empty()); 34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // !defined(OS_WIN) 3416