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