13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/platform_thread.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/test_completion_callback.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/backend_impl.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/disk_cache/cache_util.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_base.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_util.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/histogram_macros.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/mem_backend_impl.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#if defined(OS_WIN)
243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/win/scoped_handle.h"
253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time;
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that can run with different types of caches.
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass DiskCacheBackendTest : public DiskCacheTestWithCache {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendBasics();
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendKeying();
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendSetSize();
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendLoad();
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendValidEntry();
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidEntry();
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidEntryRead();
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidEntryWithLoad();
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendTrimInvalidEntry();
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendTrimInvalidEntry2();
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendEnumerations();
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendEnumerations2();
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidEntryEnumeration();
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendFixEnumerators();
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDoomRecent();
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDoomBetween();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BackendTransaction(const std::string& name, int num_entries, bool load);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendRecoverInsert();
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendRecoverRemove();
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void BackendRecoverWithEviction();
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidEntry2();
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void BackendInvalidEntry3();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BackendNotMarkedButDirty(const std::string& name);
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDoomAll();
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDoomAll2();
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidRankings();
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendInvalidRankings2();
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDisable();
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDisable2();
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDisable3();
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void BackendDisable4();
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendBasics() {
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1 = NULL, *entry2 = NULL;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry1);
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = NULL;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry1);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = NULL;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, CreateEntry("the first key", &entry1));
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2));
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry1);
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry2);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry3 = NULL;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3));
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry3);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(entry2 == entry3);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntry("some other key"));
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, cache_->GetEntryCount());
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry3->Close();
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntry("the first key"));
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1));
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2));
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Doom();
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntry("some other key"));
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Basics) {
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendBasics();
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionBasics) {
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendBasics();
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyBasics) {
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendBasics();
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheBasics) {
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendBasics();
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendKeying() {
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* kName1 = "the first key";
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* kName2 = "the first Key";
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1));
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2));
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(entry1 != entry2) << "Case sensitive";
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char buffer[30];
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::strlcpy(buffer, kName1, arraysize(buffer));
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(buffer, &entry2));
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(entry1 == entry2);
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::strlcpy(buffer + 1, kName1, arraysize(buffer) - 1);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(buffer + 1, &entry2));
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(entry1 == entry2);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::strlcpy(buffer + 3,  kName1, arraysize(buffer) - 3);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(buffer + 3, &entry2));
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(entry1 == entry2);
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now verify long keys.
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char buffer2[20000];
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer2, 's', sizeof(buffer2));
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  buffer2[1023] = '\0';
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file";
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  buffer2[1023] = 'g';
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  buffer2[19999] = '\0';
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file";
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Keying) {
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendKeying();
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionKeying) {
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendKeying();
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyKeying) {
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendKeying();
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheKeying) {
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendKeying();
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, CreateBackend) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath path = GetCacheFilePath();
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(DeleteCache(path));
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Thread cache_thread("CacheThread");
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache_thread.StartWithOptions(
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    base::Thread::Options(MessageLoop::TYPE_IO, 0)));
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Test the private factory methods.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    disk_cache::Backend* cache = NULL;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int rv = disk_cache::BackendImpl::CreateBackend(
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom,
2043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 cache_thread.message_loop_proxy(), NULL, &cache, &cb);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete cache;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete cache;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cache = NULL;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Now test the public API.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = disk_cache::CreateCacheBackend(net::DISK_CACHE, path, 0, false,
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        cache_thread.message_loop_proxy(),
2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                        NULL, &cache, &cb);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete cache;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cache = NULL;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE, FilePath(), 0, false,
2243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                        NULL, NULL, &cache, &cb);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete cache;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, ExternalFiles) {
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
2353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // First, let's create a file on the folder.
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath filename = GetCacheFilePath().AppendASCII("f_000001");
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 50;
239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CacheTestFillBuffer(buffer1->data(), kSize, false);
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize));
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now let's create a file with the cache.
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1, 0, false));
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // And verify that the first file is still there.
250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize));
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize));
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we deal with file-level pending operations at destruction time.
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, ShutdownWithPendingIO) {
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    FilePath path = GetCacheFilePath();
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(DeleteCache(path));
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Thread cache_thread("CacheThread");
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache_thread.StartWithOptions(
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    base::Thread::Options(MessageLoop::TYPE_IO, 0)));
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    disk_cache::Backend* cache;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int rv = disk_cache::BackendImpl::CreateBackend(
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom,
2693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 base::MessageLoopProxy::CreateForCurrentThread(), NULL,
2703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 &cache, &cb);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    disk_cache::EntryImpl* entry;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = cache->CreateEntry("some key",
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            reinterpret_cast<disk_cache::Entry**>(&entry), &cb);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int kSize = 25000;
279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    CacheTestFillBuffer(buffer->data(), kSize, false);
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) {
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // We are using the current thread as the cache thread because we want to
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // be able to call directly this method to make sure that the OS (instead
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // of us switching thread) is returning IO pending.
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rv = entry->WriteDataImpl(0, i, buffer, kSize, &cb, false);
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (rv == net::ERR_IO_PENDING)
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(kSize, rv);
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Don't call Close() to avoid going through the queue or we'll deadlock
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // waiting for the operation to finish.
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    entry->Release();
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // The cache destructor will see one pending operation here.
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete cache;
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (rv == net::ERR_IO_PENDING) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_TRUE(cb.have_result());
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we deal with background-thread pending operations.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, ShutdownWithPendingIO2) {
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath path = GetCacheFilePath();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(DeleteCache(path));
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Thread cache_thread("CacheThread");
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(cache_thread.StartWithOptions(
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    base::Thread::Options(MessageLoop::TYPE_IO, 0)));
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    disk_cache::Backend* cache;
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int rv = disk_cache::BackendImpl::CreateBackend(
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 path, false, 0, net::DISK_CACHE, disk_cache::kNoRandom,
3213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                 cache_thread.message_loop_proxy(), NULL, &cache, &cb);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    disk_cache::Entry* entry;
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = cache->CreateEntry("some key", &entry, &cb);
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const int kSize = 25000;
329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CacheTestFillBuffer(buffer->data(), kSize, false);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = entry->WriteData(0, 0, buffer, kSize, &cb, false);
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(net::ERR_IO_PENDING, rv);
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    entry->Close();
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The cache destructor will see two pending operations here.
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete cache;
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoop::current()->RunAllPending();
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, TruncatedIndex) {
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath path = GetCacheFilePath();
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(DeleteCache(path));
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath index = path.AppendASCII("index");
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(5, file_util::WriteFile(index, "hello", 5));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread cache_thread("CacheThread");
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  base::Thread::Options(MessageLoop::TYPE_IO, 0)));
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Backend* backend = NULL;
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = disk_cache::BackendImpl::CreateBackend(
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               path, false, 0, net::DISK_CACHE, disk_cache::kNone,
3583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen               cache_thread.message_loop_proxy(), NULL, &backend, &cb);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(net::OK, cb.GetResult(rv));
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(backend == NULL);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete backend;
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendSetSize() {
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int cache_size = 0x10000;  // 64 kB
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(cache_size);
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string first("some key");
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string second("something else");
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size));
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer->data(), 0, cache_size);
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10,
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       false)) << "normal file";
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(net::ERR_FAILED, WriteData(entry, 1, 0, buffer, cache_size / 5,
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       false)) << "file size above the limit";
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // By doubling the total size, we make this file cacheable.
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(cache_size * 2);
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(cache_size / 5, WriteData(entry, 1, 0, buffer, cache_size / 5,
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                      false));
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Let's fill up the cache!.
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(cache_size * 10);
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(cache_size * 3 / 4, WriteData(entry, 0, 0, buffer,
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                          cache_size * 3 / 4, false));
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(cache_size);
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The cache is 95% full.
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(cache_size / 10, WriteData(entry, 0, 0, buffer, cache_size / 10,
4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       false));
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Entry* entry2;
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2));
4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(cache_size / 10, WriteData(entry2, 0, 0, buffer, cache_size / 10,
4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       false));
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry2->Close();  // This will trigger the cache trim.
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry(first, &entry2));
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // Make sure that we are done trimming the cache.
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // We may have posted two tasks to evict stuff.
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry->Close();
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(second, &entry));
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(cache_size / 10, entry->GetDataSize(0));
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, SetSize) {
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendSetSize();
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionSetSize) {
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendSetSize();
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlySetSize) {
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendSetSize();
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendLoad() {
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int seed = static_cast<int>(Time::Now().ToInternalValue());
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  srand(seed);
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entries[100];
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 100; i++) {
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string key = GenerateKey(true);
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(100, cache_->GetEntryCount());
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 100; i++) {
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int source1 = rand() % 100;
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int source2 = rand() % 100;
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* temp = entries[source1];
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[source1] = entries[source2];
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[source2] = temp;
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 100; i++) {
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* entry;
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, OpenEntry(entries[i]->GetKey(), &entry));
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(entry == entries[i]);
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[i]->Doom();
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[i]->Close();
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Load) {
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Work with a tiny index table (16 entries)
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMask(0xf);
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(0x100000);
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendLoad();
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionLoad) {
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Work with a tiny index table (16 entries)
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMask(0xf);
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(0x100000);
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendLoad();
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyLoad) {
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Work with a tiny index table (16 entries)
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(0x100000);
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendLoad();
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheLoad) {
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Work with a tiny index table (16 entries)
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetMask(0xf);
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetMaxSize(0x100000);
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendLoad();
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4970a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionTrim) {
4980a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  SetNewEviction();
4990a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  SetDirectMode();
5000a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  InitCache();
5010a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen
5020a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  disk_cache::Entry* entry;
5030a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  for (int i = 0; i < 100; i++) {
5040a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen    std::string name(StringPrintf("Key %d", i));
5050a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen    ASSERT_EQ(net::OK, CreateEntry(name, &entry));
5060a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen    entry->Close();
5070a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen    if (i < 90) {
5080a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen      // Entries 0 to 89 are in list 1; 90 to 99 are in list 0.
5090a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen      ASSERT_EQ(net::OK, OpenEntry(name, &entry));
5100a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen      entry->Close();
5110a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen    }
5120a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  }
5130a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen
5140a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // The first eviction must come from list 1 (10% limit), the second must come
5150a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // from list 0.
5160a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  TrimForTest(false);
5170a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  EXPECT_NE(net::OK, OpenEntry("Key 0", &entry));
5180a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  TrimForTest(false);
5190a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  EXPECT_NE(net::OK, OpenEntry("Key 90", &entry));
5200a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen
5210a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // Double check that we still have the list tails.
5220a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry));
5230a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  entry->Close();
5240a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry));
5250a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  entry->Close();
5260a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen}
5270a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Before looking for invalid entries, let's check a valid entry.
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendValidEntry() {
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("Some key");
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  disk_cache::Entry* entry;
5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 50;
538513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer1->data(), 0, kSize);
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::strlcpy(buffer1->data(), "And the data to save", kSize);
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1, kSize, false));
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry->Close();
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize));
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer2->data(), 0, kSize);
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2, kSize));
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry->Close();
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_STREQ(buffer1->data(), buffer2->data());
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, ValidEntry) {
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendValidEntry();
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionValidEntry) {
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendValidEntry();
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The same logic of the previous test (ValidEntry), but this time force the
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// entry to be invalid, simulating a crash in the middle.
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntry() {
567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly... we need to simulate a crash.
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("Some key");
5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  disk_cache::Entry* entry;
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 50;
576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  memset(buffer->data(), 0, kSize);
5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::strlcpy(buffer->data(), "And the data to save", kSize);
5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NE(net::OK, OpenEntry(key, &entry));
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This and the other intentionally leaky tests below are excluded from
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// purify and valgrind runs by naming them in the files
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   net/data/purify/net_unittests.exe.gtest.txt and
589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   net/data/valgrind/net_unittests.gtest.txt
590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The scripts tools/{purify,valgrind}/chrome_tests.sh
591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// read those files and pass the appropriate --gtest_filter to net_unittests.
592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntry) {
593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntry();
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) {
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntry();
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test.
6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) {
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendInvalidEntry();
6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Almost the same test, but this time crash the cache after reading an entry.
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryRead() {
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly... we need to simulate a crash.
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("Some key");
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  disk_cache::Entry* entry;
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 50;
620513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  memset(buffer->data(), 0, kSize);
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::strlcpy(buffer->data(), "And the data to save", kSize);
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry->Close();
6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize));
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (type_ == net::APP_CACHE) {
6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Reading an entry and crashing should not make it dirty.
6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1, cache_->GetEntryCount());
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    entry->Close();
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_NE(net::OK, OpenEntry(key, &entry));
6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(0, cache_->GetEntryCount());
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryRead) {
643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryRead();
644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) {
648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryRead();
650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) {
6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendInvalidEntryRead();
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test.
659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryWithLoad() {
660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Work with a tiny index table (16 entries)
661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMask(0xf);
662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(0x100000);
663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int seed = static_cast<int>(Time::Now().ToInternalValue());
666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  srand(seed);
667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kNumEntries = 100;
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entries[kNumEntries];
670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries; i++) {
671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string key = GenerateKey(true);
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries; i++) {
677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int source1 = rand() % kNumEntries;
678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int source2 = rand() % kNumEntries;
679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* temp = entries[source1];
680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[source1] = entries[source2];
681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries[source2] = temp;
682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string keys[kNumEntries];
685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries; i++) {
686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    keys[i] = entries[i]->GetKey();
687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (i < kNumEntries / 2)
688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      entries[i]->Close();
689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = kNumEntries / 2; i < kNumEntries; i++) {
694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* entry;
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_NE(net::OK, OpenEntry(keys[i], &entry));
696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries / 2; i++) {
699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* entry;
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(net::OK, OpenEntry(keys[i], &entry));
701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount());
705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) {
709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryWithLoad();
710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) {
714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryWithLoad();
716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) {
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendInvalidEntryWithLoad();
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// We'll be leaking memory from this test.
725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendTrimInvalidEntry() {
726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly... we need to simulate a crash.
727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 0x3000;  // 12 kB
730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(kSize * 10);
731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string first("some key");
734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string second("something else");
735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
738513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer->data(), 0, kSize);
7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Simulate a crash.
743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(kSize);
750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();  // Trim the cache.
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If we evicted the entry in less than 20mS, we have one entry in the cache;
754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // if it took more than that, we posted a task and we'll delete the second
755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // entry too.
756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoop::current()->RunAllPending();
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This may be not thread-safe in general, but for now it's OK so add some
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ThreadSanitizer annotations to ignore data races on cache_.
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // See http://crbug.com/55970
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ANNOTATE_IGNORE_READS_BEGIN();
762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_GE(1, cache_->GetEntryCount());
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ANNOTATE_IGNORE_READS_END();
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry(first, &entry));
766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, TrimInvalidEntry) {
770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendTrimInvalidEntry();
771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) {
775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendTrimInvalidEntry();
777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendTrimInvalidEntry2() {
781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly... we need to simulate a crash.
782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMask(0xf);  // 16-entry table.
784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 0x3000;  // 12 kB
786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(kSize * 40);
787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
789513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer->data(), 0, kSize);
791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Writing 32 entries to this cache chains most of them.
794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 32; i++) {
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string key(base::StringPrintf("some key %d", i));
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Note that we are not closing the entries.
801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Simulate a crash.
804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("Something else", &entry));
8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, false));
808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(33, cache_->GetEntryCount());
810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(kSize);
811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For the new eviction code, all corrupt entries are on the second list so
813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // they are not going away that easy.
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (new_eviction_) {
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(net::OK, DoomAllEntries());
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();  // Trim the cache.
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We may abort the eviction before cleaning up everything.
822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoop::current()->RunAllPending();
823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_GE(30, cache_->GetEntryCount());
824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, TrimInvalidEntry2) {
828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendTrimInvalidEntry2();
829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) {
833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendTrimInvalidEntry2();
835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendEnumerations() {
838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time initial = Time::Now();
840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int seed = static_cast<int>(initial.ToInternalValue());
841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  srand(seed);
842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kNumEntries = 100;
844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries; i++) {
845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string key = GenerateKey(true);
846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* entry;
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time final = Time::Now();
852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int count = 0;
856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time last_modified[kNumEntries];
857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time last_used[kNumEntries];
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (OpenNextEntry(&iter, &entry) == net::OK) {
859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry);
860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (count < kNumEntries) {
861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      last_modified[count] = entry->GetLastModified();
862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      last_used[count] = entry->GetLastUsed();
863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_TRUE(initial <= last_modified[count]);
864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_TRUE(final >= last_modified[count]);
865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    count++;
869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries, count);
871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  iter = NULL;
873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  count = 0;
874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The previous enumeration should not have changed the timestamps.
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (OpenNextEntry(&iter, &entry) == net::OK) {
876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry);
877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (count < kNumEntries) {
878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_TRUE(last_modified[count] == entry->GetLastModified());
879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_TRUE(last_used[count] == entry->GetLastUsed());
880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    count++;
883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries, count);
885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Enumerations) {
888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations();
889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionEnumerations) {
892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations();
894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) {
897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations();
899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flaky, http://crbug.com/74387.
902dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, FLAKY_AppCacheEnumerations) {
9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendEnumerations();
9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Verifies enumerations while entries are open.
908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendEnumerations2() {
909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const std::string first("first");
911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const std::string second("second");
912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(first, &entry1));
914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(second, &entry2));
916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Make sure that the timestamp is not the same.
9193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(second, &entry1));
921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(entry2->GetKey(), second);
924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Two entries and the iterator pointing at "first".
926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The iterator should still be valid, so we should not crash.
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
9313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(entry2->GetKey(), first);
9323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry2->Close();
9333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache_->EndEnumeration(&iter);
9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Modify the oldest entry and get the newest element.
9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, OpenEntry(first, &entry1));
9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false));
9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (type_ == net::APP_CACHE) {
9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // The list is not updated.
9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(entry2->GetKey(), second);
9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(entry2->GetKey(), first);
9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry1->Close();
947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_->EndEnumeration(&iter);
949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, Enumerations2) {
952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations2();
953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) {
956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations2();
958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) {
961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendEnumerations2();
963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheEnumerations2) {
9663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
9673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendEnumerations2();
9683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Verify handling of invalid entries while doing enumerations.
971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntryEnumeration() {
973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly... we need to simulate a crash.
974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("Some key");
978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry, *entry1, *entry2;
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(key, &entry1));
980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kSize = 50;
982513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buffer1->data(), 0, kSize);
984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::strlcpy(buffer1->data(), "And the data to save", kSize);
9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1, kSize, false));
986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry(key, &entry1));
9883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1, kSize));
989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key2("Another key");
991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(key2, &entry2));
992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(2, cache_->GetEntryCount());
994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SimulateCrash();
996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int count = 0;
999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (OpenNextEntry(&iter, &entry) == net::OK) {
1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry);
1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(key2, entry->GetKey());
1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    count++;
1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, count);
1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, cache_->GetEntryCount());
1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) {
1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryEnumeration();
1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We'll be leaking memory from this test.
1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) {
1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntryEnumeration();
1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that if for some reason entries are modified close to existing cache
1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// iterators, we don't generate fatal errors or reset the cache.
1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendFixEnumerators() {
1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int seed = static_cast<int>(Time::Now().ToInternalValue());
1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  srand(seed);
1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kNumEntries = 10;
1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries; i++) {
1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string key = GenerateKey(true);
1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    disk_cache::Entry* entry;
1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter1 = NULL;
1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter2 = NULL;
1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1));
1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry1);
1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = NULL;
1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Let's go to the middle of the list.
1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumEntries / 2; i++) {
1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (entry1)
1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      entry1->Close();
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1));
1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry1);
1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry2);
1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry2->Close();
1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Messing up with entry1 will modify entry2->next.
1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Doom();
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry2);
1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The link entry2->entry1 should be broken.
1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(entry2->GetKey(), entry1->GetKey());
1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // And the second iterator should keep working.
1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != entry2);
1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_->EndEnumeration(&iter1);
1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_->EndEnumeration(&iter2);
1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, FixEnumerators) {
1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendFixEnumerators();
1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) {
1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendFixEnumerators();
1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomRecent() {
1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time initial = Time::Now();
1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry;
1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("first", &entry));
1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("second", &entry));
1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time middle = Time::Now();
1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry));
1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time final = Time::Now();
1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(4, cache_->GetEntryCount());
1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntriesSince(final));
1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(4, cache_->GetEntryCount());
1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntriesSince(middle));
1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(2, cache_->GetEntryCount());
1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("second", &entry));
1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomRecent) {
1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomRecent();
1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) {
1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomRecent();
1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) {
1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomRecent();
1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomBetween() {
1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time initial = Time::Now();
1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry;
1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("first", &entry));
1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time middle_start = Time::Now();
1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("second", &entry));
1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time middle_end = Time::Now();
1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry));
1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("fourth", &entry));
1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(20);
1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time final = Time::Now();
1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(4, cache_->GetEntryCount());
1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, middle_end));
1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(2, cache_->GetEntryCount());
1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("fourth", &entry));
1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final));
1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(1, cache_->GetEntryCount());
1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("first", &entry));
1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomBetween) {
1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomBetween();
1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) {
1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomBetween();
1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) {
1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomBetween();
1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheBackendTest::BackendTransaction(const std::string& name,
1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              int num_entries, bool load) {
1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  success_ = false;
1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(CopyTestCache(name));
1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (load) {
1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SetMask(0xf);
1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SetMaxSize(0x100000);
1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Clear the settings from the previous run.
1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SetMask(0);
1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SetMaxSize(0);
1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(num_entries + 1, cache_->GetEntryCount());
1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("the first key");
1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry1;
1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(net::OK, OpenEntry(key, &entry1));
1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int actual = cache_->GetEntryCount();
1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (num_entries != actual) {
1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(load);
1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // If there is a heavy load, inserting an entry will make another entry
1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // dirty (on the hash bucket) so two entries are removed.
1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_EQ(num_entries - 1, actual);
1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delete cache_;
1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_ = NULL;
1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_impl_ = NULL;
1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(CheckCacheIntegrity(GetCacheFilePath(), new_eviction_));
1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  success_ = true;
1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendRecoverInsert() {
1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Tests with an empty cache.
1226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_empty1", 0, false);
1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_empty1";
1228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_empty2", 0, false);
1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_empty2";
1230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_empty3", 0, false);
1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_empty3";
1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Tests with one entry on the cache.
1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_one1", 1, false);
1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_one1";
1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_one2", 1, false);
1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_one2";
1238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_one3", 1, false);
1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_one3";
1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Tests with one hundred entries on the cache, tiny index.
1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_load1", 100, true);
1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_load1";
1244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("insert_load2", 100, true);
1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "insert_load2";
1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, RecoverInsert) {
1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendRecoverInsert();
1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) {
1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendRecoverInsert();
1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendRecoverRemove() {
1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Removing the only element.
1259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_one1", 0, false);
1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_one1";
1261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_one2", 0, false);
1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_one2";
1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_one3", 0, false);
1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_one3";
1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Removing the head.
1267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_head1", 1, false);
1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_head1";
1269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_head2", 1, false);
1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_head2";
1271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_head3", 1, false);
1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_head3";
1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Removing the tail.
1275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_tail1", 1, false);
1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_tail1";
1277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_tail2", 1, false);
1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_tail2";
1279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_tail3", 1, false);
1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_tail3";
1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Removing with one hundred entries on the cache, tiny index.
1283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_load1", 100, true);
1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_load1";
1285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_load2", 100, true);
1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_load2";
1287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_load3", 100, true);
1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_load3";
1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // This case cannot be reverted.
1291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_one4", 0, false);
1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_one4";
1293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendTransaction("remove_head4", 1, false);
1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(success_) << "remove_head4";
1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, RecoverRemove) {
1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendRecoverRemove();
1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionRecoverRemove) {
1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendRecoverRemove();
1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid DiskCacheBackendTest::BackendRecoverWithEviction() {
1307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  success_ = false;
1308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_TRUE(CopyTestCache("insert_load1"));
1309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DisableFirstCleanup();
1310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetMask(0xf);
1312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetMaxSize(0x1000);
1313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We should not crash here.
1315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  InitCache();
1316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DisableIntegrityCheck();
1317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1319dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, RecoverWithEviction) {
1320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BackendRecoverWithEviction();
1321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1323dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) {
1324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetNewEviction();
1325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BackendRecoverWithEviction();
1326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests dealing with cache files that cannot be recovered.
1329c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheTest, DeleteOld) {
1330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("wrong_version"));
1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath path = GetCacheFilePath();
1332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread cache_thread("CacheThread");
1333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
1334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  base::Thread::Options(MessageLoop::TYPE_IO, 0)));
1335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
1336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Backend* cache;
1338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = disk_cache::BackendImpl::CreateBackend(
1339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               path, true, 0, net::DISK_CACHE, disk_cache::kNoRandom,
13403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen               cache_thread.message_loop_proxy(), NULL, &cache, &cb);
1341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, cb.GetResult(rv));
1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoopHelper helper;
1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(NULL != cache);
1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, cache->GetEntryCount());
1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete cache;
1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with messed up entries on disk.
1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidEntry2() {
1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_entry"));
1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
1359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // CheckCacheIntegrity will fail at this point.
1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableIntegrityCheck();
1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidEntry2) {
1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntry2();
1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) {
1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidEntry2();
1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't crash or hang when enumerating this cache.
137672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheBackendTest::BackendInvalidEntry3() {
137772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMask(0x1);  // 2-entry table.
137872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMaxSize(0x3000);  // 12 kB.
137972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableFirstCleanup();
138072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitCache();
138172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
138272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  disk_cache::Entry* entry;
138372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void* iter = NULL;
138472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  while (OpenNextEntry(&iter, &entry) == net::OK) {
138572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry->Close();
138672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
138772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
138872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
138972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry3) {
139072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("dirty_entry3"));
139172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BackendInvalidEntry3();
139272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
139372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) {
139572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("dirty_entry4"));
139672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetNewEviction();
139772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BackendInvalidEntry3();
139872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableIntegrityCheck();
139972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
140072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
140172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test that we handle a dirty entry on the LRU list, already replaced with
140272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the same key, and with hash collisions.
140372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry4) {
140472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("dirty_entry3"));
140572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMask(0x1);  // 2-entry table.
140672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMaxSize(0x3000);  // 12 kB.
140772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableFirstCleanup();
140872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitCache();
140972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
141072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TrimForTest(false);
141172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
141272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
141372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test that we handle a dirty entry on the deleted list, already replaced with
141472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the same key, and with hash collisions.
141572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry5) {
141672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("dirty_entry4"));
141772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetNewEviction();
141872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMask(0x1);  // 2-entry table.
141972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMaxSize(0x3000);  // 12 kB.
142072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableFirstCleanup();
142172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitCache();
142272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
142372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TrimDeletedListForTest(false);
142472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
142572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1426dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(DiskCacheBackendTest, InvalidEntry6) {
1427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_TRUE(CopyTestCache("dirty_entry5"));
1428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetMask(0x1);  // 2-entry table.
1429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetMaxSize(0x3000);  // 12 kB.
1430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DisableFirstCleanup();
1431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  InitCache();
1432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // There is a dirty entry (but marked as clean) at the end, pointing to a
1434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // deleted entry through the hash collision list. We should not re-insert the
1435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // deleted entry into the index table.
1436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TrimForTest(false);
1438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The cache should be clean (as detected by CheckCacheIntegrity).
1439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
144172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't hang when there is a loop on the hash collision list.
144272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The test cache could be a result of bug 69135.
144372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, BadNextEntry1) {
144472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("list_loop2"));
144572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMask(0x1);  // 2-entry table.
144672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMaxSize(0x3000);  // 12 kB.
144772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableFirstCleanup();
144872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitCache();
144972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
145072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The second entry points at itselft, and the first entry is not accessible
145172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // though the index, but it is at the head of the LRU.
145272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
145372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  disk_cache::Entry* entry;
145472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(net::OK, CreateEntry("The first key", &entry));
145572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  entry->Close();
145672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
145772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TrimForTest(false);
145872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TrimForTest(false);
145972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(net::OK, OpenEntry("The first key", &entry));
146072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  entry->Close();
146172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1, cache_->GetEntryCount());
146272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
146372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
146472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that we don't hang when there is a loop on the hash collision list.
146572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The test cache could be a result of bug 69135.
146672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, BadNextEntry2) {
146772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(CopyTestCache("list_loop3"));
146872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMask(0x1);  // 2-entry table.
146972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetMaxSize(0x3000);  // 12 kB.
147072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DisableFirstCleanup();
147172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InitCache();
147272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
147372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // There is a wide loop of 5 entries.
147472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
147572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  disk_cache::Entry* entry;
147672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_NE(net::OK, OpenEntry("Not present key", &entry));
147772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
147872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
147972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) {
14804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings3"));
14814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DisableFirstCleanup();
14824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  SetNewEviction();
14834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  InitCache();
14844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The second entry is dirty, but removing it should not corrupt the list.
14864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  disk_cache::Entry* entry;
14874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_NE(net::OK, OpenEntry("the second key", &entry));
14884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry));
14894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // This should not delete the cache.
14914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  entry->Doom();
14924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  FlushQueueForTest();
14934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  entry->Close();
14944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry));
14964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  entry->Close();
14974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with abnormal dirty entries.
1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheBackendTest::BackendNotMarkedButDirty(const std::string& name) {
1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(CopyTestCache(name));
1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
1507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NotMarkedButDirty) {
1512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendNotMarkedButDirty("dirty_entry");
1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionNotMarkedButDirty) {
1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendNotMarkedButDirty("dirty_entry");
1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NotMarkedButDirty2) {
1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendNotMarkedButDirty("dirty_entry2");
1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionNotMarkedButDirty2) {
1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendNotMarkedButDirty("dirty_entry2");
1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We want to be able to deal with messed up entries on disk.
1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidRankings2() {
1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath path = GetCacheFilePath();
1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry2));
1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // CheckCacheIntegrity will fail at this point.
1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableIntegrityCheck();
1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankings2) {
1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings2();
1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) {
1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings2();
1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the LRU is corrupt, we delete the cache.
1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendInvalidRankings() {
1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
1558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // Allow the restart to finish.
1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) {
1568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings();
1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) {
1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings();
1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, InvalidRankingsFailure) {
1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings();
1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) {
1594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendInvalidRankings();
1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the LRU is corrupt and we have open entries, we disable the cache.
1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable() {
1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
1607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2));
161021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(0, cache_->GetEntryCount());
1611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, CreateEntry("Something new", &entry2));
1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
1615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // This one actually allows that task to complete.
1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess) {
1621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable();
1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) {
1629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable();
1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableFailure) {
1638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable();
1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) {
1647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable();
1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is another type of corruption on the LRU; disable the cache.
1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable2() {
1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(8, cache_->GetEntryCount());
1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int count = 0;
1663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (OpenNextEntry(&iter, &entry) == net::OK) {
1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(NULL != entry);
1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    count++;
1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_LT(count, 9);
1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess2) {
1675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("list_loop"));
1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable2();
1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) {
1683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("list_loop"));
1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable2();
1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableFailure2) {
1692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("list_loop"));
1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable2();
1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) {
1701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("list_loop"));
1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetTestMode();  // Fail cache reinitialization.
1707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable2();
1708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the index size changes when we disable the cache, we should not crash.
1711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable3() {
1712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
1714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
1715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
1716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2));
1719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();
1720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("Something new", &entry2));
1722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, cache_->GetEntryCount());
1725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess3) {
1728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
1729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(20 * 1024 * 1024);
1731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable3();
1733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) {
1736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
1737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(20 * 1024 * 1024);
1739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable3();
1742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If we disable the cache, already open entries should work as far as possible.
1745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDisable4() {
1746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2, *entry3, *entry4;
1747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
1748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
1749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char key2[2000];
1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char key3[20000];
1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CacheTestFillBuffer(key2, sizeof(key2), true);
1753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CacheTestFillBuffer(key3, sizeof(key3), true);
1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  key2[sizeof(key2) - 1] = '\0';
1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  key3[sizeof(key3) - 1] = '\0';
1756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(key2, &entry2));
1757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry(key3, &entry3));
1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kBufSize = 20000;
1760513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize));
1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memset(buf->data(), 0, kBufSize);
17623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false));
17633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false));
1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This line should disable the cache but not delete it.
1766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4));
176721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(0, cache_->GetEntryCount());
1768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4));
1770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(100, ReadData(entry2, 0, 0, buf, 100));
17723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(100, WriteData(entry2, 0, 0, buf, 100, false));
17733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(100, WriteData(entry2, 1, 0, buf, 100, false));
1774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf, kBufSize));
17763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf, kBufSize, false));
17773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf, kBufSize, false));
1778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key = entry2->GetKey();
1780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(sizeof(key2) - 1, key.size());
1781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  key = entry3->GetKey();
1782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(sizeof(key3) - 1, key.size());
1783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry3->Close();
1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FlushQueueForTest();  // This one actually allows that task to complete.
1789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, cache_->GetEntryCount());
1791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DisableSuccess4) {
1794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable4();
1799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1801c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) {
1802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings"));
1803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetDirectMode();
1805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDisable4();
1808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, Backend_UsageStats) {
1811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoopHelper helper;
1812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath path = GetCacheFilePath();
1814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(DeleteCache(path));
1815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_ptr<disk_cache::BackendImpl> cache;
1816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  cache.reset(new disk_cache::BackendImpl(
18173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                  path, base::MessageLoopProxy::CreateForCurrentThread(),
18183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                  NULL));
1819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != cache.get());
1820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache->SetUnitTestMode();
1821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, cache->SyncInit());
1822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Wait for a callback that never comes... about 2 secs :). The message loop
1824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // has to run to allow invocation of the usage timer.
1825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  helper.WaitUntilCacheIoFinished(1);
1826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomAll() {
1829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time initial = Time::Now();
1831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry1, *entry2;
1833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("first", &entry1));
1834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("second", &entry2));
1835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("third", &entry1));
1839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2));
1840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(4, cache_->GetEntryCount());
1842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomAllEntries());
1843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, cache_->GetEntryCount());
1844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should stop posting tasks at some point (if we post any).
1846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
1847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry *entry3, *entry4;
1849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("third", &entry3));
1850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4));
1851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomAllEntries());
1853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, cache_->GetEntryCount());
1854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry3->Doom();  // The entry should be already doomed, but this must work.
1858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry3->Close();
1859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry4->Close();
1860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now try with all references released.
1862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("third", &entry1));
1863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2));
1864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1->Close();
1865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2->Close();
1866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(2, cache_->GetEntryCount());
1868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomAllEntries());
1869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, cache_->GetEntryCount());
1870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomAll) {
1873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomAll();
1874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomAll) {
1877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomAll();
1879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) {
1882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMemoryOnlyMode();
1883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomAll();
1884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18863345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) {
18873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCacheType(net::APP_CACHE);
18883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BackendDoomAll();
18893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
18903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If the index size changes when we doom the cache, we should not crash.
1892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheBackendTest::BackendDoomAll2() {
1893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, cache_->GetEntryCount());
1894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, DoomAllEntries());
1895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
1897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, CreateEntry("Something new", &entry));
1898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry->Close();
1899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, cache_->GetEntryCount());
1901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, DoomAll2) {
1904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
1905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(20 * 1024 * 1024);
1907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomAll2();
1909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) {
1912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
1913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DisableFirstCleanup();
1914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetMaxSize(20 * 1024 * 1024);
1915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SetNewEviction();
1916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitCache();
1917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendDoomAll2();
1918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We should be able to create the same entry on multiple simultaneous instances
1921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of the cache.
1922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, MultipleInstances) {
1923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedTestCache store1;
1924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedTestCache store2("cache_test2");
1925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedTestCache store3("cache_test3");
1926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread cache_thread("CacheThread");
1927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
1928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  base::Thread::Options(MessageLoop::TYPE_IO, 0)));
1929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
1930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kNumberOfCaches = 2;
1932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Backend* cache[kNumberOfCaches];
1933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = disk_cache::BackendImpl::CreateBackend(
1935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               store1.path(), false, 0, net::DISK_CACHE, disk_cache::kNone,
19363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen               cache_thread.message_loop_proxy(), NULL, &cache[0], &cb);
1937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, cb.GetResult(rv));
1938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rv = disk_cache::BackendImpl::CreateBackend(
1939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           store2.path(), false, 0, net::MEDIA_CACHE, disk_cache::kNone,
19403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen           cache_thread.message_loop_proxy(), NULL, &cache[1], &cb);
1941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, cb.GetResult(rv));
1942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(cache[0] != NULL && cache[1] != NULL);
1944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string key("the first key");
1946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Entry* entry;
1947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < kNumberOfCaches; i++) {
1948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = cache[i]->CreateEntry(key, &entry, &cb);
1949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
1950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->Close();
1951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete cache[0];
1953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete cache[1];
1954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test the six regions of the curve that determines the max cache size.
1957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(DiskCacheTest, AutomaticMaxSize) {
1958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kDefaultSize = 80 * 1024 * 1024;
1959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 large_size = kDefaultSize;
1960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 largest_size = kint32max;
1961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 1: expected = available * 0.8
1963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ((kDefaultSize - 1) * 8 / 10,
1964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size - 1));
1965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 8 / 10,
1966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size));
1967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize - 1,
1968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 10 / 8 - 1));
1969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 2: expected = default_size
1971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize,
1972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 10 / 8));
1973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize,
1974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 10 - 1));
1975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 3: expected = available * 0.1
1977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize,
1978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 10));
1979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ((kDefaultSize * 25 - 1) / 10,
1980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 25 - 1));
1981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 4: expected = default_size * 2.5
1983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 25 / 10,
1984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 25));
1985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 25 / 10,
1986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 100 - 1));
1987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 25 / 10,
1988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 100));
1989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 25 / 10,
1990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 250 - 1));
1991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 5: expected = available * 0.1
1993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kDefaultSize * 25 / 10,
1994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(large_size * 250));
1995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kint32max - 1,
1996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(largest_size * 100 - 1));
1997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Region 6: expected = kint32max
1999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kint32max,
2000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(largest_size * 100));
2001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(kint32max,
2002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            disk_cache::PreferedCacheSize(largest_size * 10000));
2003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we can "migrate" a running instance from one experiment group to
2006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// another.
2007c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DiskCacheBackendTest, Histograms) {
2008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetDirectMode();
2009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InitCache();
2010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::BackendImpl* backend_ = cache_impl_;  // Needed be the macro.
2011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 1; i < 3; i++) {
2013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CACHE_UMA(HOURS, "FillupTime", i, 28);
2014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
20163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Make sure that we keep the total memory used by the internal buffers under
20183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// control.
20193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, TotalBuffersSize1) {
20203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetDirectMode();
20213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitCache();
20223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string key("the first key");
20233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  disk_cache::Entry* entry;
20243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
20253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kSize = 200;
2027513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
20283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CacheTestFillBuffer(buffer->data(), kSize, true);
20293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (int i = 0; i < 10; i++) {
20313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(i);
20323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Allocate 2MB for this entry.
20333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer, kSize, true));
20343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer, kSize, true));
20353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(kSize, WriteData(entry, 0, 1024 * 1024, buffer, kSize, false));
20363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(kSize, WriteData(entry, 1, 1024 * 1024, buffer, kSize, false));
20373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Delete one of the buffers and truncate the other.
20393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true));
20403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(0, WriteData(entry, 1, 10, buffer, 0, true));
20413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Delete the second buffer, writing 10 bytes to disk.
20433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    entry->Close();
20443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
20453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
20463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry->Close();
20483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize());
20493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
20503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This test assumes at least 150MB of system memory.
20523345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, TotalBuffersSize2) {
20533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetDirectMode();
20543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitCache();
20553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kOneMB = 1024 * 1024;
20573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
20583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize());
20593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
20613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
20623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
20643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize());
20653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache_impl_->BufferDeleted(kOneMB);
20673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
20683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Check the upper limit.
20703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB));
20713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (int i = 0; i < 30; i++)
20733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cache_impl_->IsAllocAllowed(0, kOneMB);  // Ignore the result.
20743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB));
20763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
20773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that sharing of external files works and we are able to delete the
20793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// files when we need to.
20803345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(DiskCacheBackendTest, FileSharing) {
20813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetDirectMode();
20823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitCache();
20833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  disk_cache::Addr address(0x80000001);
20853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(cache_impl_->CreateExternalFile(&address));
20863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath name = cache_impl_->GetFileName(address);
20873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<disk_cache::File> file(new disk_cache::File(false));
20893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file->Init(name);
20903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
20923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE;
20933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DWORD access = GENERIC_READ | GENERIC_WRITE;
20943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::win::ScopedHandle file2(CreateFile(
20953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL));
20963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(file2.IsValid());
20973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  sharing |= FILE_SHARE_DELETE;
20993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file2.Set(CreateFile(name.value().c_str(), access, sharing, NULL,
21003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       OPEN_EXISTING, 0, NULL));
21013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(file2.IsValid());
21023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
21033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
21043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(file_util::Delete(name, false));
21053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
21063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We should be able to use the file.
21073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kSize = 200;
21083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  char buffer1[kSize];
21093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  char buffer2[kSize];
21103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  memset(buffer1, 't', kSize);
21113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  memset(buffer2, 0, kSize);
21123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(file->Write(buffer1, kSize, 0));
21133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(file->Read(buffer2, kSize, 0));
21143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize));
21153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
21163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(disk_cache::DeleteCacheFile(name));
21173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2118