xref: /aosp_15_r20/external/cronet/net/disk_cache/backend_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker #include <string_view>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/containers/queue.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/files/file.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/memory_pressure_listener.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/test/bind.h"
30*6777b538SAndroid Build Coastguard Worker #include "base/test/metrics/histogram_tester.h"
31*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
32*6777b538SAndroid Build Coastguard Worker #include "base/test/simple_test_clock.h"
33*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
34*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
35*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
36*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/memory_allocator_dump.h"
37*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/process_memory_dump.h"
38*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
39*6777b538SAndroid Build Coastguard Worker #include "net/base/cache_type.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
41*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
42*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
43*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
44*6777b538SAndroid Build Coastguard Worker #include "net/base/test_completion_callback.h"
45*6777b538SAndroid Build Coastguard Worker #include "net/base/tracing.h"
46*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/backend_cleanup_tracker.h"
47*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/blockfile/backend_impl.h"
48*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/blockfile/entry_impl.h"
49*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/blockfile/experiments.h"
50*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/blockfile/mapped_file.h"
51*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/cache_util.h"
52*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache_test_base.h"
53*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache_test_util.h"
54*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/memory/mem_backend_impl.h"
55*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_backend_impl.h"
56*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_entry_format.h"
57*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_histogram_enums.h"
58*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_index.h"
59*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_synchronous_entry.h"
60*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_test_util.h"
61*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_util.h"
62*6777b538SAndroid Build Coastguard Worker #include "net/test/gtest_util.h"
63*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
64*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
65*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/base/dynamic_annotations.h"
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker using disk_cache::EntryResult;
68*6777b538SAndroid Build Coastguard Worker using net::test::IsError;
69*6777b538SAndroid Build Coastguard Worker using net::test::IsOk;
70*6777b538SAndroid Build Coastguard Worker using testing::ByRef;
71*6777b538SAndroid Build Coastguard Worker using testing::Contains;
72*6777b538SAndroid Build Coastguard Worker using testing::Eq;
73*6777b538SAndroid Build Coastguard Worker using testing::Field;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
76*6777b538SAndroid Build Coastguard Worker #include <windows.h>
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
79*6777b538SAndroid Build Coastguard Worker #endif
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/949811): Fix memory leaks in tests and re-enable on LSAN.
82*6777b538SAndroid Build Coastguard Worker #ifdef LEAK_SANITIZER
83*6777b538SAndroid Build Coastguard Worker #define MAYBE_BlockFileOpenOrCreateEntry DISABLED_BlockFileOpenOrCreateEntry
84*6777b538SAndroid Build Coastguard Worker #define MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover \
85*6777b538SAndroid Build Coastguard Worker   DISABLED_NonEmptyCorruptSimpleCacheDoesNotRecover
86*6777b538SAndroid Build Coastguard Worker #define MAYBE_SimpleOpenOrCreateEntry DISABLED_SimpleOpenOrCreateEntry
87*6777b538SAndroid Build Coastguard Worker #else
88*6777b538SAndroid Build Coastguard Worker #define MAYBE_BlockFileOpenOrCreateEntry BlockFileOpenOrCreateEntry
89*6777b538SAndroid Build Coastguard Worker #define MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover \
90*6777b538SAndroid Build Coastguard Worker   NonEmptyCorruptSimpleCacheDoesNotRecover
91*6777b538SAndroid Build Coastguard Worker #define MAYBE_SimpleOpenOrCreateEntry SimpleOpenOrCreateEntry
92*6777b538SAndroid Build Coastguard Worker #endif
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker using base::Time;
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker namespace {
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker const char kExistingEntryKey[] = "existing entry key";
99*6777b538SAndroid Build Coastguard Worker 
CreateExistingEntryCache(const base::FilePath & cache_path)100*6777b538SAndroid Build Coastguard Worker std::unique_ptr<disk_cache::BackendImpl> CreateExistingEntryCache(
101*6777b538SAndroid Build Coastguard Worker     const base::FilePath& cache_path) {
102*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache(
105*6777b538SAndroid Build Coastguard Worker       std::make_unique<disk_cache::BackendImpl>(cache_path,
106*6777b538SAndroid Build Coastguard Worker                                                 /* cleanup_tracker = */ nullptr,
107*6777b538SAndroid Build Coastguard Worker                                                 /* cache_thread = */ nullptr,
108*6777b538SAndroid Build Coastguard Worker                                                 net::DISK_CACHE,
109*6777b538SAndroid Build Coastguard Worker                                                 /* net_log = */ nullptr));
110*6777b538SAndroid Build Coastguard Worker   cache->Init(cb.callback());
111*6777b538SAndroid Build Coastguard Worker   if (cb.WaitForResult() != net::OK)
112*6777b538SAndroid Build Coastguard Worker     return nullptr;
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb2;
115*6777b538SAndroid Build Coastguard Worker   EntryResult result =
116*6777b538SAndroid Build Coastguard Worker       cache->CreateEntry(kExistingEntryKey, net::HIGHEST, cb2.callback());
117*6777b538SAndroid Build Coastguard Worker   result = cb2.GetResult(std::move(result));
118*6777b538SAndroid Build Coastguard Worker   if (result.net_error() != net::OK)
119*6777b538SAndroid Build Coastguard Worker     return nullptr;
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   return cache;
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
125*6777b538SAndroid Build Coastguard Worker // Load tests with large numbers of file descriptors perform poorly on
126*6777b538SAndroid Build Coastguard Worker // virtualized test execution environments.
127*6777b538SAndroid Build Coastguard Worker // TODO(807882): Remove this workaround when virtualized test performance
128*6777b538SAndroid Build Coastguard Worker // improves.
129*6777b538SAndroid Build Coastguard Worker const int kLargeNumEntries = 100;
130*6777b538SAndroid Build Coastguard Worker #else
131*6777b538SAndroid Build Coastguard Worker const int kLargeNumEntries = 512;
132*6777b538SAndroid Build Coastguard Worker #endif
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker }  // namespace
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker // Tests that can run with different types of caches.
137*6777b538SAndroid Build Coastguard Worker class DiskCacheBackendTest : public DiskCacheTestWithCache {
138*6777b538SAndroid Build Coastguard Worker  protected:
139*6777b538SAndroid Build Coastguard Worker   // Some utility methods:
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   // Perform IO operations on the cache until there is pending IO.
142*6777b538SAndroid Build Coastguard Worker   int GeneratePendingIO(net::TestCompletionCallback* cb);
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL,
145*6777b538SAndroid Build Coastguard Worker   // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween.
146*6777b538SAndroid Build Coastguard Worker   // There are 4 entries after doomed_start and 2 after doomed_end.
147*6777b538SAndroid Build Coastguard Worker   void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end);
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   bool CreateSetOfRandomEntries(std::set<std::string>* key_pool);
150*6777b538SAndroid Build Coastguard Worker   bool EnumerateAndMatchKeys(int max_to_open,
151*6777b538SAndroid Build Coastguard Worker                              TestIterator* iter,
152*6777b538SAndroid Build Coastguard Worker                              std::set<std::string>* keys_to_match,
153*6777b538SAndroid Build Coastguard Worker                              size_t* count);
154*6777b538SAndroid Build Coastguard Worker 
155*6777b538SAndroid Build Coastguard Worker   // Computes the expected size of entry metadata, i.e. the total size without
156*6777b538SAndroid Build Coastguard Worker   // the actual data stored. This depends only on the entry's |key| size.
157*6777b538SAndroid Build Coastguard Worker   int GetEntryMetadataSize(std::string key);
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   // The Simple Backend only tracks the approximate sizes of entries. This
160*6777b538SAndroid Build Coastguard Worker   // rounds the exact size appropriately.
161*6777b538SAndroid Build Coastguard Worker   int GetRoundedSize(int exact_size);
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   // Create a default key with the name provided, populate it with
164*6777b538SAndroid Build Coastguard Worker   // CacheTestFillBuffer, and ensure this was done correctly.
165*6777b538SAndroid Build Coastguard Worker   void CreateKeyAndCheck(disk_cache::Backend* cache, std::string key);
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   // For the simple cache, wait until indexing has occurred and make sure
168*6777b538SAndroid Build Coastguard Worker   // completes successfully.
169*6777b538SAndroid Build Coastguard Worker   void WaitForSimpleCacheIndexAndCheck(disk_cache::Backend* cache);
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker   // Run all of the task runners untile idle, covers cache worker pools.
172*6777b538SAndroid Build Coastguard Worker   void RunUntilIdle();
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   // Actual tests:
175*6777b538SAndroid Build Coastguard Worker   void BackendBasics();
176*6777b538SAndroid Build Coastguard Worker   void BackendKeying();
177*6777b538SAndroid Build Coastguard Worker   void BackendShutdownWithPendingFileIO(bool fast);
178*6777b538SAndroid Build Coastguard Worker   void BackendShutdownWithPendingIO(bool fast);
179*6777b538SAndroid Build Coastguard Worker   void BackendShutdownWithPendingCreate(bool fast);
180*6777b538SAndroid Build Coastguard Worker   void BackendShutdownWithPendingDoom();
181*6777b538SAndroid Build Coastguard Worker   void BackendSetSize();
182*6777b538SAndroid Build Coastguard Worker   void BackendLoad();
183*6777b538SAndroid Build Coastguard Worker   void BackendChain();
184*6777b538SAndroid Build Coastguard Worker   void BackendValidEntry();
185*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry();
186*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntryRead();
187*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntryWithLoad();
188*6777b538SAndroid Build Coastguard Worker   void BackendTrimInvalidEntry();
189*6777b538SAndroid Build Coastguard Worker   void BackendTrimInvalidEntry2();
190*6777b538SAndroid Build Coastguard Worker   void BackendEnumerations();
191*6777b538SAndroid Build Coastguard Worker   void BackendEnumerations2();
192*6777b538SAndroid Build Coastguard Worker   void BackendDoomMidEnumeration();
193*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntryEnumeration();
194*6777b538SAndroid Build Coastguard Worker   void BackendFixEnumerators();
195*6777b538SAndroid Build Coastguard Worker   void BackendDoomRecent();
196*6777b538SAndroid Build Coastguard Worker   void BackendDoomBetween();
197*6777b538SAndroid Build Coastguard Worker   void BackendCalculateSizeOfAllEntries();
198*6777b538SAndroid Build Coastguard Worker   void BackendCalculateSizeOfEntriesBetween(
199*6777b538SAndroid Build Coastguard Worker       bool expect_access_time_range_comparisons);
200*6777b538SAndroid Build Coastguard Worker   void BackendTransaction(const std::string& name, int num_entries, bool load);
201*6777b538SAndroid Build Coastguard Worker   void BackendRecoverInsert();
202*6777b538SAndroid Build Coastguard Worker   void BackendRecoverRemove();
203*6777b538SAndroid Build Coastguard Worker   void BackendRecoverWithEviction();
204*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry2();
205*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry3();
206*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry7();
207*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry8();
208*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry9(bool eviction);
209*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry10(bool eviction);
210*6777b538SAndroid Build Coastguard Worker   void BackendInvalidEntry11(bool eviction);
211*6777b538SAndroid Build Coastguard Worker   void BackendTrimInvalidEntry12();
212*6777b538SAndroid Build Coastguard Worker   void BackendDoomAll();
213*6777b538SAndroid Build Coastguard Worker   void BackendDoomAll2();
214*6777b538SAndroid Build Coastguard Worker   void BackendInvalidRankings();
215*6777b538SAndroid Build Coastguard Worker   void BackendInvalidRankings2();
216*6777b538SAndroid Build Coastguard Worker   void BackendDisable();
217*6777b538SAndroid Build Coastguard Worker   void BackendDisable2();
218*6777b538SAndroid Build Coastguard Worker   void BackendDisable3();
219*6777b538SAndroid Build Coastguard Worker   void BackendDisable4();
220*6777b538SAndroid Build Coastguard Worker   void BackendDisabledAPI();
221*6777b538SAndroid Build Coastguard Worker   void BackendEviction();
222*6777b538SAndroid Build Coastguard Worker   void BackendOpenOrCreateEntry();
223*6777b538SAndroid Build Coastguard Worker   void BackendDeadOpenNextEntry();
224*6777b538SAndroid Build Coastguard Worker   void BackendIteratorConcurrentDoom();
225*6777b538SAndroid Build Coastguard Worker   void BackendValidateMigrated();
226*6777b538SAndroid Build Coastguard Worker };
227*6777b538SAndroid Build Coastguard Worker 
CreateKeyAndCheck(disk_cache::Backend * cache,std::string key)228*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::CreateKeyAndCheck(disk_cache::Backend* cache,
229*6777b538SAndroid Build Coastguard Worker                                              std::string key) {
230*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 4 * 1024;
231*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
232*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
233*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb_entry;
234*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result =
235*6777b538SAndroid Build Coastguard Worker       cache->CreateEntry(key, net::HIGHEST, cb_entry.callback());
236*6777b538SAndroid Build Coastguard Worker   result = cb_entry.GetResult(std::move(result));
237*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, result.net_error());
238*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = result.ReleaseEntry();
239*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
240*6777b538SAndroid Build Coastguard Worker   entry->Close();
241*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
242*6777b538SAndroid Build Coastguard Worker }
243*6777b538SAndroid Build Coastguard Worker 
WaitForSimpleCacheIndexAndCheck(disk_cache::Backend * cache)244*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::WaitForSimpleCacheIndexAndCheck(
245*6777b538SAndroid Build Coastguard Worker     disk_cache::Backend* cache) {
246*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback wait_for_index_cb;
247*6777b538SAndroid Build Coastguard Worker   static_cast<disk_cache::SimpleBackendImpl*>(cache)->index()->ExecuteWhenReady(
248*6777b538SAndroid Build Coastguard Worker       wait_for_index_cb.callback());
249*6777b538SAndroid Build Coastguard Worker   int rv = wait_for_index_cb.WaitForResult();
250*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv, IsOk());
251*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker 
RunUntilIdle()254*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::RunUntilIdle() {
255*6777b538SAndroid Build Coastguard Worker   DiskCacheTestWithCache::RunUntilIdle();
256*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
257*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
258*6777b538SAndroid Build Coastguard Worker }
259*6777b538SAndroid Build Coastguard Worker 
GeneratePendingIO(net::TestCompletionCallback * cb)260*6777b538SAndroid Build Coastguard Worker int DiskCacheBackendTest::GeneratePendingIO(net::TestCompletionCallback* cb) {
261*6777b538SAndroid Build Coastguard Worker   if (!use_current_thread_ && !simple_cache_mode_) {
262*6777b538SAndroid Build Coastguard Worker     ADD_FAILURE();
263*6777b538SAndroid Build Coastguard Worker     return net::ERR_FAILED;
264*6777b538SAndroid Build Coastguard Worker   }
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback create_cb;
267*6777b538SAndroid Build Coastguard Worker   EntryResult entry_result;
268*6777b538SAndroid Build Coastguard Worker   entry_result =
269*6777b538SAndroid Build Coastguard Worker       cache_->CreateEntry("some key", net::HIGHEST, create_cb.callback());
270*6777b538SAndroid Build Coastguard Worker   entry_result = create_cb.GetResult(std::move(entry_result));
271*6777b538SAndroid Build Coastguard Worker   if (entry_result.net_error() != net::OK)
272*6777b538SAndroid Build Coastguard Worker     return net::ERR_CACHE_CREATE_FAILURE;
273*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = entry_result.ReleaseEntry();
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker   const int kSize = 25000;
276*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
277*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, false);
278*6777b538SAndroid Build Coastguard Worker 
279*6777b538SAndroid Build Coastguard Worker   int rv = net::OK;
280*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) {
281*6777b538SAndroid Build Coastguard Worker     // We are using the current thread as the cache thread because we want to
282*6777b538SAndroid Build Coastguard Worker     // be able to call directly this method to make sure that the OS (instead
283*6777b538SAndroid Build Coastguard Worker     // of us switching thread) is returning IO pending.
284*6777b538SAndroid Build Coastguard Worker     if (!simple_cache_mode_) {
285*6777b538SAndroid Build Coastguard Worker       rv = static_cast<disk_cache::EntryImpl*>(entry)->WriteDataImpl(
286*6777b538SAndroid Build Coastguard Worker           0, i, buffer.get(), kSize, cb->callback(), false);
287*6777b538SAndroid Build Coastguard Worker     } else {
288*6777b538SAndroid Build Coastguard Worker       rv = entry->WriteData(0, i, buffer.get(), kSize, cb->callback(), false);
289*6777b538SAndroid Build Coastguard Worker     }
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker     if (rv == net::ERR_IO_PENDING)
292*6777b538SAndroid Build Coastguard Worker       break;
293*6777b538SAndroid Build Coastguard Worker     if (rv != kSize)
294*6777b538SAndroid Build Coastguard Worker       rv = net::ERR_FAILED;
295*6777b538SAndroid Build Coastguard Worker   }
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker   // Don't call Close() to avoid going through the queue or we'll deadlock
298*6777b538SAndroid Build Coastguard Worker   // waiting for the operation to finish.
299*6777b538SAndroid Build Coastguard Worker   if (!simple_cache_mode_)
300*6777b538SAndroid Build Coastguard Worker     static_cast<disk_cache::EntryImpl*>(entry)->Release();
301*6777b538SAndroid Build Coastguard Worker   else
302*6777b538SAndroid Build Coastguard Worker     entry->Close();
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker   return rv;
305*6777b538SAndroid Build Coastguard Worker }
306*6777b538SAndroid Build Coastguard Worker 
InitSparseCache(base::Time * doomed_start,base::Time * doomed_end)307*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start,
308*6777b538SAndroid Build Coastguard Worker                                            base::Time* doomed_end) {
309*6777b538SAndroid Build Coastguard Worker   InitCache();
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
312*6777b538SAndroid Build Coastguard Worker   // This must be greater than MemEntryImpl::kMaxSparseEntrySize.
313*6777b538SAndroid Build Coastguard Worker   const int kOffset = 10 + 1024 * 1024;
314*6777b538SAndroid Build Coastguard Worker 
315*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry0 = nullptr;
316*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1 = nullptr;
317*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2 = nullptr;
318*6777b538SAndroid Build Coastguard Worker 
319*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
320*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, false);
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("zeroth", &entry0), IsOk());
323*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize));
324*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
325*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize));
326*6777b538SAndroid Build Coastguard Worker   entry0->Close();
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
329*6777b538SAndroid Build Coastguard Worker   AddDelay();
330*6777b538SAndroid Build Coastguard Worker   if (doomed_start)
331*6777b538SAndroid Build Coastguard Worker     *doomed_start = base::Time::Now();
332*6777b538SAndroid Build Coastguard Worker 
333*6777b538SAndroid Build Coastguard Worker   // Order in rankings list:
334*6777b538SAndroid Build Coastguard Worker   // first_part1, first_part2, second_part1, second_part2
335*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry1), IsOk());
336*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize));
337*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
338*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize));
339*6777b538SAndroid Build Coastguard Worker   entry1->Close();
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry2), IsOk());
342*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize));
343*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
344*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize));
345*6777b538SAndroid Build Coastguard Worker   entry2->Close();
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
348*6777b538SAndroid Build Coastguard Worker   AddDelay();
349*6777b538SAndroid Build Coastguard Worker   if (doomed_end)
350*6777b538SAndroid Build Coastguard Worker     *doomed_end = base::Time::Now();
351*6777b538SAndroid Build Coastguard Worker 
352*6777b538SAndroid Build Coastguard Worker   // Order in rankings list:
353*6777b538SAndroid Build Coastguard Worker   // third_part1, fourth_part1, third_part2, fourth_part2
354*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry3 = nullptr;
355*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry4 = nullptr;
356*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry3), IsOk());
357*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize));
358*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry4), IsOk());
359*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize));
360*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
361*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize));
362*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
363*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize));
364*6777b538SAndroid Build Coastguard Worker   entry3->Close();
365*6777b538SAndroid Build Coastguard Worker   entry4->Close();
366*6777b538SAndroid Build Coastguard Worker 
367*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
368*6777b538SAndroid Build Coastguard Worker   AddDelay();
369*6777b538SAndroid Build Coastguard Worker }
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker // Creates entries based on random keys. Stores these keys in |key_pool|.
CreateSetOfRandomEntries(std::set<std::string> * key_pool)372*6777b538SAndroid Build Coastguard Worker bool DiskCacheBackendTest::CreateSetOfRandomEntries(
373*6777b538SAndroid Build Coastguard Worker     std::set<std::string>* key_pool) {
374*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 10;
375*6777b538SAndroid Build Coastguard Worker   const int initial_entry_count = cache_->GetEntryCount();
376*6777b538SAndroid Build Coastguard Worker 
377*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; ++i) {
378*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
379*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
380*6777b538SAndroid Build Coastguard Worker     if (CreateEntry(key, &entry) != net::OK) {
381*6777b538SAndroid Build Coastguard Worker       return false;
382*6777b538SAndroid Build Coastguard Worker     }
383*6777b538SAndroid Build Coastguard Worker     key_pool->insert(key);
384*6777b538SAndroid Build Coastguard Worker     entry->Close();
385*6777b538SAndroid Build Coastguard Worker   }
386*6777b538SAndroid Build Coastguard Worker   return key_pool->size() ==
387*6777b538SAndroid Build Coastguard Worker          static_cast<size_t>(cache_->GetEntryCount() - initial_entry_count);
388*6777b538SAndroid Build Coastguard Worker }
389*6777b538SAndroid Build Coastguard Worker 
390*6777b538SAndroid Build Coastguard Worker // Performs iteration over the backend and checks that the keys of entries
391*6777b538SAndroid Build Coastguard Worker // opened are in |keys_to_match|, then erases them. Up to |max_to_open| entries
392*6777b538SAndroid Build Coastguard Worker // will be opened, if it is positive. Otherwise, iteration will continue until
393*6777b538SAndroid Build Coastguard Worker // OpenNextEntry stops returning net::OK.
EnumerateAndMatchKeys(int max_to_open,TestIterator * iter,std::set<std::string> * keys_to_match,size_t * count)394*6777b538SAndroid Build Coastguard Worker bool DiskCacheBackendTest::EnumerateAndMatchKeys(
395*6777b538SAndroid Build Coastguard Worker     int max_to_open,
396*6777b538SAndroid Build Coastguard Worker     TestIterator* iter,
397*6777b538SAndroid Build Coastguard Worker     std::set<std::string>* keys_to_match,
398*6777b538SAndroid Build Coastguard Worker     size_t* count) {
399*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker   if (!iter)
402*6777b538SAndroid Build Coastguard Worker     return false;
403*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
404*6777b538SAndroid Build Coastguard Worker     if (!entry)
405*6777b538SAndroid Build Coastguard Worker       return false;
406*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1U, keys_to_match->erase(entry->GetKey()));
407*6777b538SAndroid Build Coastguard Worker     entry->Close();
408*6777b538SAndroid Build Coastguard Worker     ++(*count);
409*6777b538SAndroid Build Coastguard Worker     if (max_to_open >= 0 && static_cast<int>(*count) >= max_to_open)
410*6777b538SAndroid Build Coastguard Worker       break;
411*6777b538SAndroid Build Coastguard Worker   };
412*6777b538SAndroid Build Coastguard Worker 
413*6777b538SAndroid Build Coastguard Worker   return true;
414*6777b538SAndroid Build Coastguard Worker }
415*6777b538SAndroid Build Coastguard Worker 
GetEntryMetadataSize(std::string key)416*6777b538SAndroid Build Coastguard Worker int DiskCacheBackendTest::GetEntryMetadataSize(std::string key) {
417*6777b538SAndroid Build Coastguard Worker   // For blockfile and memory backends, it is just the key size.
418*6777b538SAndroid Build Coastguard Worker   if (!simple_cache_mode_)
419*6777b538SAndroid Build Coastguard Worker     return key.size();
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker   // For the simple cache, we must add the file header and EOF, and that for
422*6777b538SAndroid Build Coastguard Worker   // every stream.
423*6777b538SAndroid Build Coastguard Worker   return disk_cache::kSimpleEntryStreamCount *
424*6777b538SAndroid Build Coastguard Worker          (sizeof(disk_cache::SimpleFileHeader) +
425*6777b538SAndroid Build Coastguard Worker           sizeof(disk_cache::SimpleFileEOF) + key.size());
426*6777b538SAndroid Build Coastguard Worker }
427*6777b538SAndroid Build Coastguard Worker 
GetRoundedSize(int exact_size)428*6777b538SAndroid Build Coastguard Worker int DiskCacheBackendTest::GetRoundedSize(int exact_size) {
429*6777b538SAndroid Build Coastguard Worker   if (!simple_cache_mode_)
430*6777b538SAndroid Build Coastguard Worker     return exact_size;
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   return (exact_size + 255) & 0xFFFFFF00;
433*6777b538SAndroid Build Coastguard Worker }
434*6777b538SAndroid Build Coastguard Worker 
BackendBasics()435*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendBasics() {
436*6777b538SAndroid Build Coastguard Worker   InitCache();
437*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1 = nullptr, *entry2 = nullptr;
438*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
439*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("the first key", &entry1), IsOk());
440*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry1);
441*6777b538SAndroid Build Coastguard Worker   entry1->Close();
442*6777b538SAndroid Build Coastguard Worker   entry1 = nullptr;
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("the first key", &entry1), IsOk());
445*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry1);
446*6777b538SAndroid Build Coastguard Worker   entry1->Close();
447*6777b538SAndroid Build Coastguard Worker   entry1 = nullptr;
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, CreateEntry("the first key", &entry1));
450*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("the first key", &entry1), IsOk());
451*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
452*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("some other key", &entry2), IsOk());
453*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry1);
454*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry2);
455*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
456*6777b538SAndroid Build Coastguard Worker 
457*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry3 = nullptr;
458*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("some other key", &entry3), IsOk());
459*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry3);
460*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry2 == entry3);
461*6777b538SAndroid Build Coastguard Worker 
462*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntry("some other key"), IsOk());
463*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
464*6777b538SAndroid Build Coastguard Worker   entry1->Close();
465*6777b538SAndroid Build Coastguard Worker   entry2->Close();
466*6777b538SAndroid Build Coastguard Worker   entry3->Close();
467*6777b538SAndroid Build Coastguard Worker 
468*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntry("the first key"), IsOk());
469*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
470*6777b538SAndroid Build Coastguard Worker 
471*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("the first key", &entry1), IsOk());
472*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("some other key", &entry2), IsOk());
473*6777b538SAndroid Build Coastguard Worker   entry1->Doom();
474*6777b538SAndroid Build Coastguard Worker   entry1->Close();
475*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntry("some other key"), IsOk());
476*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
477*6777b538SAndroid Build Coastguard Worker   entry2->Close();
478*6777b538SAndroid Build Coastguard Worker }
479*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Basics)480*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Basics) {
481*6777b538SAndroid Build Coastguard Worker   BackendBasics();
482*6777b538SAndroid Build Coastguard Worker }
483*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionBasics)484*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionBasics) {
485*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
486*6777b538SAndroid Build Coastguard Worker   BackendBasics();
487*6777b538SAndroid Build Coastguard Worker }
488*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyBasics)489*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyBasics) {
490*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
491*6777b538SAndroid Build Coastguard Worker   BackendBasics();
492*6777b538SAndroid Build Coastguard Worker }
493*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheBasics)494*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheBasics) {
495*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
496*6777b538SAndroid Build Coastguard Worker   BackendBasics();
497*6777b538SAndroid Build Coastguard Worker }
498*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheBasics)499*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheBasics) {
500*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
501*6777b538SAndroid Build Coastguard Worker   BackendBasics();
502*6777b538SAndroid Build Coastguard Worker }
503*6777b538SAndroid Build Coastguard Worker 
BackendKeying()504*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendKeying() {
505*6777b538SAndroid Build Coastguard Worker   InitCache();
506*6777b538SAndroid Build Coastguard Worker   const char kName1[] = "the first key";
507*6777b538SAndroid Build Coastguard Worker   const char kName2[] = "the first Key";
508*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
509*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kName1, &entry1), IsOk());
510*6777b538SAndroid Build Coastguard Worker 
511*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kName2, &entry2), IsOk());
512*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry1 != entry2) << "Case sensitive";
513*6777b538SAndroid Build Coastguard Worker   entry2->Close();
514*6777b538SAndroid Build Coastguard Worker 
515*6777b538SAndroid Build Coastguard Worker   char buffer[30];
516*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer, kName1, std::size(buffer));
517*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(buffer, &entry2), IsOk());
518*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry1 == entry2);
519*6777b538SAndroid Build Coastguard Worker   entry2->Close();
520*6777b538SAndroid Build Coastguard Worker 
521*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer + 1, kName1, std::size(buffer) - 1);
522*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(buffer + 1, &entry2), IsOk());
523*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry1 == entry2);
524*6777b538SAndroid Build Coastguard Worker   entry2->Close();
525*6777b538SAndroid Build Coastguard Worker 
526*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer + 3, kName1, std::size(buffer) - 3);
527*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(buffer + 3, &entry2), IsOk());
528*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry1 == entry2);
529*6777b538SAndroid Build Coastguard Worker   entry2->Close();
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker   // Now verify long keys.
532*6777b538SAndroid Build Coastguard Worker   char buffer2[20000];
533*6777b538SAndroid Build Coastguard Worker   memset(buffer2, 's', sizeof(buffer2));
534*6777b538SAndroid Build Coastguard Worker   buffer2[1023] = '\0';
535*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file";
536*6777b538SAndroid Build Coastguard Worker   entry2->Close();
537*6777b538SAndroid Build Coastguard Worker 
538*6777b538SAndroid Build Coastguard Worker   buffer2[1023] = 'g';
539*6777b538SAndroid Build Coastguard Worker   buffer2[19999] = '\0';
540*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file";
541*6777b538SAndroid Build Coastguard Worker   entry2->Close();
542*6777b538SAndroid Build Coastguard Worker   entry1->Close();
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   // Create entries with null terminator(s), and check equality. Note we create
545*6777b538SAndroid Build Coastguard Worker   // the strings via the ctor instead of using literals because literals are
546*6777b538SAndroid Build Coastguard Worker   // implicitly C strings which will stop at the first null terminator.
547*6777b538SAndroid Build Coastguard Worker   std::string key1(4, '\0');
548*6777b538SAndroid Build Coastguard Worker   key1[1] = 's';
549*6777b538SAndroid Build Coastguard Worker   std::string key2(3, '\0');
550*6777b538SAndroid Build Coastguard Worker   key2[1] = 's';
551*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key1, &entry1), IsOk());
552*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key2, &entry2), IsOk());
553*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry1 != entry2) << "Different lengths";
554*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entry1->GetKey(), key1);
555*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entry2->GetKey(), key2);
556*6777b538SAndroid Build Coastguard Worker   entry1->Close();
557*6777b538SAndroid Build Coastguard Worker   entry2->Close();
558*6777b538SAndroid Build Coastguard Worker }
559*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Keying)560*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Keying) {
561*6777b538SAndroid Build Coastguard Worker   BackendKeying();
562*6777b538SAndroid Build Coastguard Worker }
563*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionKeying)564*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionKeying) {
565*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
566*6777b538SAndroid Build Coastguard Worker   BackendKeying();
567*6777b538SAndroid Build Coastguard Worker }
568*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyKeying)569*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) {
570*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
571*6777b538SAndroid Build Coastguard Worker   BackendKeying();
572*6777b538SAndroid Build Coastguard Worker }
573*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheKeying)574*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheKeying) {
575*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
576*6777b538SAndroid Build Coastguard Worker   BackendKeying();
577*6777b538SAndroid Build Coastguard Worker }
578*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheKeying)579*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheKeying) {
580*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
581*6777b538SAndroid Build Coastguard Worker   BackendKeying();
582*6777b538SAndroid Build Coastguard Worker }
583*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheTest,CreateBackend)584*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, CreateBackend) {
585*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
586*6777b538SAndroid Build Coastguard Worker 
587*6777b538SAndroid Build Coastguard Worker   {
588*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(CleanupCacheDir());
589*6777b538SAndroid Build Coastguard Worker 
590*6777b538SAndroid Build Coastguard Worker     // Test the private factory method(s).
591*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::Backend> cache;
592*6777b538SAndroid Build Coastguard Worker     cache = disk_cache::MemBackendImpl::CreateBackend(0, nullptr);
593*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
594*6777b538SAndroid Build Coastguard Worker     cache.reset();
595*6777b538SAndroid Build Coastguard Worker 
596*6777b538SAndroid Build Coastguard Worker     // Now test the public API.
597*6777b538SAndroid Build Coastguard Worker 
598*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
599*6777b538SAndroid Build Coastguard Worker         net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT,
600*6777b538SAndroid Build Coastguard Worker         /*file_operations=*/nullptr, cache_path_, 0,
601*6777b538SAndroid Build Coastguard Worker         disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
602*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
603*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(rv.net_error, IsOk());
604*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(rv.backend);
605*6777b538SAndroid Build Coastguard Worker     rv.backend.reset();
606*6777b538SAndroid Build Coastguard Worker 
607*6777b538SAndroid Build Coastguard Worker     rv = disk_cache::CreateCacheBackend(
608*6777b538SAndroid Build Coastguard Worker         net::MEMORY_CACHE, net::CACHE_BACKEND_DEFAULT,
609*6777b538SAndroid Build Coastguard Worker         /*file_operations=*/nullptr, base::FilePath(), 0,
610*6777b538SAndroid Build Coastguard Worker         disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
611*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
612*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(rv.net_error, IsOk());
613*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(rv.backend);
614*6777b538SAndroid Build Coastguard Worker     rv.backend.reset();
615*6777b538SAndroid Build Coastguard Worker   }
616*6777b538SAndroid Build Coastguard Worker 
617*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
618*6777b538SAndroid Build Coastguard Worker }
619*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheTest,MemBackendPostCleanupCallback)620*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, MemBackendPostCleanupCallback) {
621*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
622*6777b538SAndroid Build Coastguard Worker 
623*6777b538SAndroid Build Coastguard Worker   net::TestClosure on_cleanup;
624*6777b538SAndroid Build Coastguard Worker 
625*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
626*6777b538SAndroid Build Coastguard Worker       net::MEMORY_CACHE, net::CACHE_BACKEND_DEFAULT,
627*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, base::FilePath(), 0,
628*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kNeverReset, nullptr, on_cleanup.closure(),
629*6777b538SAndroid Build Coastguard Worker       cb.callback());
630*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
631*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
632*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
633*6777b538SAndroid Build Coastguard Worker   // The callback should be posted after backend is destroyed.
634*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
635*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(on_cleanup.have_result());
636*6777b538SAndroid Build Coastguard Worker 
637*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
638*6777b538SAndroid Build Coastguard Worker 
639*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(on_cleanup.have_result());
640*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
641*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(on_cleanup.have_result());
642*6777b538SAndroid Build Coastguard Worker }
643*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheTest,CreateBackendDouble)644*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, CreateBackendDouble) {
645*6777b538SAndroid Build Coastguard Worker   // Make sure that creation for the second backend for same path happens
646*6777b538SAndroid Build Coastguard Worker   // after the first one completes.
647*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb, cb2;
648*6777b538SAndroid Build Coastguard Worker 
649*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
650*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
651*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
652*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb.callback());
653*6777b538SAndroid Build Coastguard Worker 
654*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv2 = disk_cache::CreateCacheBackend(
655*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
656*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
657*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb2.callback());
658*6777b538SAndroid Build Coastguard Worker 
659*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
660*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsOk());
661*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(rv.backend);
662*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
663*6777b538SAndroid Build Coastguard Worker 
664*6777b538SAndroid Build Coastguard Worker   // No rv2.backend yet.
665*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING, rv2.net_error);
666*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(rv2.backend);
667*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb2.have_result());
668*6777b538SAndroid Build Coastguard Worker 
669*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
670*6777b538SAndroid Build Coastguard Worker 
671*6777b538SAndroid Build Coastguard Worker   // Now rv2.backend should exist.
672*6777b538SAndroid Build Coastguard Worker   rv2 = cb2.GetResult(std::move(rv2));
673*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv2.net_error, IsOk());
674*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(rv2.backend);
675*6777b538SAndroid Build Coastguard Worker }
676*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,CreateBackendDoubleOpenEntry)677*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, CreateBackendDoubleOpenEntry) {
678*6777b538SAndroid Build Coastguard Worker   // Demonstrate the creation sequencing with an open entry. This is done
679*6777b538SAndroid Build Coastguard Worker   // with SimpleCache since the block-file cache cancels most of I/O on
680*6777b538SAndroid Build Coastguard Worker   // destruction and blocks for what it can't cancel.
681*6777b538SAndroid Build Coastguard Worker 
682*6777b538SAndroid Build Coastguard Worker   // Don't try to sanity-check things as a blockfile cache
683*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
684*6777b538SAndroid Build Coastguard Worker 
685*6777b538SAndroid Build Coastguard Worker   // Make sure that creation for the second backend for same path happens
686*6777b538SAndroid Build Coastguard Worker   // after the first one completes, and all of its ops complete.
687*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb, cb2;
688*6777b538SAndroid Build Coastguard Worker 
689*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
690*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
691*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
692*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb.callback());
693*6777b538SAndroid Build Coastguard Worker 
694*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv2 = disk_cache::CreateCacheBackend(
695*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
696*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
697*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb2.callback());
698*6777b538SAndroid Build Coastguard Worker 
699*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
700*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsOk());
701*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
702*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
703*6777b538SAndroid Build Coastguard Worker 
704*6777b538SAndroid Build Coastguard Worker   // No cache 2 yet.
705*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING, rv2.net_error);
706*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(rv2.backend);
707*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb2.have_result());
708*6777b538SAndroid Build Coastguard Worker 
709*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb3;
710*6777b538SAndroid Build Coastguard Worker   EntryResult entry_result =
711*6777b538SAndroid Build Coastguard Worker       rv.backend->CreateEntry("key", net::HIGHEST, cb3.callback());
712*6777b538SAndroid Build Coastguard Worker   entry_result = cb3.GetResult(std::move(entry_result));
713*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, entry_result.net_error());
714*6777b538SAndroid Build Coastguard Worker 
715*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
716*6777b538SAndroid Build Coastguard Worker 
717*6777b538SAndroid Build Coastguard Worker   // Still doesn't exist.
718*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb2.have_result());
719*6777b538SAndroid Build Coastguard Worker 
720*6777b538SAndroid Build Coastguard Worker   entry_result.ReleaseEntry()->Close();
721*6777b538SAndroid Build Coastguard Worker 
722*6777b538SAndroid Build Coastguard Worker   // Now should exist.
723*6777b538SAndroid Build Coastguard Worker   rv2 = cb2.GetResult(std::move(rv2));
724*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv2.net_error, IsOk());
725*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(rv2.backend);
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,CreateBackendPostCleanup)728*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, CreateBackendPostCleanup) {
729*6777b538SAndroid Build Coastguard Worker   // Test for the explicit PostCleanupCallback parameter to CreateCacheBackend.
730*6777b538SAndroid Build Coastguard Worker 
731*6777b538SAndroid Build Coastguard Worker   // Extravagant size payload to make reproducing races easier.
732*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 256 * 1024;
733*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
734*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
735*6777b538SAndroid Build Coastguard Worker 
736*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
737*6777b538SAndroid Build Coastguard Worker   CleanupCacheDir();
738*6777b538SAndroid Build Coastguard Worker 
739*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
740*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
741*6777b538SAndroid Build Coastguard Worker 
742*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
743*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
744*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
745*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, run_loop.QuitClosure(), cb.callback());
746*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
747*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsOk());
748*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
749*6777b538SAndroid Build Coastguard Worker 
750*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb2;
751*6777b538SAndroid Build Coastguard Worker   EntryResult result =
752*6777b538SAndroid Build Coastguard Worker       rv.backend->CreateEntry("key", net::HIGHEST, cb2.callback());
753*6777b538SAndroid Build Coastguard Worker   result = cb2.GetResult(std::move(result));
754*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, result.net_error());
755*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = result.ReleaseEntry();
756*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
757*6777b538SAndroid Build Coastguard Worker   entry->Close();
758*6777b538SAndroid Build Coastguard Worker 
759*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
760*6777b538SAndroid Build Coastguard Worker 
761*6777b538SAndroid Build Coastguard Worker   // Wait till the post-cleanup callback.
762*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
763*6777b538SAndroid Build Coastguard Worker 
764*6777b538SAndroid Build Coastguard Worker   // All of the payload should be on disk, despite stream 0 being written
765*6777b538SAndroid Build Coastguard Worker   // back in the async Close()
766*6777b538SAndroid Build Coastguard Worker   base::FilePath entry_path = cache_path_.AppendASCII(
767*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::GetFilenameFromKeyAndFileIndex("key", 0));
768*6777b538SAndroid Build Coastguard Worker   int64_t size = 0;
769*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::GetFileSize(entry_path, &size));
770*6777b538SAndroid Build Coastguard Worker   EXPECT_GT(size, kBufSize);
771*6777b538SAndroid Build Coastguard Worker }
772*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCreateBackendRecoveryAppCache)773*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCreateBackendRecoveryAppCache) {
774*6777b538SAndroid Build Coastguard Worker   // Tests index recovery in APP_CACHE mode. (This is harder to test for
775*6777b538SAndroid Build Coastguard Worker   // DISK_CACHE since post-cleanup callbacks aren't permitted there).
776*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 4 * 1024;
777*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
778*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
779*6777b538SAndroid Build Coastguard Worker 
780*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
781*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
782*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
783*6777b538SAndroid Build Coastguard Worker   CleanupCacheDir();
784*6777b538SAndroid Build Coastguard Worker 
785*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
786*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
787*6777b538SAndroid Build Coastguard Worker 
788*6777b538SAndroid Build Coastguard Worker   // Create a backend with post-cleanup callback specified, in order to know
789*6777b538SAndroid Build Coastguard Worker   // when the index has been written back (so it can be deleted race-free).
790*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
791*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
792*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
793*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, run_loop.QuitClosure(), cb.callback());
794*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
795*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsOk());
796*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
797*6777b538SAndroid Build Coastguard Worker 
798*6777b538SAndroid Build Coastguard Worker   // Create an entry.
799*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb2;
800*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result =
801*6777b538SAndroid Build Coastguard Worker       rv.backend->CreateEntry("key", net::HIGHEST, cb2.callback());
802*6777b538SAndroid Build Coastguard Worker   result = cb2.GetResult(std::move(result));
803*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, result.net_error());
804*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = result.ReleaseEntry();
805*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
806*6777b538SAndroid Build Coastguard Worker   entry->Close();
807*6777b538SAndroid Build Coastguard Worker 
808*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
809*6777b538SAndroid Build Coastguard Worker 
810*6777b538SAndroid Build Coastguard Worker   // Wait till the post-cleanup callback.
811*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
812*6777b538SAndroid Build Coastguard Worker 
813*6777b538SAndroid Build Coastguard Worker   // Delete the index.
814*6777b538SAndroid Build Coastguard Worker   base::DeleteFile(
815*6777b538SAndroid Build Coastguard Worker       cache_path_.AppendASCII("index-dir").AppendASCII("the-real-index"));
816*6777b538SAndroid Build Coastguard Worker 
817*6777b538SAndroid Build Coastguard Worker   // Open the cache again. The fixture will also waits for index init.
818*6777b538SAndroid Build Coastguard Worker   InitCache();
819*6777b538SAndroid Build Coastguard Worker 
820*6777b538SAndroid Build Coastguard Worker   // Entry should not have a trailer size, since can't tell what it should be
821*6777b538SAndroid Build Coastguard Worker   // when doing recovery (and definitely shouldn't interpret last use time as
822*6777b538SAndroid Build Coastguard Worker   // such).
823*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, simple_cache_impl_->index()->GetTrailerPrefetchSize(
824*6777b538SAndroid Build Coastguard Worker                    disk_cache::simple_util::GetEntryHashKey("key")));
825*6777b538SAndroid Build Coastguard Worker }
826*6777b538SAndroid Build Coastguard Worker 
827*6777b538SAndroid Build Coastguard Worker // Tests that |BackendImpl| fails to initialize with a missing file.
TEST_F(DiskCacheBackendTest,CreateBackend_MissingFile)828*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) {
829*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_entry"));
830*6777b538SAndroid Build Coastguard Worker   base::FilePath filename = cache_path_.AppendASCII("data_1");
831*6777b538SAndroid Build Coastguard Worker   base::DeleteFile(filename);
832*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
833*6777b538SAndroid Build Coastguard Worker 
834*6777b538SAndroid Build Coastguard Worker   // Blocking shouldn't be needed to create the cache.
835*6777b538SAndroid Build Coastguard Worker   std::optional<base::ScopedDisallowBlocking> disallow_blocking(std::in_place);
836*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache(
837*6777b538SAndroid Build Coastguard Worker       std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
838*6777b538SAndroid Build Coastguard Worker                                                 net::DISK_CACHE, nullptr));
839*6777b538SAndroid Build Coastguard Worker   cache->Init(cb.callback());
840*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(cb.WaitForResult(), IsError(net::ERR_FAILED));
841*6777b538SAndroid Build Coastguard Worker   disallow_blocking.reset();
842*6777b538SAndroid Build Coastguard Worker 
843*6777b538SAndroid Build Coastguard Worker   cache.reset();
844*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
845*6777b538SAndroid Build Coastguard Worker }
846*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryListensToMemoryPressure)847*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryListensToMemoryPressure) {
848*6777b538SAndroid Build Coastguard Worker   const int kLimit = 16 * 1024;
849*6777b538SAndroid Build Coastguard Worker   const int kEntrySize = 256;
850*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kLimit);
851*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
852*6777b538SAndroid Build Coastguard Worker   InitCache();
853*6777b538SAndroid Build Coastguard Worker 
854*6777b538SAndroid Build Coastguard Worker   // Fill in to about 80-90% full.
855*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kEntrySize);
856*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kEntrySize, false);
857*6777b538SAndroid Build Coastguard Worker 
858*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 0.9 * (kLimit / kEntrySize); ++i) {
859*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry = nullptr;
860*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(net::OK, CreateEntry(base::NumberToString(i), &entry));
861*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kEntrySize,
862*6777b538SAndroid Build Coastguard Worker               WriteData(entry, 0, 0, buffer.get(), kEntrySize, true));
863*6777b538SAndroid Build Coastguard Worker     entry->Close();
864*6777b538SAndroid Build Coastguard Worker   }
865*6777b538SAndroid Build Coastguard Worker 
866*6777b538SAndroid Build Coastguard Worker   EXPECT_GT(CalculateSizeOfAllEntries(), 0.8 * kLimit);
867*6777b538SAndroid Build Coastguard Worker 
868*6777b538SAndroid Build Coastguard Worker   // Signal low-memory of various sorts, and see how small it gets.
869*6777b538SAndroid Build Coastguard Worker   base::MemoryPressureListener::NotifyMemoryPressure(
870*6777b538SAndroid Build Coastguard Worker       base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
871*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
872*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(CalculateSizeOfAllEntries(), 0.5 * kLimit);
873*6777b538SAndroid Build Coastguard Worker 
874*6777b538SAndroid Build Coastguard Worker   base::MemoryPressureListener::NotifyMemoryPressure(
875*6777b538SAndroid Build Coastguard Worker       base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
876*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
877*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(CalculateSizeOfAllEntries(), 0.1 * kLimit);
878*6777b538SAndroid Build Coastguard Worker }
879*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ExternalFiles)880*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ExternalFiles) {
881*6777b538SAndroid Build Coastguard Worker   InitCache();
882*6777b538SAndroid Build Coastguard Worker   // First, let's create a file on the folder.
883*6777b538SAndroid Build Coastguard Worker   base::FilePath filename = cache_path_.AppendASCII("f_000001");
884*6777b538SAndroid Build Coastguard Worker 
885*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
886*6777b538SAndroid Build Coastguard Worker   auto buffer1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
887*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer1->data(), kSize, false);
888*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::WriteFile(
889*6777b538SAndroid Build Coastguard Worker       filename, std::string_view(buffer1->data(), static_cast<size_t>(kSize))));
890*6777b538SAndroid Build Coastguard Worker 
891*6777b538SAndroid Build Coastguard Worker   // Now let's create a file with the cache.
892*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
893*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
894*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1.get(), 0, false));
895*6777b538SAndroid Build Coastguard Worker   entry->Close();
896*6777b538SAndroid Build Coastguard Worker 
897*6777b538SAndroid Build Coastguard Worker   // And verify that the first file is still there.
898*6777b538SAndroid Build Coastguard Worker   auto buffer2(base::MakeRefCounted<net::IOBufferWithSize>(kSize));
899*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, base::ReadFile(filename, buffer2->data(), kSize));
900*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize));
901*6777b538SAndroid Build Coastguard Worker }
902*6777b538SAndroid Build Coastguard Worker 
903*6777b538SAndroid Build Coastguard Worker // Tests that we deal with file-level pending operations at destruction time.
BackendShutdownWithPendingFileIO(bool fast)904*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) {
905*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CleanupCacheDir());
906*6777b538SAndroid Build Coastguard Worker   uint32_t flags = disk_cache::kNoBuffering;
907*6777b538SAndroid Build Coastguard Worker   if (!fast)
908*6777b538SAndroid Build Coastguard Worker     flags |= disk_cache::kNoRandom;
909*6777b538SAndroid Build Coastguard Worker 
910*6777b538SAndroid Build Coastguard Worker   if (!simple_cache_mode_)
911*6777b538SAndroid Build Coastguard Worker     UseCurrentThread();
912*6777b538SAndroid Build Coastguard Worker   CreateBackend(flags);
913*6777b538SAndroid Build Coastguard Worker 
914*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
915*6777b538SAndroid Build Coastguard Worker   int rv = GeneratePendingIO(&cb);
916*6777b538SAndroid Build Coastguard Worker 
917*6777b538SAndroid Build Coastguard Worker   // The cache destructor will see one pending operation here.
918*6777b538SAndroid Build Coastguard Worker   ResetCaches();
919*6777b538SAndroid Build Coastguard Worker 
920*6777b538SAndroid Build Coastguard Worker   if (rv == net::ERR_IO_PENDING) {
921*6777b538SAndroid Build Coastguard Worker     if (fast || simple_cache_mode_)
922*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(cb.have_result());
923*6777b538SAndroid Build Coastguard Worker     else
924*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(cb.have_result());
925*6777b538SAndroid Build Coastguard Worker   }
926*6777b538SAndroid Build Coastguard Worker 
927*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
928*6777b538SAndroid Build Coastguard Worker 
929*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)
930*6777b538SAndroid Build Coastguard Worker   // Wait for the actual operation to complete, or we'll keep a file handle that
931*6777b538SAndroid Build Coastguard Worker   // may cause issues later. Note that on iOS systems even though this test
932*6777b538SAndroid Build Coastguard Worker   // uses a single thread, the actual IO is posted to a worker thread and the
933*6777b538SAndroid Build Coastguard Worker   // cache destructor breaks the link to reach cb when the operation completes.
934*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(rv);
935*6777b538SAndroid Build Coastguard Worker #endif
936*6777b538SAndroid Build Coastguard Worker }
937*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShutdownWithPendingFileIO)938*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) {
939*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingFileIO(false);
940*6777b538SAndroid Build Coastguard Worker }
941*6777b538SAndroid Build Coastguard Worker 
942*6777b538SAndroid Build Coastguard Worker // Here and below, tests that simulate crashes are not compiled in LeakSanitizer
943*6777b538SAndroid Build Coastguard Worker // builds because they contain a lot of intentional memory leaks.
944*6777b538SAndroid Build Coastguard Worker #if !defined(LEAK_SANITIZER)
945*6777b538SAndroid Build Coastguard Worker // We'll be leaking from this test.
TEST_F(DiskCacheBackendTest,ShutdownWithPendingFileIO_Fast)946*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) {
947*6777b538SAndroid Build Coastguard Worker   // The integrity test sets kNoRandom so there's a version mismatch if we don't
948*6777b538SAndroid Build Coastguard Worker   // force new eviction.
949*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
950*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingFileIO(true);
951*6777b538SAndroid Build Coastguard Worker }
952*6777b538SAndroid Build Coastguard Worker #endif
953*6777b538SAndroid Build Coastguard Worker 
954*6777b538SAndroid Build Coastguard Worker // See crbug.com/330074
955*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)
956*6777b538SAndroid Build Coastguard Worker // Tests that one cache instance is not affected by another one going away.
TEST_F(DiskCacheBackendTest,MultipleInstancesWithPendingFileIO)957*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MultipleInstancesWithPendingFileIO) {
958*6777b538SAndroid Build Coastguard Worker   base::ScopedTempDir store;
959*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(store.CreateUniqueTempDir());
960*6777b538SAndroid Build Coastguard Worker 
961*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
962*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback create_cb;
963*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult backend_rv = disk_cache::CreateCacheBackend(
964*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
965*6777b538SAndroid Build Coastguard Worker       store.GetPath(), 0, disk_cache::ResetHandling::kNeverReset,
966*6777b538SAndroid Build Coastguard Worker       /* net_log = */ nullptr, create_cb.callback());
967*6777b538SAndroid Build Coastguard Worker   backend_rv = create_cb.GetResult(std::move(backend_rv));
968*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(backend_rv.net_error, IsOk());
969*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(backend_rv.backend);
970*6777b538SAndroid Build Coastguard Worker 
971*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CleanupCacheDir());
972*6777b538SAndroid Build Coastguard Worker   SetNewEviction();  // Match the expected behavior for integrity verification.
973*6777b538SAndroid Build Coastguard Worker   UseCurrentThread();
974*6777b538SAndroid Build Coastguard Worker 
975*6777b538SAndroid Build Coastguard Worker   CreateBackend(disk_cache::kNoBuffering);
976*6777b538SAndroid Build Coastguard Worker   int rv = GeneratePendingIO(&cb);
977*6777b538SAndroid Build Coastguard Worker 
978*6777b538SAndroid Build Coastguard Worker   // cache_ has a pending operation, and backend_rv.backend will go away.
979*6777b538SAndroid Build Coastguard Worker   backend_rv.backend.reset();
980*6777b538SAndroid Build Coastguard Worker 
981*6777b538SAndroid Build Coastguard Worker   if (rv == net::ERR_IO_PENDING)
982*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(cb.have_result());
983*6777b538SAndroid Build Coastguard Worker 
984*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
985*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
986*6777b538SAndroid Build Coastguard Worker 
987*6777b538SAndroid Build Coastguard Worker   // Wait for the actual operation to complete, or we'll keep a file handle that
988*6777b538SAndroid Build Coastguard Worker   // may cause issues later.
989*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(rv);
990*6777b538SAndroid Build Coastguard Worker }
991*6777b538SAndroid Build Coastguard Worker #endif
992*6777b538SAndroid Build Coastguard Worker 
993*6777b538SAndroid Build Coastguard Worker // Tests that we deal with background-thread pending operations.
BackendShutdownWithPendingIO(bool fast)994*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) {
995*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb;
996*6777b538SAndroid Build Coastguard Worker 
997*6777b538SAndroid Build Coastguard Worker   {
998*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(CleanupCacheDir());
999*6777b538SAndroid Build Coastguard Worker 
1000*6777b538SAndroid Build Coastguard Worker     uint32_t flags = disk_cache::kNoBuffering;
1001*6777b538SAndroid Build Coastguard Worker     if (!fast)
1002*6777b538SAndroid Build Coastguard Worker       flags |= disk_cache::kNoRandom;
1003*6777b538SAndroid Build Coastguard Worker 
1004*6777b538SAndroid Build Coastguard Worker     CreateBackend(flags);
1005*6777b538SAndroid Build Coastguard Worker 
1006*6777b538SAndroid Build Coastguard Worker     EntryResult result =
1007*6777b538SAndroid Build Coastguard Worker         cache_->CreateEntry("some key", net::HIGHEST, cb.callback());
1008*6777b538SAndroid Build Coastguard Worker     result = cb.GetResult(std::move(result));
1009*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(result.net_error(), IsOk());
1010*6777b538SAndroid Build Coastguard Worker 
1011*6777b538SAndroid Build Coastguard Worker     result.ReleaseEntry()->Close();
1012*6777b538SAndroid Build Coastguard Worker 
1013*6777b538SAndroid Build Coastguard Worker     // The cache destructor will see one pending operation here.
1014*6777b538SAndroid Build Coastguard Worker     ResetCaches();
1015*6777b538SAndroid Build Coastguard Worker   }
1016*6777b538SAndroid Build Coastguard Worker 
1017*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
1018*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.have_result());
1019*6777b538SAndroid Build Coastguard Worker }
1020*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShutdownWithPendingIO)1021*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO) {
1022*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingIO(false);
1023*6777b538SAndroid Build Coastguard Worker }
1024*6777b538SAndroid Build Coastguard Worker 
1025*6777b538SAndroid Build Coastguard Worker #if !defined(LEAK_SANITIZER)
1026*6777b538SAndroid Build Coastguard Worker // We'll be leaking from this test.
TEST_F(DiskCacheBackendTest,ShutdownWithPendingIO_Fast)1027*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO_Fast) {
1028*6777b538SAndroid Build Coastguard Worker   // The integrity test sets kNoRandom so there's a version mismatch if we don't
1029*6777b538SAndroid Build Coastguard Worker   // force new eviction.
1030*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1031*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingIO(true);
1032*6777b538SAndroid Build Coastguard Worker }
1033*6777b538SAndroid Build Coastguard Worker #endif
1034*6777b538SAndroid Build Coastguard Worker 
1035*6777b538SAndroid Build Coastguard Worker // Tests that we deal with create-type pending operations.
BackendShutdownWithPendingCreate(bool fast)1036*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) {
1037*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb;
1038*6777b538SAndroid Build Coastguard Worker 
1039*6777b538SAndroid Build Coastguard Worker   {
1040*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(CleanupCacheDir());
1041*6777b538SAndroid Build Coastguard Worker 
1042*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendFlags flags =
1043*6777b538SAndroid Build Coastguard Worker         fast ? disk_cache::kNone : disk_cache::kNoRandom;
1044*6777b538SAndroid Build Coastguard Worker     CreateBackend(flags);
1045*6777b538SAndroid Build Coastguard Worker 
1046*6777b538SAndroid Build Coastguard Worker     EntryResult result =
1047*6777b538SAndroid Build Coastguard Worker         cache_->CreateEntry("some key", net::HIGHEST, cb.callback());
1048*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(result.net_error(), IsError(net::ERR_IO_PENDING));
1049*6777b538SAndroid Build Coastguard Worker 
1050*6777b538SAndroid Build Coastguard Worker     ResetCaches();
1051*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(cb.have_result());
1052*6777b538SAndroid Build Coastguard Worker   }
1053*6777b538SAndroid Build Coastguard Worker 
1054*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
1055*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.have_result());
1056*6777b538SAndroid Build Coastguard Worker }
1057*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShutdownWithPendingCreate)1058*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate) {
1059*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingCreate(false);
1060*6777b538SAndroid Build Coastguard Worker }
1061*6777b538SAndroid Build Coastguard Worker 
1062*6777b538SAndroid Build Coastguard Worker #if !defined(LEAK_SANITIZER)
1063*6777b538SAndroid Build Coastguard Worker // We'll be leaking an entry from this test.
TEST_F(DiskCacheBackendTest,ShutdownWithPendingCreate_Fast)1064*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate_Fast) {
1065*6777b538SAndroid Build Coastguard Worker   // The integrity test sets kNoRandom so there's a version mismatch if we don't
1066*6777b538SAndroid Build Coastguard Worker   // force new eviction.
1067*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1068*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingCreate(true);
1069*6777b538SAndroid Build Coastguard Worker }
1070*6777b538SAndroid Build Coastguard Worker #endif
1071*6777b538SAndroid Build Coastguard Worker 
BackendShutdownWithPendingDoom()1072*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendShutdownWithPendingDoom() {
1073*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
1074*6777b538SAndroid Build Coastguard Worker   {
1075*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(CleanupCacheDir());
1076*6777b538SAndroid Build Coastguard Worker 
1077*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendFlags flags = disk_cache::kNoRandom;
1078*6777b538SAndroid Build Coastguard Worker     CreateBackend(flags);
1079*6777b538SAndroid Build Coastguard Worker 
1080*6777b538SAndroid Build Coastguard Worker     TestEntryResultCompletionCallback cb2;
1081*6777b538SAndroid Build Coastguard Worker     EntryResult result =
1082*6777b538SAndroid Build Coastguard Worker         cache_->CreateEntry("some key", net::HIGHEST, cb2.callback());
1083*6777b538SAndroid Build Coastguard Worker     result = cb2.GetResult(std::move(result));
1084*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(result.net_error(), IsOk());
1085*6777b538SAndroid Build Coastguard Worker     result.ReleaseEntry()->Close();
1086*6777b538SAndroid Build Coastguard Worker 
1087*6777b538SAndroid Build Coastguard Worker     int rv = cache_->DoomEntry("some key", net::HIGHEST, cb.callback());
1088*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(rv, IsError(net::ERR_IO_PENDING));
1089*6777b538SAndroid Build Coastguard Worker 
1090*6777b538SAndroid Build Coastguard Worker     ResetCaches();
1091*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(cb.have_result());
1092*6777b538SAndroid Build Coastguard Worker   }
1093*6777b538SAndroid Build Coastguard Worker 
1094*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
1095*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.have_result());
1096*6777b538SAndroid Build Coastguard Worker }
1097*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShutdownWithPendingDoom)1098*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShutdownWithPendingDoom) {
1099*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingDoom();
1100*6777b538SAndroid Build Coastguard Worker }
1101*6777b538SAndroid Build Coastguard Worker 
1102*6777b538SAndroid Build Coastguard Worker // Disabled on android since this test requires cache creator to create
1103*6777b538SAndroid Build Coastguard Worker // blockfile caches.
1104*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
TEST_F(DiskCacheTest,TruncatedIndex)1105*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, TruncatedIndex) {
1106*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CleanupCacheDir());
1107*6777b538SAndroid Build Coastguard Worker   base::FilePath index = cache_path_.AppendASCII("index");
1108*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::WriteFile(index, "hello"));
1109*6777b538SAndroid Build Coastguard Worker 
1110*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
1111*6777b538SAndroid Build Coastguard Worker 
1112*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
1113*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
1114*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, cache_path_, 0,
1115*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
1116*6777b538SAndroid Build Coastguard Worker       cb.callback());
1117*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
1118*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(net::OK, rv.net_error);
1119*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(rv.backend);
1120*6777b538SAndroid Build Coastguard Worker }
1121*6777b538SAndroid Build Coastguard Worker #endif
1122*6777b538SAndroid Build Coastguard Worker 
BackendSetSize()1123*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendSetSize() {
1124*6777b538SAndroid Build Coastguard Worker   const int cache_size = 0x10000;  // 64 kB
1125*6777b538SAndroid Build Coastguard Worker   SetMaxSize(cache_size);
1126*6777b538SAndroid Build Coastguard Worker   InitCache();
1127*6777b538SAndroid Build Coastguard Worker 
1128*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
1129*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
1130*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1131*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
1132*6777b538SAndroid Build Coastguard Worker 
1133*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(cache_size);
1134*6777b538SAndroid Build Coastguard Worker   memset(buffer->data(), 0, cache_size);
1135*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size / 10,
1136*6777b538SAndroid Build Coastguard Worker             WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false))
1137*6777b538SAndroid Build Coastguard Worker       << "normal file";
1138*6777b538SAndroid Build Coastguard Worker 
1139*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_FAILED,
1140*6777b538SAndroid Build Coastguard Worker             WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false))
1141*6777b538SAndroid Build Coastguard Worker       << "file size above the limit";
1142*6777b538SAndroid Build Coastguard Worker 
1143*6777b538SAndroid Build Coastguard Worker   // By doubling the total size, we make this file cacheable.
1144*6777b538SAndroid Build Coastguard Worker   SetMaxSize(cache_size * 2);
1145*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size / 5,
1146*6777b538SAndroid Build Coastguard Worker             WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false));
1147*6777b538SAndroid Build Coastguard Worker 
1148*6777b538SAndroid Build Coastguard Worker   // Let's fill up the cache!.
1149*6777b538SAndroid Build Coastguard Worker   SetMaxSize(cache_size * 10);
1150*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size * 3 / 4,
1151*6777b538SAndroid Build Coastguard Worker             WriteData(entry, 0, 0, buffer.get(), cache_size * 3 / 4, false));
1152*6777b538SAndroid Build Coastguard Worker   entry->Close();
1153*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1154*6777b538SAndroid Build Coastguard Worker 
1155*6777b538SAndroid Build Coastguard Worker   SetMaxSize(cache_size);
1156*6777b538SAndroid Build Coastguard Worker 
1157*6777b538SAndroid Build Coastguard Worker   // The cache is 95% full.
1158*6777b538SAndroid Build Coastguard Worker 
1159*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
1160*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size / 10,
1161*6777b538SAndroid Build Coastguard Worker             WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false));
1162*6777b538SAndroid Build Coastguard Worker 
1163*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2;
1164*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("an extra key", &entry2), IsOk());
1165*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size / 10,
1166*6777b538SAndroid Build Coastguard Worker             WriteData(entry2, 0, 0, buffer.get(), cache_size / 10, false));
1167*6777b538SAndroid Build Coastguard Worker   entry2->Close();  // This will trigger the cache trim.
1168*6777b538SAndroid Build Coastguard Worker 
1169*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry(first, &entry2));
1170*6777b538SAndroid Build Coastguard Worker 
1171*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // Make sure that we are done trimming the cache.
1172*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // We may have posted two tasks to evict stuff.
1173*6777b538SAndroid Build Coastguard Worker 
1174*6777b538SAndroid Build Coastguard Worker   entry->Close();
1175*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(second, &entry), IsOk());
1176*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cache_size / 10, entry->GetDataSize(0));
1177*6777b538SAndroid Build Coastguard Worker   entry->Close();
1178*6777b538SAndroid Build Coastguard Worker }
1179*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SetSize)1180*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SetSize) {
1181*6777b538SAndroid Build Coastguard Worker   BackendSetSize();
1182*6777b538SAndroid Build Coastguard Worker }
1183*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionSetSize)1184*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionSetSize) {
1185*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1186*6777b538SAndroid Build Coastguard Worker   BackendSetSize();
1187*6777b538SAndroid Build Coastguard Worker }
1188*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlySetSize)1189*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) {
1190*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
1191*6777b538SAndroid Build Coastguard Worker   BackendSetSize();
1192*6777b538SAndroid Build Coastguard Worker }
1193*6777b538SAndroid Build Coastguard Worker 
BackendLoad()1194*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendLoad() {
1195*6777b538SAndroid Build Coastguard Worker   InitCache();
1196*6777b538SAndroid Build Coastguard Worker   int seed = static_cast<int>(Time::Now().ToInternalValue());
1197*6777b538SAndroid Build Coastguard Worker   srand(seed);
1198*6777b538SAndroid Build Coastguard Worker 
1199*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entries[kLargeNumEntries];
1200*6777b538SAndroid Build Coastguard Worker   for (auto*& entry : entries) {
1201*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
1202*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1203*6777b538SAndroid Build Coastguard Worker   }
1204*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kLargeNumEntries, cache_->GetEntryCount());
1205*6777b538SAndroid Build Coastguard Worker 
1206*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kLargeNumEntries; i++) {
1207*6777b538SAndroid Build Coastguard Worker     int source1 = rand() % kLargeNumEntries;
1208*6777b538SAndroid Build Coastguard Worker     int source2 = rand() % kLargeNumEntries;
1209*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* temp = entries[source1];
1210*6777b538SAndroid Build Coastguard Worker     entries[source1] = entries[source2];
1211*6777b538SAndroid Build Coastguard Worker     entries[source2] = temp;
1212*6777b538SAndroid Build Coastguard Worker   }
1213*6777b538SAndroid Build Coastguard Worker 
1214*6777b538SAndroid Build Coastguard Worker   for (auto* entry : entries) {
1215*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* new_entry;
1216*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(entry->GetKey(), &new_entry), IsOk());
1217*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(new_entry == entry);
1218*6777b538SAndroid Build Coastguard Worker     new_entry->Close();
1219*6777b538SAndroid Build Coastguard Worker     entry->Doom();
1220*6777b538SAndroid Build Coastguard Worker     entry->Close();
1221*6777b538SAndroid Build Coastguard Worker   }
1222*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1223*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
1224*6777b538SAndroid Build Coastguard Worker }
1225*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Load)1226*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Load) {
1227*6777b538SAndroid Build Coastguard Worker   // Work with a tiny index table (16 entries)
1228*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
1229*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1230*6777b538SAndroid Build Coastguard Worker   BackendLoad();
1231*6777b538SAndroid Build Coastguard Worker }
1232*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionLoad)1233*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionLoad) {
1234*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1235*6777b538SAndroid Build Coastguard Worker   // Work with a tiny index table (16 entries)
1236*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
1237*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1238*6777b538SAndroid Build Coastguard Worker   BackendLoad();
1239*6777b538SAndroid Build Coastguard Worker }
1240*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyLoad)1241*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyLoad) {
1242*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1243*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
1244*6777b538SAndroid Build Coastguard Worker   BackendLoad();
1245*6777b538SAndroid Build Coastguard Worker }
1246*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheLoad)1247*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheLoad) {
1248*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1249*6777b538SAndroid Build Coastguard Worker   // Work with a tiny index table (16 entries)
1250*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
1251*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1252*6777b538SAndroid Build Coastguard Worker   BackendLoad();
1253*6777b538SAndroid Build Coastguard Worker }
1254*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheLoad)1255*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheLoad) {
1256*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1257*6777b538SAndroid Build Coastguard Worker   // Work with a tiny index table (16 entries)
1258*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
1259*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1260*6777b538SAndroid Build Coastguard Worker   BackendLoad();
1261*6777b538SAndroid Build Coastguard Worker }
1262*6777b538SAndroid Build Coastguard Worker 
1263*6777b538SAndroid Build Coastguard Worker // Tests the chaining of an entry to the current head.
BackendChain()1264*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendChain() {
1265*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
1266*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
1267*6777b538SAndroid Build Coastguard Worker   InitCache();
1268*6777b538SAndroid Build Coastguard Worker 
1269*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1270*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("The first key", &entry), IsOk());
1271*6777b538SAndroid Build Coastguard Worker   entry->Close();
1272*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("The Second key", &entry), IsOk());
1273*6777b538SAndroid Build Coastguard Worker   entry->Close();
1274*6777b538SAndroid Build Coastguard Worker }
1275*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Chain)1276*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Chain) {
1277*6777b538SAndroid Build Coastguard Worker   BackendChain();
1278*6777b538SAndroid Build Coastguard Worker }
1279*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionChain)1280*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionChain) {
1281*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1282*6777b538SAndroid Build Coastguard Worker   BackendChain();
1283*6777b538SAndroid Build Coastguard Worker }
1284*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheChain)1285*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheChain) {
1286*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1287*6777b538SAndroid Build Coastguard Worker   BackendChain();
1288*6777b538SAndroid Build Coastguard Worker }
1289*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheChain)1290*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheChain) {
1291*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1292*6777b538SAndroid Build Coastguard Worker   BackendChain();
1293*6777b538SAndroid Build Coastguard Worker }
1294*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionTrim)1295*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionTrim) {
1296*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1297*6777b538SAndroid Build Coastguard Worker   InitCache();
1298*6777b538SAndroid Build Coastguard Worker 
1299*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1300*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 100; i++) {
1301*6777b538SAndroid Build Coastguard Worker     std::string name(base::StringPrintf("Key %d", i));
1302*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(name, &entry), IsOk());
1303*6777b538SAndroid Build Coastguard Worker     entry->Close();
1304*6777b538SAndroid Build Coastguard Worker     if (i < 90) {
1305*6777b538SAndroid Build Coastguard Worker       // Entries 0 to 89 are in list 1; 90 to 99 are in list 0.
1306*6777b538SAndroid Build Coastguard Worker       ASSERT_THAT(OpenEntry(name, &entry), IsOk());
1307*6777b538SAndroid Build Coastguard Worker       entry->Close();
1308*6777b538SAndroid Build Coastguard Worker     }
1309*6777b538SAndroid Build Coastguard Worker   }
1310*6777b538SAndroid Build Coastguard Worker 
1311*6777b538SAndroid Build Coastguard Worker   // The first eviction must come from list 1 (10% limit), the second must come
1312*6777b538SAndroid Build Coastguard Worker   // from list 0.
1313*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
1314*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("Key 0", &entry));
1315*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
1316*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("Key 90", &entry));
1317*6777b538SAndroid Build Coastguard Worker 
1318*6777b538SAndroid Build Coastguard Worker   // Double check that we still have the list tails.
1319*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("Key 1", &entry), IsOk());
1320*6777b538SAndroid Build Coastguard Worker   entry->Close();
1321*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("Key 91", &entry), IsOk());
1322*6777b538SAndroid Build Coastguard Worker   entry->Close();
1323*6777b538SAndroid Build Coastguard Worker }
1324*6777b538SAndroid Build Coastguard Worker 
1325*6777b538SAndroid Build Coastguard Worker // Before looking for invalid entries, let's check a valid entry.
BackendValidEntry()1326*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendValidEntry() {
1327*6777b538SAndroid Build Coastguard Worker   InitCache();
1328*6777b538SAndroid Build Coastguard Worker 
1329*6777b538SAndroid Build Coastguard Worker   std::string key("Some key");
1330*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1331*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1332*6777b538SAndroid Build Coastguard Worker 
1333*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
1334*6777b538SAndroid Build Coastguard Worker   auto buffer1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1335*6777b538SAndroid Build Coastguard Worker   memset(buffer1->data(), 0, kSize);
1336*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer1->data(), "And the data to save", kSize);
1337*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false));
1338*6777b538SAndroid Build Coastguard Worker   entry->Close();
1339*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1340*6777b538SAndroid Build Coastguard Worker 
1341*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
1342*6777b538SAndroid Build Coastguard Worker 
1343*6777b538SAndroid Build Coastguard Worker   auto buffer2 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1344*6777b538SAndroid Build Coastguard Worker   memset(buffer2->data(), 0, kSize);
1345*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2.get(), kSize));
1346*6777b538SAndroid Build Coastguard Worker   entry->Close();
1347*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(buffer1->data(), buffer2->data());
1348*6777b538SAndroid Build Coastguard Worker }
1349*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ValidEntry)1350*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ValidEntry) {
1351*6777b538SAndroid Build Coastguard Worker   BackendValidEntry();
1352*6777b538SAndroid Build Coastguard Worker }
1353*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionValidEntry)1354*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) {
1355*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1356*6777b538SAndroid Build Coastguard Worker   BackendValidEntry();
1357*6777b538SAndroid Build Coastguard Worker }
1358*6777b538SAndroid Build Coastguard Worker 
1359*6777b538SAndroid Build Coastguard Worker // The same logic of the previous test (ValidEntry), but this time force the
1360*6777b538SAndroid Build Coastguard Worker // entry to be invalid, simulating a crash in the middle.
1361*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendInvalidEntry()1362*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry() {
1363*6777b538SAndroid Build Coastguard Worker   InitCache();
1364*6777b538SAndroid Build Coastguard Worker 
1365*6777b538SAndroid Build Coastguard Worker   std::string key("Some key");
1366*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1367*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1368*6777b538SAndroid Build Coastguard Worker 
1369*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
1370*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1371*6777b538SAndroid Build Coastguard Worker   memset(buffer->data(), 0, kSize);
1372*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer->data(), "And the data to save", kSize);
1373*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1374*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1375*6777b538SAndroid Build Coastguard Worker 
1376*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry(key, &entry));
1377*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
1378*6777b538SAndroid Build Coastguard Worker }
1379*6777b538SAndroid Build Coastguard Worker 
1380*6777b538SAndroid Build Coastguard Worker #if !defined(LEAK_SANITIZER)
1381*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,InvalidEntry)1382*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry) {
1383*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry();
1384*6777b538SAndroid Build Coastguard Worker }
1385*6777b538SAndroid Build Coastguard Worker 
1386*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry)1387*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) {
1388*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1389*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry();
1390*6777b538SAndroid Build Coastguard Worker }
1391*6777b538SAndroid Build Coastguard Worker 
1392*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,AppCacheInvalidEntry)1393*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) {
1394*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1395*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry();
1396*6777b538SAndroid Build Coastguard Worker }
1397*6777b538SAndroid Build Coastguard Worker 
1398*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,ShaderCacheInvalidEntry)1399*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntry) {
1400*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1401*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry();
1402*6777b538SAndroid Build Coastguard Worker }
1403*6777b538SAndroid Build Coastguard Worker 
1404*6777b538SAndroid Build Coastguard Worker // Almost the same test, but this time crash the cache after reading an entry.
1405*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendInvalidEntryRead()1406*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntryRead() {
1407*6777b538SAndroid Build Coastguard Worker   InitCache();
1408*6777b538SAndroid Build Coastguard Worker 
1409*6777b538SAndroid Build Coastguard Worker   std::string key("Some key");
1410*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1411*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1412*6777b538SAndroid Build Coastguard Worker 
1413*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
1414*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1415*6777b538SAndroid Build Coastguard Worker   memset(buffer->data(), 0, kSize);
1416*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer->data(), "And the data to save", kSize);
1417*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1418*6777b538SAndroid Build Coastguard Worker   entry->Close();
1419*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
1420*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize));
1421*6777b538SAndroid Build Coastguard Worker 
1422*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1423*6777b538SAndroid Build Coastguard Worker 
1424*6777b538SAndroid Build Coastguard Worker   if (type_ == net::APP_CACHE) {
1425*6777b538SAndroid Build Coastguard Worker     // Reading an entry and crashing should not make it dirty.
1426*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(key, &entry), IsOk());
1427*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
1428*6777b538SAndroid Build Coastguard Worker     entry->Close();
1429*6777b538SAndroid Build Coastguard Worker   } else {
1430*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, OpenEntry(key, &entry));
1431*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, cache_->GetEntryCount());
1432*6777b538SAndroid Build Coastguard Worker   }
1433*6777b538SAndroid Build Coastguard Worker }
1434*6777b538SAndroid Build Coastguard Worker 
1435*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,InvalidEntryRead)1436*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntryRead) {
1437*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryRead();
1438*6777b538SAndroid Build Coastguard Worker }
1439*6777b538SAndroid Build Coastguard Worker 
1440*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntryRead)1441*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) {
1442*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1443*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryRead();
1444*6777b538SAndroid Build Coastguard Worker }
1445*6777b538SAndroid Build Coastguard Worker 
1446*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,AppCacheInvalidEntryRead)1447*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) {
1448*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1449*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryRead();
1450*6777b538SAndroid Build Coastguard Worker }
1451*6777b538SAndroid Build Coastguard Worker 
1452*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,ShaderCacheInvalidEntryRead)1453*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryRead) {
1454*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1455*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryRead();
1456*6777b538SAndroid Build Coastguard Worker }
1457*6777b538SAndroid Build Coastguard Worker 
1458*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendInvalidEntryWithLoad()1459*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntryWithLoad() {
1460*6777b538SAndroid Build Coastguard Worker   // Work with a tiny index table (16 entries)
1461*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
1462*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
1463*6777b538SAndroid Build Coastguard Worker   InitCache();
1464*6777b538SAndroid Build Coastguard Worker 
1465*6777b538SAndroid Build Coastguard Worker   int seed = static_cast<int>(Time::Now().ToInternalValue());
1466*6777b538SAndroid Build Coastguard Worker   srand(seed);
1467*6777b538SAndroid Build Coastguard Worker 
1468*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 100;
1469*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entries[kNumEntries];
1470*6777b538SAndroid Build Coastguard Worker   for (auto*& entry : entries) {
1471*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
1472*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1473*6777b538SAndroid Build Coastguard Worker   }
1474*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
1475*6777b538SAndroid Build Coastguard Worker 
1476*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; i++) {
1477*6777b538SAndroid Build Coastguard Worker     int source1 = rand() % kNumEntries;
1478*6777b538SAndroid Build Coastguard Worker     int source2 = rand() % kNumEntries;
1479*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* temp = entries[source1];
1480*6777b538SAndroid Build Coastguard Worker     entries[source1] = entries[source2];
1481*6777b538SAndroid Build Coastguard Worker     entries[source2] = temp;
1482*6777b538SAndroid Build Coastguard Worker   }
1483*6777b538SAndroid Build Coastguard Worker 
1484*6777b538SAndroid Build Coastguard Worker   std::string keys[kNumEntries];
1485*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; i++) {
1486*6777b538SAndroid Build Coastguard Worker     keys[i] = entries[i]->GetKey();
1487*6777b538SAndroid Build Coastguard Worker     if (i < kNumEntries / 2)
1488*6777b538SAndroid Build Coastguard Worker       entries[i]->Close();
1489*6777b538SAndroid Build Coastguard Worker   }
1490*6777b538SAndroid Build Coastguard Worker 
1491*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1492*6777b538SAndroid Build Coastguard Worker 
1493*6777b538SAndroid Build Coastguard Worker   for (int i = kNumEntries / 2; i < kNumEntries; i++) {
1494*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
1495*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, OpenEntry(keys[i], &entry));
1496*6777b538SAndroid Build Coastguard Worker   }
1497*6777b538SAndroid Build Coastguard Worker 
1498*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries / 2; i++) {
1499*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
1500*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(keys[i], &entry), IsOk());
1501*6777b538SAndroid Build Coastguard Worker     entry->Close();
1502*6777b538SAndroid Build Coastguard Worker   }
1503*6777b538SAndroid Build Coastguard Worker 
1504*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount());
1505*6777b538SAndroid Build Coastguard Worker }
1506*6777b538SAndroid Build Coastguard Worker 
1507*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,InvalidEntryWithLoad)1508*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) {
1509*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryWithLoad();
1510*6777b538SAndroid Build Coastguard Worker }
1511*6777b538SAndroid Build Coastguard Worker 
1512*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntryWithLoad)1513*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) {
1514*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1515*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryWithLoad();
1516*6777b538SAndroid Build Coastguard Worker }
1517*6777b538SAndroid Build Coastguard Worker 
1518*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,AppCacheInvalidEntryWithLoad)1519*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) {
1520*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1521*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryWithLoad();
1522*6777b538SAndroid Build Coastguard Worker }
1523*6777b538SAndroid Build Coastguard Worker 
1524*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,ShaderCacheInvalidEntryWithLoad)1525*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryWithLoad) {
1526*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1527*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryWithLoad();
1528*6777b538SAndroid Build Coastguard Worker }
1529*6777b538SAndroid Build Coastguard Worker 
1530*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendTrimInvalidEntry()1531*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendTrimInvalidEntry() {
1532*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB
1533*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
1534*6777b538SAndroid Build Coastguard Worker   InitCache();
1535*6777b538SAndroid Build Coastguard Worker 
1536*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
1537*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
1538*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1539*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
1540*6777b538SAndroid Build Coastguard Worker 
1541*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1542*6777b538SAndroid Build Coastguard Worker   memset(buffer->data(), 0, kSize);
1543*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1544*6777b538SAndroid Build Coastguard Worker 
1545*6777b538SAndroid Build Coastguard Worker   // Simulate a crash.
1546*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1547*6777b538SAndroid Build Coastguard Worker 
1548*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
1549*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1550*6777b538SAndroid Build Coastguard Worker 
1551*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
1552*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize);
1553*6777b538SAndroid Build Coastguard Worker   entry->Close();  // Trim the cache.
1554*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1555*6777b538SAndroid Build Coastguard Worker 
1556*6777b538SAndroid Build Coastguard Worker   // If we evicted the entry in less than 20mS, we have one entry in the cache;
1557*6777b538SAndroid Build Coastguard Worker   // if it took more than that, we posted a task and we'll delete the second
1558*6777b538SAndroid Build Coastguard Worker   // entry too.
1559*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
1560*6777b538SAndroid Build Coastguard Worker 
1561*6777b538SAndroid Build Coastguard Worker   // This may be not thread-safe in general, but for now it's OK so add some
1562*6777b538SAndroid Build Coastguard Worker   // ThreadSanitizer annotations to ignore data races on cache_.
1563*6777b538SAndroid Build Coastguard Worker   // See http://crbug.com/55970
1564*6777b538SAndroid Build Coastguard Worker   ABSL_ANNOTATE_IGNORE_READS_BEGIN();
1565*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(1, cache_->GetEntryCount());
1566*6777b538SAndroid Build Coastguard Worker   ABSL_ANNOTATE_IGNORE_READS_END();
1567*6777b538SAndroid Build Coastguard Worker 
1568*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry(first, &entry));
1569*6777b538SAndroid Build Coastguard Worker }
1570*6777b538SAndroid Build Coastguard Worker 
1571*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,TrimInvalidEntry)1572*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry) {
1573*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry();
1574*6777b538SAndroid Build Coastguard Worker }
1575*6777b538SAndroid Build Coastguard Worker 
1576*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionTrimInvalidEntry)1577*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) {
1578*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1579*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry();
1580*6777b538SAndroid Build Coastguard Worker }
1581*6777b538SAndroid Build Coastguard Worker 
1582*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendTrimInvalidEntry2()1583*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendTrimInvalidEntry2() {
1584*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);  // 16-entry table.
1585*6777b538SAndroid Build Coastguard Worker 
1586*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB
1587*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 40);
1588*6777b538SAndroid Build Coastguard Worker   InitCache();
1589*6777b538SAndroid Build Coastguard Worker 
1590*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1591*6777b538SAndroid Build Coastguard Worker   memset(buffer->data(), 0, kSize);
1592*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1593*6777b538SAndroid Build Coastguard Worker 
1594*6777b538SAndroid Build Coastguard Worker   // Writing 32 entries to this cache chains most of them.
1595*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 32; i++) {
1596*6777b538SAndroid Build Coastguard Worker     std::string key(base::StringPrintf("some key %d", i));
1597*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1598*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1599*6777b538SAndroid Build Coastguard Worker     entry->Close();
1600*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(key, &entry), IsOk());
1601*6777b538SAndroid Build Coastguard Worker     // Note that we are not closing the entries.
1602*6777b538SAndroid Build Coastguard Worker   }
1603*6777b538SAndroid Build Coastguard Worker 
1604*6777b538SAndroid Build Coastguard Worker   // Simulate a crash.
1605*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1606*6777b538SAndroid Build Coastguard Worker 
1607*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("Something else", &entry), IsOk());
1608*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
1609*6777b538SAndroid Build Coastguard Worker 
1610*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1611*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(33, cache_->GetEntryCount());
1612*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize);
1613*6777b538SAndroid Build Coastguard Worker 
1614*6777b538SAndroid Build Coastguard Worker   // For the new eviction code, all corrupt entries are on the second list so
1615*6777b538SAndroid Build Coastguard Worker   // they are not going away that easy.
1616*6777b538SAndroid Build Coastguard Worker   if (new_eviction_) {
1617*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(DoomAllEntries(), IsOk());
1618*6777b538SAndroid Build Coastguard Worker   }
1619*6777b538SAndroid Build Coastguard Worker 
1620*6777b538SAndroid Build Coastguard Worker   entry->Close();  // Trim the cache.
1621*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1622*6777b538SAndroid Build Coastguard Worker 
1623*6777b538SAndroid Build Coastguard Worker   // We may abort the eviction before cleaning up everything.
1624*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
1625*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1626*6777b538SAndroid Build Coastguard Worker   // If it's not clear enough: we may still have eviction tasks running at this
1627*6777b538SAndroid Build Coastguard Worker   // time, so the number of entries is changing while we read it.
1628*6777b538SAndroid Build Coastguard Worker   ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
1629*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(30, cache_->GetEntryCount());
1630*6777b538SAndroid Build Coastguard Worker   ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
1631*6777b538SAndroid Build Coastguard Worker 
1632*6777b538SAndroid Build Coastguard Worker   // For extra messiness, the integrity check for the cache can actually cause
1633*6777b538SAndroid Build Coastguard Worker   // evictions if it's over-capacity, which would race with above. So change the
1634*6777b538SAndroid Build Coastguard Worker   // size we pass to CheckCacheIntegrity (but don't mess with existing backend's
1635*6777b538SAndroid Build Coastguard Worker   // state.
1636*6777b538SAndroid Build Coastguard Worker   size_ = 0;
1637*6777b538SAndroid Build Coastguard Worker }
1638*6777b538SAndroid Build Coastguard Worker 
1639*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,TrimInvalidEntry2)1640*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) {
1641*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry2();
1642*6777b538SAndroid Build Coastguard Worker }
1643*6777b538SAndroid Build Coastguard Worker 
1644*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionTrimInvalidEntry2)1645*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) {
1646*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1647*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry2();
1648*6777b538SAndroid Build Coastguard Worker }
1649*6777b538SAndroid Build Coastguard Worker #endif  // !defined(LEAK_SANITIZER)
1650*6777b538SAndroid Build Coastguard Worker 
BackendEnumerations()1651*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendEnumerations() {
1652*6777b538SAndroid Build Coastguard Worker   InitCache();
1653*6777b538SAndroid Build Coastguard Worker   Time initial = Time::Now();
1654*6777b538SAndroid Build Coastguard Worker 
1655*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 100;
1656*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; i++) {
1657*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
1658*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
1659*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1660*6777b538SAndroid Build Coastguard Worker     entry->Close();
1661*6777b538SAndroid Build Coastguard Worker   }
1662*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
1663*6777b538SAndroid Build Coastguard Worker   Time final = Time::Now();
1664*6777b538SAndroid Build Coastguard Worker 
1665*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1666*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
1667*6777b538SAndroid Build Coastguard Worker   int count = 0;
1668*6777b538SAndroid Build Coastguard Worker   Time last_modified[kNumEntries];
1669*6777b538SAndroid Build Coastguard Worker   Time last_used[kNumEntries];
1670*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
1671*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry);
1672*6777b538SAndroid Build Coastguard Worker     if (count < kNumEntries) {
1673*6777b538SAndroid Build Coastguard Worker       last_modified[count] = entry->GetLastModified();
1674*6777b538SAndroid Build Coastguard Worker       last_used[count] = entry->GetLastUsed();
1675*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(initial <= last_modified[count]);
1676*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(final >= last_modified[count]);
1677*6777b538SAndroid Build Coastguard Worker     }
1678*6777b538SAndroid Build Coastguard Worker 
1679*6777b538SAndroid Build Coastguard Worker     entry->Close();
1680*6777b538SAndroid Build Coastguard Worker     count++;
1681*6777b538SAndroid Build Coastguard Worker   };
1682*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries, count);
1683*6777b538SAndroid Build Coastguard Worker 
1684*6777b538SAndroid Build Coastguard Worker   iter = CreateIterator();
1685*6777b538SAndroid Build Coastguard Worker   count = 0;
1686*6777b538SAndroid Build Coastguard Worker   // The previous enumeration should not have changed the timestamps.
1687*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
1688*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry);
1689*6777b538SAndroid Build Coastguard Worker     if (count < kNumEntries) {
1690*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(last_modified[count] == entry->GetLastModified());
1691*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(last_used[count] == entry->GetLastUsed());
1692*6777b538SAndroid Build Coastguard Worker     }
1693*6777b538SAndroid Build Coastguard Worker     entry->Close();
1694*6777b538SAndroid Build Coastguard Worker     count++;
1695*6777b538SAndroid Build Coastguard Worker   };
1696*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries, count);
1697*6777b538SAndroid Build Coastguard Worker }
1698*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Enumerations)1699*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Enumerations) {
1700*6777b538SAndroid Build Coastguard Worker   BackendEnumerations();
1701*6777b538SAndroid Build Coastguard Worker }
1702*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionEnumerations)1703*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) {
1704*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1705*6777b538SAndroid Build Coastguard Worker   BackendEnumerations();
1706*6777b538SAndroid Build Coastguard Worker }
1707*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyEnumerations)1708*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) {
1709*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
1710*6777b538SAndroid Build Coastguard Worker   BackendEnumerations();
1711*6777b538SAndroid Build Coastguard Worker }
1712*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheEnumerations)1713*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) {
1714*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1715*6777b538SAndroid Build Coastguard Worker   BackendEnumerations();
1716*6777b538SAndroid Build Coastguard Worker }
1717*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheEnumerations)1718*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheEnumerations) {
1719*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1720*6777b538SAndroid Build Coastguard Worker   BackendEnumerations();
1721*6777b538SAndroid Build Coastguard Worker }
1722*6777b538SAndroid Build Coastguard Worker 
1723*6777b538SAndroid Build Coastguard Worker // Verifies enumerations while entries are open.
BackendEnumerations2()1724*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendEnumerations2() {
1725*6777b538SAndroid Build Coastguard Worker   InitCache();
1726*6777b538SAndroid Build Coastguard Worker   const std::string first("first");
1727*6777b538SAndroid Build Coastguard Worker   const std::string second("second");
1728*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
1729*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry1), IsOk());
1730*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1731*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry2), IsOk());
1732*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1733*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1734*6777b538SAndroid Build Coastguard Worker 
1735*6777b538SAndroid Build Coastguard Worker   // Make sure that the timestamp is not the same.
1736*6777b538SAndroid Build Coastguard Worker   AddDelay();
1737*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(second, &entry1), IsOk());
1738*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
1739*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry2), IsOk());
1740*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entry2->GetKey(), second);
1741*6777b538SAndroid Build Coastguard Worker 
1742*6777b538SAndroid Build Coastguard Worker   // Two entries and the iterator pointing at "first".
1743*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1744*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1745*6777b538SAndroid Build Coastguard Worker 
1746*6777b538SAndroid Build Coastguard Worker   // The iterator should still be valid, so we should not crash.
1747*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry2), IsOk());
1748*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entry2->GetKey(), first);
1749*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1750*6777b538SAndroid Build Coastguard Worker   iter = CreateIterator();
1751*6777b538SAndroid Build Coastguard Worker 
1752*6777b538SAndroid Build Coastguard Worker   // Modify the oldest entry and get the newest element.
1753*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(first, &entry1), IsOk());
1754*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, WriteData(entry1, 0, 200, nullptr, 0, false));
1755*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry2), IsOk());
1756*6777b538SAndroid Build Coastguard Worker   if (type_ == net::APP_CACHE) {
1757*6777b538SAndroid Build Coastguard Worker     // The list is not updated.
1758*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(entry2->GetKey(), second);
1759*6777b538SAndroid Build Coastguard Worker   } else {
1760*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(entry2->GetKey(), first);
1761*6777b538SAndroid Build Coastguard Worker   }
1762*6777b538SAndroid Build Coastguard Worker 
1763*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1764*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1765*6777b538SAndroid Build Coastguard Worker }
1766*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Enumerations2)1767*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Enumerations2) {
1768*6777b538SAndroid Build Coastguard Worker   BackendEnumerations2();
1769*6777b538SAndroid Build Coastguard Worker }
1770*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionEnumerations2)1771*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) {
1772*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1773*6777b538SAndroid Build Coastguard Worker   BackendEnumerations2();
1774*6777b538SAndroid Build Coastguard Worker }
1775*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheEnumerations2)1776*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) {
1777*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1778*6777b538SAndroid Build Coastguard Worker   BackendEnumerations2();
1779*6777b538SAndroid Build Coastguard Worker }
1780*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheEnumerations2)1781*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations2) {
1782*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1783*6777b538SAndroid Build Coastguard Worker   BackendEnumerations2();
1784*6777b538SAndroid Build Coastguard Worker }
1785*6777b538SAndroid Build Coastguard Worker 
BackendDoomMidEnumeration()1786*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDoomMidEnumeration() {
1787*6777b538SAndroid Build Coastguard Worker   InitCache();
1788*6777b538SAndroid Build Coastguard Worker 
1789*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 100;
1790*6777b538SAndroid Build Coastguard Worker   std::set<std::string> keys;
1791*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; i++) {
1792*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
1793*6777b538SAndroid Build Coastguard Worker     keys.insert(key);
1794*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
1795*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1796*6777b538SAndroid Build Coastguard Worker     entry->Close();
1797*6777b538SAndroid Build Coastguard Worker   }
1798*6777b538SAndroid Build Coastguard Worker 
1799*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
1800*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
1801*6777b538SAndroid Build Coastguard Worker   int count = 0;
1802*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
1803*6777b538SAndroid Build Coastguard Worker     if (count == 0) {
1804*6777b538SAndroid Build Coastguard Worker       // Delete a random entry from the cache while in the midst of iteration.
1805*6777b538SAndroid Build Coastguard Worker       auto key_to_doom = keys.begin();
1806*6777b538SAndroid Build Coastguard Worker       while (*key_to_doom == entry->GetKey())
1807*6777b538SAndroid Build Coastguard Worker         key_to_doom++;
1808*6777b538SAndroid Build Coastguard Worker       ASSERT_THAT(DoomEntry(*key_to_doom), IsOk());
1809*6777b538SAndroid Build Coastguard Worker       ASSERT_EQ(1u, keys.erase(*key_to_doom));
1810*6777b538SAndroid Build Coastguard Worker     }
1811*6777b538SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, entry);
1812*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, keys.erase(entry->GetKey()));
1813*6777b538SAndroid Build Coastguard Worker     entry->Close();
1814*6777b538SAndroid Build Coastguard Worker     count++;
1815*6777b538SAndroid Build Coastguard Worker   };
1816*6777b538SAndroid Build Coastguard Worker 
1817*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries - 1, cache_->GetEntryCount());
1818*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, keys.size());
1819*6777b538SAndroid Build Coastguard Worker }
1820*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomEnumerations)1821*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomEnumerations) {
1822*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1823*6777b538SAndroid Build Coastguard Worker }
1824*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDoomEnumerations)1825*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDoomEnumerations) {
1826*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1827*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1828*6777b538SAndroid Build Coastguard Worker }
1829*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomEnumerations)1830*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEnumerations) {
1831*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
1832*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1833*6777b538SAndroid Build Coastguard Worker }
1834*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheDoomEnumerations)1835*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheDoomEnumerations) {
1836*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1837*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1838*6777b538SAndroid Build Coastguard Worker }
1839*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheDoomEnumerations)1840*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheDoomEnumerations) {
1841*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
1842*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1843*6777b538SAndroid Build Coastguard Worker }
1844*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleDoomEnumerations)1845*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleDoomEnumerations) {
1846*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
1847*6777b538SAndroid Build Coastguard Worker   BackendDoomMidEnumeration();
1848*6777b538SAndroid Build Coastguard Worker }
1849*6777b538SAndroid Build Coastguard Worker 
1850*6777b538SAndroid Build Coastguard Worker // Verify that ReadData calls do not update the LRU cache
1851*6777b538SAndroid Build Coastguard Worker // when using the SHADER_CACHE type.
TEST_F(DiskCacheBackendTest,ShaderCacheEnumerationReadData)1852*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheEnumerationReadData) {
1853*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
1854*6777b538SAndroid Build Coastguard Worker   InitCache();
1855*6777b538SAndroid Build Coastguard Worker   const std::string first("first");
1856*6777b538SAndroid Build Coastguard Worker   const std::string second("second");
1857*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
1858*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
1859*6777b538SAndroid Build Coastguard Worker   auto buffer1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1860*6777b538SAndroid Build Coastguard Worker 
1861*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry1), IsOk());
1862*6777b538SAndroid Build Coastguard Worker   memset(buffer1->data(), 0, kSize);
1863*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer1->data(), "And the data to save", kSize);
1864*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
1865*6777b538SAndroid Build Coastguard Worker 
1866*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry2), IsOk());
1867*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1868*6777b538SAndroid Build Coastguard Worker 
1869*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
1870*6777b538SAndroid Build Coastguard Worker 
1871*6777b538SAndroid Build Coastguard Worker   // Make sure that the timestamp is not the same.
1872*6777b538SAndroid Build Coastguard Worker   AddDelay();
1873*6777b538SAndroid Build Coastguard Worker 
1874*6777b538SAndroid Build Coastguard Worker   // Read from the last item in the LRU.
1875*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize));
1876*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1877*6777b538SAndroid Build Coastguard Worker 
1878*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
1879*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry2), IsOk());
1880*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entry2->GetKey(), second);
1881*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1882*6777b538SAndroid Build Coastguard Worker }
1883*6777b538SAndroid Build Coastguard Worker 
1884*6777b538SAndroid Build Coastguard Worker #if !defined(LEAK_SANITIZER)
1885*6777b538SAndroid Build Coastguard Worker // Verify handling of invalid entries while doing enumerations.
1886*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
BackendInvalidEntryEnumeration()1887*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntryEnumeration() {
1888*6777b538SAndroid Build Coastguard Worker   InitCache();
1889*6777b538SAndroid Build Coastguard Worker 
1890*6777b538SAndroid Build Coastguard Worker   std::string key("Some key");
1891*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry, *entry1, *entry2;
1892*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry1), IsOk());
1893*6777b538SAndroid Build Coastguard Worker 
1894*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
1895*6777b538SAndroid Build Coastguard Worker   auto buffer1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
1896*6777b538SAndroid Build Coastguard Worker   memset(buffer1->data(), 0, kSize);
1897*6777b538SAndroid Build Coastguard Worker   base::strlcpy(buffer1->data(), "And the data to save", kSize);
1898*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
1899*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1900*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry1), IsOk());
1901*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize));
1902*6777b538SAndroid Build Coastguard Worker 
1903*6777b538SAndroid Build Coastguard Worker   std::string key2("Another key");
1904*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key2, &entry2), IsOk());
1905*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1906*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2, cache_->GetEntryCount());
1907*6777b538SAndroid Build Coastguard Worker 
1908*6777b538SAndroid Build Coastguard Worker   SimulateCrash();
1909*6777b538SAndroid Build Coastguard Worker 
1910*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
1911*6777b538SAndroid Build Coastguard Worker   int count = 0;
1912*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
1913*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry);
1914*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(key2, entry->GetKey());
1915*6777b538SAndroid Build Coastguard Worker     entry->Close();
1916*6777b538SAndroid Build Coastguard Worker     count++;
1917*6777b538SAndroid Build Coastguard Worker   };
1918*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, count);
1919*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
1920*6777b538SAndroid Build Coastguard Worker }
1921*6777b538SAndroid Build Coastguard Worker 
1922*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,InvalidEntryEnumeration)1923*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) {
1924*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryEnumeration();
1925*6777b538SAndroid Build Coastguard Worker }
1926*6777b538SAndroid Build Coastguard Worker 
1927*6777b538SAndroid Build Coastguard Worker // We'll be leaking memory from this test.
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntryEnumeration)1928*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) {
1929*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1930*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntryEnumeration();
1931*6777b538SAndroid Build Coastguard Worker }
1932*6777b538SAndroid Build Coastguard Worker #endif  // !defined(LEAK_SANITIZER)
1933*6777b538SAndroid Build Coastguard Worker 
1934*6777b538SAndroid Build Coastguard Worker // Tests that if for some reason entries are modified close to existing cache
1935*6777b538SAndroid Build Coastguard Worker // iterators, we don't generate fatal errors or reset the cache.
BackendFixEnumerators()1936*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendFixEnumerators() {
1937*6777b538SAndroid Build Coastguard Worker   InitCache();
1938*6777b538SAndroid Build Coastguard Worker 
1939*6777b538SAndroid Build Coastguard Worker   int seed = static_cast<int>(Time::Now().ToInternalValue());
1940*6777b538SAndroid Build Coastguard Worker   srand(seed);
1941*6777b538SAndroid Build Coastguard Worker 
1942*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 10;
1943*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; i++) {
1944*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
1945*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
1946*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
1947*6777b538SAndroid Build Coastguard Worker     entry->Close();
1948*6777b538SAndroid Build Coastguard Worker   }
1949*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
1950*6777b538SAndroid Build Coastguard Worker 
1951*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
1952*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter1 = CreateIterator(),
1953*6777b538SAndroid Build Coastguard Worker                                 iter2 = CreateIterator();
1954*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter1->OpenNextEntry(&entry1), IsOk());
1955*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry1);
1956*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1957*6777b538SAndroid Build Coastguard Worker   entry1 = nullptr;
1958*6777b538SAndroid Build Coastguard Worker 
1959*6777b538SAndroid Build Coastguard Worker   // Let's go to the middle of the list.
1960*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries / 2; i++) {
1961*6777b538SAndroid Build Coastguard Worker     if (entry1)
1962*6777b538SAndroid Build Coastguard Worker       entry1->Close();
1963*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter1->OpenNextEntry(&entry1), IsOk());
1964*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry1);
1965*6777b538SAndroid Build Coastguard Worker 
1966*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
1967*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry2);
1968*6777b538SAndroid Build Coastguard Worker     entry2->Close();
1969*6777b538SAndroid Build Coastguard Worker   }
1970*6777b538SAndroid Build Coastguard Worker 
1971*6777b538SAndroid Build Coastguard Worker   // Messing up with entry1 will modify entry2->next.
1972*6777b538SAndroid Build Coastguard Worker   entry1->Doom();
1973*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
1974*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry2);
1975*6777b538SAndroid Build Coastguard Worker 
1976*6777b538SAndroid Build Coastguard Worker   // The link entry2->entry1 should be broken.
1977*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(entry2->GetKey(), entry1->GetKey());
1978*6777b538SAndroid Build Coastguard Worker   entry1->Close();
1979*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1980*6777b538SAndroid Build Coastguard Worker 
1981*6777b538SAndroid Build Coastguard Worker   // And the second iterator should keep working.
1982*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
1983*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != entry2);
1984*6777b538SAndroid Build Coastguard Worker   entry2->Close();
1985*6777b538SAndroid Build Coastguard Worker }
1986*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,FixEnumerators)1987*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, FixEnumerators) {
1988*6777b538SAndroid Build Coastguard Worker   BackendFixEnumerators();
1989*6777b538SAndroid Build Coastguard Worker }
1990*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionFixEnumerators)1991*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) {
1992*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
1993*6777b538SAndroid Build Coastguard Worker   BackendFixEnumerators();
1994*6777b538SAndroid Build Coastguard Worker }
1995*6777b538SAndroid Build Coastguard Worker 
BackendDoomRecent()1996*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDoomRecent() {
1997*6777b538SAndroid Build Coastguard Worker   InitCache();
1998*6777b538SAndroid Build Coastguard Worker 
1999*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2000*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry), IsOk());
2001*6777b538SAndroid Build Coastguard Worker   entry->Close();
2002*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry), IsOk());
2003*6777b538SAndroid Build Coastguard Worker   entry->Close();
2004*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2005*6777b538SAndroid Build Coastguard Worker 
2006*6777b538SAndroid Build Coastguard Worker   AddDelay();
2007*6777b538SAndroid Build Coastguard Worker   Time middle = Time::Now();
2008*6777b538SAndroid Build Coastguard Worker 
2009*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry), IsOk());
2010*6777b538SAndroid Build Coastguard Worker   entry->Close();
2011*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry), IsOk());
2012*6777b538SAndroid Build Coastguard Worker   entry->Close();
2013*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2014*6777b538SAndroid Build Coastguard Worker 
2015*6777b538SAndroid Build Coastguard Worker   AddDelay();
2016*6777b538SAndroid Build Coastguard Worker   Time final = Time::Now();
2017*6777b538SAndroid Build Coastguard Worker 
2018*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(4, cache_->GetEntryCount());
2019*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntriesSince(final), IsOk());
2020*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(4, cache_->GetEntryCount());
2021*6777b538SAndroid Build Coastguard Worker 
2022*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntriesSince(middle), IsOk());
2023*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2, cache_->GetEntryCount());
2024*6777b538SAndroid Build Coastguard Worker 
2025*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("second", &entry), IsOk());
2026*6777b538SAndroid Build Coastguard Worker   entry->Close();
2027*6777b538SAndroid Build Coastguard Worker }
2028*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomRecent)2029*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomRecent) {
2030*6777b538SAndroid Build Coastguard Worker   BackendDoomRecent();
2031*6777b538SAndroid Build Coastguard Worker }
2032*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDoomRecent)2033*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) {
2034*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2035*6777b538SAndroid Build Coastguard Worker   BackendDoomRecent();
2036*6777b538SAndroid Build Coastguard Worker }
2037*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomRecent)2038*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) {
2039*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2040*6777b538SAndroid Build Coastguard Worker   BackendDoomRecent();
2041*6777b538SAndroid Build Coastguard Worker }
2042*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomEntriesSinceSparse)2043*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) {
2044*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2045*6777b538SAndroid Build Coastguard Worker   base::Time start;
2046*6777b538SAndroid Build Coastguard Worker   InitSparseCache(&start, nullptr);
2047*6777b538SAndroid Build Coastguard Worker   DoomEntriesSince(start);
2048*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2049*6777b538SAndroid Build Coastguard Worker }
2050*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomEntriesSinceSparse)2051*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) {
2052*6777b538SAndroid Build Coastguard Worker   base::Time start;
2053*6777b538SAndroid Build Coastguard Worker   InitSparseCache(&start, nullptr);
2054*6777b538SAndroid Build Coastguard Worker   DoomEntriesSince(start);
2055*6777b538SAndroid Build Coastguard Worker   // NOTE: BackendImpl counts child entries in its GetEntryCount(), while
2056*6777b538SAndroid Build Coastguard Worker   // MemBackendImpl does not. Thats why expected value differs here from
2057*6777b538SAndroid Build Coastguard Worker   // MemoryOnlyDoomEntriesSinceSparse.
2058*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, cache_->GetEntryCount());
2059*6777b538SAndroid Build Coastguard Worker }
2060*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomAllSparse)2061*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) {
2062*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2063*6777b538SAndroid Build Coastguard Worker   InitSparseCache(nullptr, nullptr);
2064*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
2065*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
2066*6777b538SAndroid Build Coastguard Worker }
2067*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomAllSparse)2068*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomAllSparse) {
2069*6777b538SAndroid Build Coastguard Worker   InitSparseCache(nullptr, nullptr);
2070*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
2071*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
2072*6777b538SAndroid Build Coastguard Worker }
2073*6777b538SAndroid Build Coastguard Worker 
2074*6777b538SAndroid Build Coastguard Worker // This test is for https://crbug.com/827492.
TEST_F(DiskCacheBackendTest,InMemorySparseEvict)2075*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemorySparseEvict) {
2076*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 512;
2077*6777b538SAndroid Build Coastguard Worker 
2078*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
2079*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2080*6777b538SAndroid Build Coastguard Worker   InitCache();
2081*6777b538SAndroid Build Coastguard Worker 
2082*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(64);
2083*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), 64, false /* no_nulls */);
2084*6777b538SAndroid Build Coastguard Worker 
2085*6777b538SAndroid Build Coastguard Worker   std::vector<disk_cache::ScopedEntryPtr> entries;
2086*6777b538SAndroid Build Coastguard Worker 
2087*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
2088*6777b538SAndroid Build Coastguard Worker   // Create a bunch of entries
2089*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < 14; i++) {
2090*6777b538SAndroid Build Coastguard Worker     std::string name = "http://www." + base::NumberToString(i) + ".com/";
2091*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(name, &entry), IsOk());
2092*6777b538SAndroid Build Coastguard Worker     entries.push_back(disk_cache::ScopedEntryPtr(entry));
2093*6777b538SAndroid Build Coastguard Worker   }
2094*6777b538SAndroid Build Coastguard Worker 
2095*6777b538SAndroid Build Coastguard Worker   // Create several sparse entries and fill with enough data to
2096*6777b538SAndroid Build Coastguard Worker   // pass eviction threshold
2097*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(64, WriteSparseData(entries[0].get(), 0, buffer.get(), 64));
2098*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_FAILED,
2099*6777b538SAndroid Build Coastguard Worker             WriteSparseData(entries[0].get(), 10000, buffer.get(), 4));
2100*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(63, WriteSparseData(entries[1].get(), 0, buffer.get(), 63));
2101*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(64, WriteSparseData(entries[2].get(), 0, buffer.get(), 64));
2102*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(64, WriteSparseData(entries[3].get(), 0, buffer.get(), 64));
2103*6777b538SAndroid Build Coastguard Worker 
2104*6777b538SAndroid Build Coastguard Worker   // Close all the entries, leaving a populated LRU list
2105*6777b538SAndroid Build Coastguard Worker   // with all entries having refcount 0 (doom implies deletion)
2106*6777b538SAndroid Build Coastguard Worker   entries.clear();
2107*6777b538SAndroid Build Coastguard Worker 
2108*6777b538SAndroid Build Coastguard Worker   // Create a new entry, triggering buggy eviction
2109*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("http://www.14.com/", &entry), IsOk());
2110*6777b538SAndroid Build Coastguard Worker   entry->Close();
2111*6777b538SAndroid Build Coastguard Worker }
2112*6777b538SAndroid Build Coastguard Worker 
BackendDoomBetween()2113*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDoomBetween() {
2114*6777b538SAndroid Build Coastguard Worker   InitCache();
2115*6777b538SAndroid Build Coastguard Worker 
2116*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2117*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry), IsOk());
2118*6777b538SAndroid Build Coastguard Worker   entry->Close();
2119*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2120*6777b538SAndroid Build Coastguard Worker 
2121*6777b538SAndroid Build Coastguard Worker   AddDelay();
2122*6777b538SAndroid Build Coastguard Worker   Time middle_start = Time::Now();
2123*6777b538SAndroid Build Coastguard Worker 
2124*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry), IsOk());
2125*6777b538SAndroid Build Coastguard Worker   entry->Close();
2126*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry), IsOk());
2127*6777b538SAndroid Build Coastguard Worker   entry->Close();
2128*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2129*6777b538SAndroid Build Coastguard Worker 
2130*6777b538SAndroid Build Coastguard Worker   AddDelay();
2131*6777b538SAndroid Build Coastguard Worker   Time middle_end = Time::Now();
2132*6777b538SAndroid Build Coastguard Worker 
2133*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry), IsOk());
2134*6777b538SAndroid Build Coastguard Worker   entry->Close();
2135*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("fourth", &entry), IsOk());
2136*6777b538SAndroid Build Coastguard Worker   entry->Close();
2137*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2138*6777b538SAndroid Build Coastguard Worker 
2139*6777b538SAndroid Build Coastguard Worker   AddDelay();
2140*6777b538SAndroid Build Coastguard Worker   Time final = Time::Now();
2141*6777b538SAndroid Build Coastguard Worker 
2142*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(4, cache_->GetEntryCount());
2143*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntriesBetween(middle_start, middle_end), IsOk());
2144*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2, cache_->GetEntryCount());
2145*6777b538SAndroid Build Coastguard Worker 
2146*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("fourth", &entry), IsOk());
2147*6777b538SAndroid Build Coastguard Worker   entry->Close();
2148*6777b538SAndroid Build Coastguard Worker 
2149*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomEntriesBetween(middle_start, final), IsOk());
2150*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1, cache_->GetEntryCount());
2151*6777b538SAndroid Build Coastguard Worker 
2152*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("first", &entry), IsOk());
2153*6777b538SAndroid Build Coastguard Worker   entry->Close();
2154*6777b538SAndroid Build Coastguard Worker }
2155*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomBetween)2156*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomBetween) {
2157*6777b538SAndroid Build Coastguard Worker   BackendDoomBetween();
2158*6777b538SAndroid Build Coastguard Worker }
2159*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDoomBetween)2160*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) {
2161*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2162*6777b538SAndroid Build Coastguard Worker   BackendDoomBetween();
2163*6777b538SAndroid Build Coastguard Worker }
2164*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomBetween)2165*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) {
2166*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2167*6777b538SAndroid Build Coastguard Worker   BackendDoomBetween();
2168*6777b538SAndroid Build Coastguard Worker }
2169*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomEntriesBetweenSparse)2170*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) {
2171*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2172*6777b538SAndroid Build Coastguard Worker   base::Time start, end;
2173*6777b538SAndroid Build Coastguard Worker   InitSparseCache(&start, &end);
2174*6777b538SAndroid Build Coastguard Worker   DoomEntriesBetween(start, end);
2175*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, cache_->GetEntryCount());
2176*6777b538SAndroid Build Coastguard Worker 
2177*6777b538SAndroid Build Coastguard Worker   start = end;
2178*6777b538SAndroid Build Coastguard Worker   end = base::Time::Now();
2179*6777b538SAndroid Build Coastguard Worker   DoomEntriesBetween(start, end);
2180*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2181*6777b538SAndroid Build Coastguard Worker }
2182*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomEntriesBetweenSparse)2183*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomEntriesBetweenSparse) {
2184*6777b538SAndroid Build Coastguard Worker   base::Time start, end;
2185*6777b538SAndroid Build Coastguard Worker   InitSparseCache(&start, &end);
2186*6777b538SAndroid Build Coastguard Worker   DoomEntriesBetween(start, end);
2187*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(9, cache_->GetEntryCount());
2188*6777b538SAndroid Build Coastguard Worker 
2189*6777b538SAndroid Build Coastguard Worker   start = end;
2190*6777b538SAndroid Build Coastguard Worker   end = base::Time::Now();
2191*6777b538SAndroid Build Coastguard Worker   DoomEntriesBetween(start, end);
2192*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, cache_->GetEntryCount());
2193*6777b538SAndroid Build Coastguard Worker }
2194*6777b538SAndroid Build Coastguard Worker 
BackendCalculateSizeOfAllEntries()2195*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendCalculateSizeOfAllEntries() {
2196*6777b538SAndroid Build Coastguard Worker   InitCache();
2197*6777b538SAndroid Build Coastguard Worker 
2198*6777b538SAndroid Build Coastguard Worker   // The cache is initially empty.
2199*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfAllEntries());
2200*6777b538SAndroid Build Coastguard Worker 
2201*6777b538SAndroid Build Coastguard Worker   // Generate random entries and populate them with data of respective
2202*6777b538SAndroid Build Coastguard Worker   // sizes 0, 1, ..., count - 1 bytes.
2203*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
2204*6777b538SAndroid Build Coastguard Worker   CreateSetOfRandomEntries(&key_pool);
2205*6777b538SAndroid Build Coastguard Worker 
2206*6777b538SAndroid Build Coastguard Worker   int count = 0;
2207*6777b538SAndroid Build Coastguard Worker   int total_size = 0;
2208*6777b538SAndroid Build Coastguard Worker   for (std::string key : key_pool) {
2209*6777b538SAndroid Build Coastguard Worker     std::string data(count, ' ');
2210*6777b538SAndroid Build Coastguard Worker     scoped_refptr<net::StringIOBuffer> buffer =
2211*6777b538SAndroid Build Coastguard Worker         base::MakeRefCounted<net::StringIOBuffer>(data);
2212*6777b538SAndroid Build Coastguard Worker 
2213*6777b538SAndroid Build Coastguard Worker     // Alternate between writing to first two streams to test that we do not
2214*6777b538SAndroid Build Coastguard Worker     // take only one stream into account.
2215*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
2216*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(key, &entry), IsOk());
2217*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(count, WriteData(entry, count % 2, 0, buffer.get(), count, true));
2218*6777b538SAndroid Build Coastguard Worker     entry->Close();
2219*6777b538SAndroid Build Coastguard Worker 
2220*6777b538SAndroid Build Coastguard Worker     total_size += GetRoundedSize(count + GetEntryMetadataSize(key));
2221*6777b538SAndroid Build Coastguard Worker     ++count;
2222*6777b538SAndroid Build Coastguard Worker   }
2223*6777b538SAndroid Build Coastguard Worker 
2224*6777b538SAndroid Build Coastguard Worker   int result = CalculateSizeOfAllEntries();
2225*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(total_size, result);
2226*6777b538SAndroid Build Coastguard Worker 
2227*6777b538SAndroid Build Coastguard Worker   // Add another entry and test if the size is updated. Then remove it and test
2228*6777b538SAndroid Build Coastguard Worker   // if the size is back to original value.
2229*6777b538SAndroid Build Coastguard Worker   {
2230*6777b538SAndroid Build Coastguard Worker     const int last_entry_size = 47;
2231*6777b538SAndroid Build Coastguard Worker     std::string data(last_entry_size, ' ');
2232*6777b538SAndroid Build Coastguard Worker     scoped_refptr<net::StringIOBuffer> buffer =
2233*6777b538SAndroid Build Coastguard Worker         base::MakeRefCounted<net::StringIOBuffer>(data);
2234*6777b538SAndroid Build Coastguard Worker 
2235*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry;
2236*6777b538SAndroid Build Coastguard Worker     std::string key = GenerateKey(true);
2237*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
2238*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(last_entry_size,
2239*6777b538SAndroid Build Coastguard Worker               WriteData(entry, 0, 0, buffer.get(), last_entry_size, true));
2240*6777b538SAndroid Build Coastguard Worker     entry->Close();
2241*6777b538SAndroid Build Coastguard Worker 
2242*6777b538SAndroid Build Coastguard Worker     int new_result = CalculateSizeOfAllEntries();
2243*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
2244*6777b538SAndroid Build Coastguard Worker         result + GetRoundedSize(last_entry_size + GetEntryMetadataSize(key)),
2245*6777b538SAndroid Build Coastguard Worker         new_result);
2246*6777b538SAndroid Build Coastguard Worker 
2247*6777b538SAndroid Build Coastguard Worker     DoomEntry(key);
2248*6777b538SAndroid Build Coastguard Worker     new_result = CalculateSizeOfAllEntries();
2249*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, new_result);
2250*6777b538SAndroid Build Coastguard Worker   }
2251*6777b538SAndroid Build Coastguard Worker 
2252*6777b538SAndroid Build Coastguard Worker   // After dooming the entries, the size should be back to zero.
2253*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(DoomAllEntries(), IsOk());
2254*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfAllEntries());
2255*6777b538SAndroid Build Coastguard Worker }
2256*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,CalculateSizeOfAllEntries)2257*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, CalculateSizeOfAllEntries) {
2258*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfAllEntries();
2259*6777b538SAndroid Build Coastguard Worker }
2260*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyCalculateSizeOfAllEntries)2261*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyCalculateSizeOfAllEntries) {
2262*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2263*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfAllEntries();
2264*6777b538SAndroid Build Coastguard Worker }
2265*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheCalculateSizeOfAllEntries)2266*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheCalculateSizeOfAllEntries) {
2267*6777b538SAndroid Build Coastguard Worker   // Use net::APP_CACHE to make size estimations deterministic via
2268*6777b538SAndroid Build Coastguard Worker   // non-optimistic writes.
2269*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
2270*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
2271*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfAllEntries();
2272*6777b538SAndroid Build Coastguard Worker }
2273*6777b538SAndroid Build Coastguard Worker 
BackendCalculateSizeOfEntriesBetween(bool expect_access_time_comparisons)2274*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendCalculateSizeOfEntriesBetween(
2275*6777b538SAndroid Build Coastguard Worker     bool expect_access_time_comparisons) {
2276*6777b538SAndroid Build Coastguard Worker   InitCache();
2277*6777b538SAndroid Build Coastguard Worker 
2278*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
2279*6777b538SAndroid Build Coastguard Worker 
2280*6777b538SAndroid Build Coastguard Worker   Time start = Time::Now();
2281*6777b538SAndroid Build Coastguard Worker 
2282*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2283*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry), IsOk());
2284*6777b538SAndroid Build Coastguard Worker   entry->Close();
2285*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2286*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
2287*6777b538SAndroid Build Coastguard Worker 
2288*6777b538SAndroid Build Coastguard Worker   AddDelay();
2289*6777b538SAndroid Build Coastguard Worker   Time middle = Time::Now();
2290*6777b538SAndroid Build Coastguard Worker   AddDelay();
2291*6777b538SAndroid Build Coastguard Worker 
2292*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry), IsOk());
2293*6777b538SAndroid Build Coastguard Worker   entry->Close();
2294*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third_entry", &entry), IsOk());
2295*6777b538SAndroid Build Coastguard Worker   entry->Close();
2296*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2297*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
2298*6777b538SAndroid Build Coastguard Worker 
2299*6777b538SAndroid Build Coastguard Worker   AddDelay();
2300*6777b538SAndroid Build Coastguard Worker   Time end = Time::Now();
2301*6777b538SAndroid Build Coastguard Worker 
2302*6777b538SAndroid Build Coastguard Worker   int size_1 = GetRoundedSize(GetEntryMetadataSize("first"));
2303*6777b538SAndroid Build Coastguard Worker   int size_2 = GetRoundedSize(GetEntryMetadataSize("second"));
2304*6777b538SAndroid Build Coastguard Worker   int size_3 = GetRoundedSize(GetEntryMetadataSize("third_entry"));
2305*6777b538SAndroid Build Coastguard Worker 
2306*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(3, cache_->GetEntryCount());
2307*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(CalculateSizeOfAllEntries(),
2308*6777b538SAndroid Build Coastguard Worker             CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
2309*6777b538SAndroid Build Coastguard Worker 
2310*6777b538SAndroid Build Coastguard Worker   if (expect_access_time_comparisons) {
2311*6777b538SAndroid Build Coastguard Worker     int start_end = CalculateSizeOfEntriesBetween(start, end);
2312*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(CalculateSizeOfAllEntries(), start_end);
2313*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(size_1 + size_2 + size_3, start_end);
2314*6777b538SAndroid Build Coastguard Worker 
2315*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(size_1, CalculateSizeOfEntriesBetween(start, middle));
2316*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(size_2 + size_3, CalculateSizeOfEntriesBetween(middle, end));
2317*6777b538SAndroid Build Coastguard Worker   }
2318*6777b538SAndroid Build Coastguard Worker 
2319*6777b538SAndroid Build Coastguard Worker   // After dooming the entries, the size should be back to zero.
2320*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(DoomAllEntries(), IsOk());
2321*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
2322*6777b538SAndroid Build Coastguard Worker }
2323*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,CalculateSizeOfEntriesBetween)2324*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, CalculateSizeOfEntriesBetween) {
2325*6777b538SAndroid Build Coastguard Worker   InitCache();
2326*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_NOT_IMPLEMENTED,
2327*6777b538SAndroid Build Coastguard Worker             CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
2328*6777b538SAndroid Build Coastguard Worker }
2329*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyCalculateSizeOfEntriesBetween)2330*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyCalculateSizeOfEntriesBetween) {
2331*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
2332*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfEntriesBetween(true);
2333*6777b538SAndroid Build Coastguard Worker }
2334*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheCalculateSizeOfEntriesBetween)2335*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheCalculateSizeOfEntriesBetween) {
2336*6777b538SAndroid Build Coastguard Worker   // Test normal mode in where access time range comparisons are supported.
2337*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
2338*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfEntriesBetween(true);
2339*6777b538SAndroid Build Coastguard Worker }
2340*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheAppCacheCalculateSizeOfEntriesBetween)2341*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheCalculateSizeOfEntriesBetween) {
2342*6777b538SAndroid Build Coastguard Worker   // Test SimpleCache in APP_CACHE mode separately since it does not support
2343*6777b538SAndroid Build Coastguard Worker   // access time range comparisons.
2344*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
2345*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
2346*6777b538SAndroid Build Coastguard Worker   BackendCalculateSizeOfEntriesBetween(false);
2347*6777b538SAndroid Build Coastguard Worker }
2348*6777b538SAndroid Build Coastguard Worker 
BackendTransaction(const std::string & name,int num_entries,bool load)2349*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendTransaction(const std::string& name,
2350*6777b538SAndroid Build Coastguard Worker                                               int num_entries,
2351*6777b538SAndroid Build Coastguard Worker                                               bool load) {
2352*6777b538SAndroid Build Coastguard Worker   success_ = false;
2353*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache(name));
2354*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2355*6777b538SAndroid Build Coastguard Worker 
2356*6777b538SAndroid Build Coastguard Worker   uint32_t mask;
2357*6777b538SAndroid Build Coastguard Worker   if (load) {
2358*6777b538SAndroid Build Coastguard Worker     mask = 0xf;
2359*6777b538SAndroid Build Coastguard Worker     SetMaxSize(0x100000);
2360*6777b538SAndroid Build Coastguard Worker   } else {
2361*6777b538SAndroid Build Coastguard Worker     // Clear the settings from the previous run.
2362*6777b538SAndroid Build Coastguard Worker     mask = 0;
2363*6777b538SAndroid Build Coastguard Worker     SetMaxSize(0);
2364*6777b538SAndroid Build Coastguard Worker   }
2365*6777b538SAndroid Build Coastguard Worker   SetMask(mask);
2366*6777b538SAndroid Build Coastguard Worker 
2367*6777b538SAndroid Build Coastguard Worker   InitCache();
2368*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(num_entries + 1, cache_->GetEntryCount());
2369*6777b538SAndroid Build Coastguard Worker 
2370*6777b538SAndroid Build Coastguard Worker   std::string key("the first key");
2371*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1;
2372*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(net::OK, OpenEntry(key, &entry1));
2373*6777b538SAndroid Build Coastguard Worker 
2374*6777b538SAndroid Build Coastguard Worker   int actual = cache_->GetEntryCount();
2375*6777b538SAndroid Build Coastguard Worker   if (num_entries != actual) {
2376*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(load);
2377*6777b538SAndroid Build Coastguard Worker     // If there is a heavy load, inserting an entry will make another entry
2378*6777b538SAndroid Build Coastguard Worker     // dirty (on the hash bucket) so two entries are removed.
2379*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(num_entries - 1, actual);
2380*6777b538SAndroid Build Coastguard Worker   }
2381*6777b538SAndroid Build Coastguard Worker 
2382*6777b538SAndroid Build Coastguard Worker   ResetCaches();
2383*6777b538SAndroid Build Coastguard Worker 
2384*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, MaxSize(), mask));
2385*6777b538SAndroid Build Coastguard Worker   success_ = true;
2386*6777b538SAndroid Build Coastguard Worker }
2387*6777b538SAndroid Build Coastguard Worker 
BackendRecoverInsert()2388*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendRecoverInsert() {
2389*6777b538SAndroid Build Coastguard Worker   // Tests with an empty cache.
2390*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_empty1", 0, false);
2391*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_empty1";
2392*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_empty2", 0, false);
2393*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_empty2";
2394*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_empty3", 0, false);
2395*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_empty3";
2396*6777b538SAndroid Build Coastguard Worker 
2397*6777b538SAndroid Build Coastguard Worker   // Tests with one entry on the cache.
2398*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_one1", 1, false);
2399*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_one1";
2400*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_one2", 1, false);
2401*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_one2";
2402*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_one3", 1, false);
2403*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_one3";
2404*6777b538SAndroid Build Coastguard Worker 
2405*6777b538SAndroid Build Coastguard Worker   // Tests with one hundred entries on the cache, tiny index.
2406*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_load1", 100, true);
2407*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_load1";
2408*6777b538SAndroid Build Coastguard Worker   BackendTransaction("insert_load2", 100, true);
2409*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "insert_load2";
2410*6777b538SAndroid Build Coastguard Worker }
2411*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,RecoverInsert)2412*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, RecoverInsert) {
2413*6777b538SAndroid Build Coastguard Worker   BackendRecoverInsert();
2414*6777b538SAndroid Build Coastguard Worker }
2415*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionRecoverInsert)2416*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) {
2417*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2418*6777b538SAndroid Build Coastguard Worker   BackendRecoverInsert();
2419*6777b538SAndroid Build Coastguard Worker }
2420*6777b538SAndroid Build Coastguard Worker 
BackendRecoverRemove()2421*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendRecoverRemove() {
2422*6777b538SAndroid Build Coastguard Worker   // Removing the only element.
2423*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_one1", 0, false);
2424*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_one1";
2425*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_one2", 0, false);
2426*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_one2";
2427*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_one3", 0, false);
2428*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_one3";
2429*6777b538SAndroid Build Coastguard Worker 
2430*6777b538SAndroid Build Coastguard Worker   // Removing the head.
2431*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_head1", 1, false);
2432*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_head1";
2433*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_head2", 1, false);
2434*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_head2";
2435*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_head3", 1, false);
2436*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_head3";
2437*6777b538SAndroid Build Coastguard Worker 
2438*6777b538SAndroid Build Coastguard Worker   // Removing the tail.
2439*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_tail1", 1, false);
2440*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_tail1";
2441*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_tail2", 1, false);
2442*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_tail2";
2443*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_tail3", 1, false);
2444*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_tail3";
2445*6777b538SAndroid Build Coastguard Worker 
2446*6777b538SAndroid Build Coastguard Worker   // Removing with one hundred entries on the cache, tiny index.
2447*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_load1", 100, true);
2448*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_load1";
2449*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_load2", 100, true);
2450*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_load2";
2451*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_load3", 100, true);
2452*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_load3";
2453*6777b538SAndroid Build Coastguard Worker 
2454*6777b538SAndroid Build Coastguard Worker   // This case cannot be reverted.
2455*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_one4", 0, false);
2456*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_one4";
2457*6777b538SAndroid Build Coastguard Worker   BackendTransaction("remove_head4", 1, false);
2458*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(success_) << "remove_head4";
2459*6777b538SAndroid Build Coastguard Worker }
2460*6777b538SAndroid Build Coastguard Worker 
2461*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
2462*6777b538SAndroid Build Coastguard Worker // http://crbug.com/396392
2463*6777b538SAndroid Build Coastguard Worker #define MAYBE_RecoverRemove DISABLED_RecoverRemove
2464*6777b538SAndroid Build Coastguard Worker #else
2465*6777b538SAndroid Build Coastguard Worker #define MAYBE_RecoverRemove RecoverRemove
2466*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(DiskCacheBackendTest,MAYBE_RecoverRemove)2467*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MAYBE_RecoverRemove) {
2468*6777b538SAndroid Build Coastguard Worker   BackendRecoverRemove();
2469*6777b538SAndroid Build Coastguard Worker }
2470*6777b538SAndroid Build Coastguard Worker 
2471*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
2472*6777b538SAndroid Build Coastguard Worker // http://crbug.com/396392
2473*6777b538SAndroid Build Coastguard Worker #define MAYBE_NewEvictionRecoverRemove DISABLED_NewEvictionRecoverRemove
2474*6777b538SAndroid Build Coastguard Worker #else
2475*6777b538SAndroid Build Coastguard Worker #define MAYBE_NewEvictionRecoverRemove NewEvictionRecoverRemove
2476*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(DiskCacheBackendTest,MAYBE_NewEvictionRecoverRemove)2477*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MAYBE_NewEvictionRecoverRemove) {
2478*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2479*6777b538SAndroid Build Coastguard Worker   BackendRecoverRemove();
2480*6777b538SAndroid Build Coastguard Worker }
2481*6777b538SAndroid Build Coastguard Worker 
BackendRecoverWithEviction()2482*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendRecoverWithEviction() {
2483*6777b538SAndroid Build Coastguard Worker   success_ = false;
2484*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("insert_load1"));
2485*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2486*6777b538SAndroid Build Coastguard Worker 
2487*6777b538SAndroid Build Coastguard Worker   SetMask(0xf);
2488*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x1000);
2489*6777b538SAndroid Build Coastguard Worker 
2490*6777b538SAndroid Build Coastguard Worker   // We should not crash here.
2491*6777b538SAndroid Build Coastguard Worker   InitCache();
2492*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
2493*6777b538SAndroid Build Coastguard Worker }
2494*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,RecoverWithEviction)2495*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, RecoverWithEviction) {
2496*6777b538SAndroid Build Coastguard Worker   BackendRecoverWithEviction();
2497*6777b538SAndroid Build Coastguard Worker }
2498*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionRecoverWithEviction)2499*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) {
2500*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2501*6777b538SAndroid Build Coastguard Worker   BackendRecoverWithEviction();
2502*6777b538SAndroid Build Coastguard Worker }
2503*6777b538SAndroid Build Coastguard Worker 
2504*6777b538SAndroid Build Coastguard Worker // Tests that the |BackendImpl| fails to start with the wrong cache version.
TEST_F(DiskCacheTest,WrongVersion)2505*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, WrongVersion) {
2506*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("wrong_version"));
2507*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
2508*6777b538SAndroid Build Coastguard Worker 
2509*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache(
2510*6777b538SAndroid Build Coastguard Worker       std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
2511*6777b538SAndroid Build Coastguard Worker                                                 net::DISK_CACHE, nullptr));
2512*6777b538SAndroid Build Coastguard Worker   cache->Init(cb.callback());
2513*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(cb.WaitForResult(), IsError(net::ERR_FAILED));
2514*6777b538SAndroid Build Coastguard Worker }
2515*6777b538SAndroid Build Coastguard Worker 
2516*6777b538SAndroid Build Coastguard Worker // Tests that the disk cache successfully joins the control group, dropping the
2517*6777b538SAndroid Build Coastguard Worker // existing cache in favour of a new empty cache.
2518*6777b538SAndroid Build Coastguard Worker // Disabled on android since this test requires cache creator to create
2519*6777b538SAndroid Build Coastguard Worker // blockfile caches.
2520*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
TEST_F(DiskCacheTest,SimpleCacheControlJoin)2521*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, SimpleCacheControlJoin) {
2522*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache =
2523*6777b538SAndroid Build Coastguard Worker       CreateExistingEntryCache(cache_path_);
2524*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cache.get());
2525*6777b538SAndroid Build Coastguard Worker   cache.reset();
2526*6777b538SAndroid Build Coastguard Worker 
2527*6777b538SAndroid Build Coastguard Worker   // Instantiate the SimpleCacheTrial, forcing this run into the
2528*6777b538SAndroid Build Coastguard Worker   // ExperimentControl group.
2529*6777b538SAndroid Build Coastguard Worker   base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
2530*6777b538SAndroid Build Coastguard Worker                                          "ExperimentControl");
2531*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
2532*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
2533*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
2534*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, cache_path_, 0,
2535*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kResetOnError, /*net_log=*/nullptr,
2536*6777b538SAndroid Build Coastguard Worker       cb.callback());
2537*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
2538*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
2539*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, rv.backend->GetEntryCount());
2540*6777b538SAndroid Build Coastguard Worker }
2541*6777b538SAndroid Build Coastguard Worker #endif
2542*6777b538SAndroid Build Coastguard Worker 
2543*6777b538SAndroid Build Coastguard Worker // Tests that the disk cache can restart in the control group preserving
2544*6777b538SAndroid Build Coastguard Worker // existing entries.
TEST_F(DiskCacheTest,SimpleCacheControlRestart)2545*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, SimpleCacheControlRestart) {
2546*6777b538SAndroid Build Coastguard Worker   // Instantiate the SimpleCacheTrial, forcing this run into the
2547*6777b538SAndroid Build Coastguard Worker   // ExperimentControl group.
2548*6777b538SAndroid Build Coastguard Worker   base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
2549*6777b538SAndroid Build Coastguard Worker                                          "ExperimentControl");
2550*6777b538SAndroid Build Coastguard Worker 
2551*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache =
2552*6777b538SAndroid Build Coastguard Worker       CreateExistingEntryCache(cache_path_);
2553*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cache.get());
2554*6777b538SAndroid Build Coastguard Worker 
2555*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
2556*6777b538SAndroid Build Coastguard Worker 
2557*6777b538SAndroid Build Coastguard Worker   const int kRestartCount = 5;
2558*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kRestartCount; ++i) {
2559*6777b538SAndroid Build Coastguard Worker     cache = std::make_unique<disk_cache::BackendImpl>(
2560*6777b538SAndroid Build Coastguard Worker         cache_path_, nullptr, nullptr, net::DISK_CACHE, nullptr);
2561*6777b538SAndroid Build Coastguard Worker     cache->Init(cb.callback());
2562*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(cb.WaitForResult(), IsOk());
2563*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache->GetEntryCount());
2564*6777b538SAndroid Build Coastguard Worker 
2565*6777b538SAndroid Build Coastguard Worker     TestEntryResultCompletionCallback cb2;
2566*6777b538SAndroid Build Coastguard Worker     EntryResult result =
2567*6777b538SAndroid Build Coastguard Worker         cache->OpenEntry(kExistingEntryKey, net::HIGHEST, cb2.callback());
2568*6777b538SAndroid Build Coastguard Worker     result = cb2.GetResult(std::move(result));
2569*6777b538SAndroid Build Coastguard Worker     result.ReleaseEntry()->Close();
2570*6777b538SAndroid Build Coastguard Worker   }
2571*6777b538SAndroid Build Coastguard Worker }
2572*6777b538SAndroid Build Coastguard Worker 
2573*6777b538SAndroid Build Coastguard Worker // Tests that the disk cache can leave the control group preserving existing
2574*6777b538SAndroid Build Coastguard Worker // entries.
TEST_F(DiskCacheTest,SimpleCacheControlLeave)2575*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, SimpleCacheControlLeave) {
2576*6777b538SAndroid Build Coastguard Worker   {
2577*6777b538SAndroid Build Coastguard Worker     // Instantiate the SimpleCacheTrial, forcing this run into the
2578*6777b538SAndroid Build Coastguard Worker     // ExperimentControl group.
2579*6777b538SAndroid Build Coastguard Worker     base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
2580*6777b538SAndroid Build Coastguard Worker                                            "ExperimentControl");
2581*6777b538SAndroid Build Coastguard Worker 
2582*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::BackendImpl> cache =
2583*6777b538SAndroid Build Coastguard Worker         CreateExistingEntryCache(cache_path_);
2584*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
2585*6777b538SAndroid Build Coastguard Worker   }
2586*6777b538SAndroid Build Coastguard Worker 
2587*6777b538SAndroid Build Coastguard Worker   // Instantiate the SimpleCacheTrial, forcing this run into the
2588*6777b538SAndroid Build Coastguard Worker   // ExperimentNo group.
2589*6777b538SAndroid Build Coastguard Worker   base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", "ExperimentNo");
2590*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
2591*6777b538SAndroid Build Coastguard Worker 
2592*6777b538SAndroid Build Coastguard Worker   const int kRestartCount = 5;
2593*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kRestartCount; ++i) {
2594*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::BackendImpl> cache(
2595*6777b538SAndroid Build Coastguard Worker         std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
2596*6777b538SAndroid Build Coastguard Worker                                                   net::DISK_CACHE, nullptr));
2597*6777b538SAndroid Build Coastguard Worker     cache->Init(cb.callback());
2598*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(cb.WaitForResult(), IsOk());
2599*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache->GetEntryCount());
2600*6777b538SAndroid Build Coastguard Worker 
2601*6777b538SAndroid Build Coastguard Worker     TestEntryResultCompletionCallback cb2;
2602*6777b538SAndroid Build Coastguard Worker     EntryResult result =
2603*6777b538SAndroid Build Coastguard Worker         cache->OpenEntry(kExistingEntryKey, net::HIGHEST, cb2.callback());
2604*6777b538SAndroid Build Coastguard Worker     result = cb2.GetResult(std::move(result));
2605*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(result.net_error(), IsOk());
2606*6777b538SAndroid Build Coastguard Worker     result.ReleaseEntry()->Close();
2607*6777b538SAndroid Build Coastguard Worker   }
2608*6777b538SAndroid Build Coastguard Worker }
2609*6777b538SAndroid Build Coastguard Worker 
2610*6777b538SAndroid Build Coastguard Worker // Tests that the cache is properly restarted on recovery error.
2611*6777b538SAndroid Build Coastguard Worker // Disabled on android since this test requires cache creator to create
2612*6777b538SAndroid Build Coastguard Worker // blockfile caches.
2613*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
TEST_F(DiskCacheBackendTest,DeleteOld)2614*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DeleteOld) {
2615*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("wrong_version"));
2616*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2617*6777b538SAndroid Build Coastguard Worker 
2618*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
2619*6777b538SAndroid Build Coastguard Worker   {
2620*6777b538SAndroid Build Coastguard Worker     base::ScopedDisallowBlocking disallow_blocking;
2621*6777b538SAndroid Build Coastguard Worker     base::FilePath path(cache_path_);
2622*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
2623*6777b538SAndroid Build Coastguard Worker         net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
2624*6777b538SAndroid Build Coastguard Worker         /*file_operations=*/nullptr, path, 0,
2625*6777b538SAndroid Build Coastguard Worker         disk_cache::ResetHandling::kResetOnError, /*net_log=*/nullptr,
2626*6777b538SAndroid Build Coastguard Worker         cb.callback());
2627*6777b538SAndroid Build Coastguard Worker     path.clear();  // Make sure path was captured by the previous call.
2628*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
2629*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(rv.net_error, IsOk());
2630*6777b538SAndroid Build Coastguard Worker   }
2631*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, /*max_size = */ 0,
2632*6777b538SAndroid Build Coastguard Worker                                   mask_));
2633*6777b538SAndroid Build Coastguard Worker }
2634*6777b538SAndroid Build Coastguard Worker #endif
2635*6777b538SAndroid Build Coastguard Worker 
2636*6777b538SAndroid Build Coastguard Worker // We want to be able to deal with messed up entries on disk.
BackendInvalidEntry2()2637*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry2() {
2638*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_entry"));
2639*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2640*6777b538SAndroid Build Coastguard Worker   InitCache();
2641*6777b538SAndroid Build Coastguard Worker 
2642*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
2643*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("the first key", &entry1), IsOk());
2644*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
2645*6777b538SAndroid Build Coastguard Worker   entry1->Close();
2646*6777b538SAndroid Build Coastguard Worker 
2647*6777b538SAndroid Build Coastguard Worker   // CheckCacheIntegrity will fail at this point.
2648*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
2649*6777b538SAndroid Build Coastguard Worker }
2650*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry2)2651*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry2) {
2652*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry2();
2653*6777b538SAndroid Build Coastguard Worker }
2654*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry2)2655*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) {
2656*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2657*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry2();
2658*6777b538SAndroid Build Coastguard Worker }
2659*6777b538SAndroid Build Coastguard Worker 
2660*6777b538SAndroid Build Coastguard Worker // Tests that we don't crash or hang when enumerating this cache.
BackendInvalidEntry3()2661*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry3() {
2662*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2663*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2664*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2665*6777b538SAndroid Build Coastguard Worker   InitCache();
2666*6777b538SAndroid Build Coastguard Worker 
2667*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2668*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
2669*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
2670*6777b538SAndroid Build Coastguard Worker     entry->Close();
2671*6777b538SAndroid Build Coastguard Worker   }
2672*6777b538SAndroid Build Coastguard Worker }
2673*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry3)2674*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry3) {
2675*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("dirty_entry3"));
2676*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry3();
2677*6777b538SAndroid Build Coastguard Worker }
2678*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry3)2679*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) {
2680*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("dirty_entry4"));
2681*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2682*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry3();
2683*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
2684*6777b538SAndroid Build Coastguard Worker }
2685*6777b538SAndroid Build Coastguard Worker 
2686*6777b538SAndroid Build Coastguard Worker // Test that we handle a dirty entry on the LRU list, already replaced with
2687*6777b538SAndroid Build Coastguard Worker // the same key, and with hash collisions.
TEST_F(DiskCacheBackendTest,InvalidEntry4)2688*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry4) {
2689*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("dirty_entry3"));
2690*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2691*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2692*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2693*6777b538SAndroid Build Coastguard Worker   InitCache();
2694*6777b538SAndroid Build Coastguard Worker 
2695*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
2696*6777b538SAndroid Build Coastguard Worker }
2697*6777b538SAndroid Build Coastguard Worker 
2698*6777b538SAndroid Build Coastguard Worker // Test that we handle a dirty entry on the deleted list, already replaced with
2699*6777b538SAndroid Build Coastguard Worker // the same key, and with hash collisions.
TEST_F(DiskCacheBackendTest,InvalidEntry5)2700*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry5) {
2701*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("dirty_entry4"));
2702*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2703*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2704*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2705*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2706*6777b538SAndroid Build Coastguard Worker   InitCache();
2707*6777b538SAndroid Build Coastguard Worker 
2708*6777b538SAndroid Build Coastguard Worker   TrimDeletedListForTest(false);
2709*6777b538SAndroid Build Coastguard Worker }
2710*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry6)2711*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry6) {
2712*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("dirty_entry5"));
2713*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2714*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2715*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2716*6777b538SAndroid Build Coastguard Worker   InitCache();
2717*6777b538SAndroid Build Coastguard Worker 
2718*6777b538SAndroid Build Coastguard Worker   // There is a dirty entry (but marked as clean) at the end, pointing to a
2719*6777b538SAndroid Build Coastguard Worker   // deleted entry through the hash collision list. We should not re-insert the
2720*6777b538SAndroid Build Coastguard Worker   // deleted entry into the index table.
2721*6777b538SAndroid Build Coastguard Worker 
2722*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
2723*6777b538SAndroid Build Coastguard Worker   // The cache should be clean (as detected by CheckCacheIntegrity).
2724*6777b538SAndroid Build Coastguard Worker }
2725*6777b538SAndroid Build Coastguard Worker 
2726*6777b538SAndroid Build Coastguard Worker // Tests that we don't hang when there is a loop on the hash collision list.
2727*6777b538SAndroid Build Coastguard Worker // The test cache could be a result of bug 69135.
TEST_F(DiskCacheBackendTest,BadNextEntry1)2728*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BadNextEntry1) {
2729*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop2"));
2730*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2731*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2732*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2733*6777b538SAndroid Build Coastguard Worker   InitCache();
2734*6777b538SAndroid Build Coastguard Worker 
2735*6777b538SAndroid Build Coastguard Worker   // The second entry points at itselft, and the first entry is not accessible
2736*6777b538SAndroid Build Coastguard Worker   // though the index, but it is at the head of the LRU.
2737*6777b538SAndroid Build Coastguard Worker 
2738*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2739*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("The first key", &entry), IsOk());
2740*6777b538SAndroid Build Coastguard Worker   entry->Close();
2741*6777b538SAndroid Build Coastguard Worker 
2742*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
2743*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
2744*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("The first key", &entry), IsOk());
2745*6777b538SAndroid Build Coastguard Worker   entry->Close();
2746*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2747*6777b538SAndroid Build Coastguard Worker }
2748*6777b538SAndroid Build Coastguard Worker 
2749*6777b538SAndroid Build Coastguard Worker // Tests that we don't hang when there is a loop on the hash collision list.
2750*6777b538SAndroid Build Coastguard Worker // The test cache could be a result of bug 69135.
TEST_F(DiskCacheBackendTest,BadNextEntry2)2751*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BadNextEntry2) {
2752*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop3"));
2753*6777b538SAndroid Build Coastguard Worker   SetMask(0x1);        // 2-entry table.
2754*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x3000);  // 12 kB.
2755*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2756*6777b538SAndroid Build Coastguard Worker   InitCache();
2757*6777b538SAndroid Build Coastguard Worker 
2758*6777b538SAndroid Build Coastguard Worker   // There is a wide loop of 5 entries.
2759*6777b538SAndroid Build Coastguard Worker 
2760*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2761*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(net::OK, OpenEntry("Not present key", &entry));
2762*6777b538SAndroid Build Coastguard Worker }
2763*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry6)2764*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) {
2765*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings3"));
2766*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
2767*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2768*6777b538SAndroid Build Coastguard Worker   InitCache();
2769*6777b538SAndroid Build Coastguard Worker 
2770*6777b538SAndroid Build Coastguard Worker   // The second entry is dirty, but removing it should not corrupt the list.
2771*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2772*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(net::OK, OpenEntry("the second key", &entry));
2773*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("the first key", &entry), IsOk());
2774*6777b538SAndroid Build Coastguard Worker 
2775*6777b538SAndroid Build Coastguard Worker   // This should not delete the cache.
2776*6777b538SAndroid Build Coastguard Worker   entry->Doom();
2777*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2778*6777b538SAndroid Build Coastguard Worker   entry->Close();
2779*6777b538SAndroid Build Coastguard Worker 
2780*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("some other key", &entry), IsOk());
2781*6777b538SAndroid Build Coastguard Worker   entry->Close();
2782*6777b538SAndroid Build Coastguard Worker }
2783*6777b538SAndroid Build Coastguard Worker 
2784*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries by keeping the rankings node around, with
2785*6777b538SAndroid Build Coastguard Worker // a fatal failure.
BackendInvalidEntry7()2786*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry7() {
2787*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB.
2788*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
2789*6777b538SAndroid Build Coastguard Worker   InitCache();
2790*6777b538SAndroid Build Coastguard Worker 
2791*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
2792*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
2793*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2794*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
2795*6777b538SAndroid Build Coastguard Worker   entry->Close();
2796*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
2797*6777b538SAndroid Build Coastguard Worker 
2798*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
2799*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
2800*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
2801*6777b538SAndroid Build Coastguard Worker 
2802*6777b538SAndroid Build Coastguard Worker   entry_impl->rankings()->Data()->next = 0;
2803*6777b538SAndroid Build Coastguard Worker   entry_impl->rankings()->Store();
2804*6777b538SAndroid Build Coastguard Worker   entry->Close();
2805*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2806*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
2807*6777b538SAndroid Build Coastguard Worker 
2808*6777b538SAndroid Build Coastguard Worker   // This should detect the bad entry.
2809*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry(second, &entry));
2810*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2811*6777b538SAndroid Build Coastguard Worker 
2812*6777b538SAndroid Build Coastguard Worker   // We should delete the cache. The list still has a corrupt node.
2813*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
2814*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
2815*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2816*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
2817*6777b538SAndroid Build Coastguard Worker }
2818*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry7)2819*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry7) {
2820*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry7();
2821*6777b538SAndroid Build Coastguard Worker }
2822*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry7)2823*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry7) {
2824*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2825*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry7();
2826*6777b538SAndroid Build Coastguard Worker }
2827*6777b538SAndroid Build Coastguard Worker 
2828*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries by keeping the rankings node around, with
2829*6777b538SAndroid Build Coastguard Worker // a non fatal failure.
BackendInvalidEntry8()2830*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry8() {
2831*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB
2832*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
2833*6777b538SAndroid Build Coastguard Worker   InitCache();
2834*6777b538SAndroid Build Coastguard Worker 
2835*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
2836*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
2837*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2838*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
2839*6777b538SAndroid Build Coastguard Worker   entry->Close();
2840*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
2841*6777b538SAndroid Build Coastguard Worker 
2842*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
2843*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
2844*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
2845*6777b538SAndroid Build Coastguard Worker 
2846*6777b538SAndroid Build Coastguard Worker   entry_impl->rankings()->Data()->contents = 0;
2847*6777b538SAndroid Build Coastguard Worker   entry_impl->rankings()->Store();
2848*6777b538SAndroid Build Coastguard Worker   entry->Close();
2849*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2850*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
2851*6777b538SAndroid Build Coastguard Worker 
2852*6777b538SAndroid Build Coastguard Worker   // This should detect the bad entry.
2853*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry(second, &entry));
2854*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2855*6777b538SAndroid Build Coastguard Worker 
2856*6777b538SAndroid Build Coastguard Worker   // We should not delete the cache.
2857*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
2858*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
2859*6777b538SAndroid Build Coastguard Worker   entry->Close();
2860*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
2861*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
2862*6777b538SAndroid Build Coastguard Worker }
2863*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry8)2864*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry8) {
2865*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry8();
2866*6777b538SAndroid Build Coastguard Worker }
2867*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry8)2868*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry8) {
2869*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2870*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry8();
2871*6777b538SAndroid Build Coastguard Worker }
2872*6777b538SAndroid Build Coastguard Worker 
2873*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries detected by enumerations. Note that these
2874*6777b538SAndroid Build Coastguard Worker // tests (xx9 to xx11) are basically just going though slightly different
2875*6777b538SAndroid Build Coastguard Worker // codepaths so they are tighlty coupled with the code, but that is better than
2876*6777b538SAndroid Build Coastguard Worker // not testing error handling code.
BackendInvalidEntry9(bool eviction)2877*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry9(bool eviction) {
2878*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB.
2879*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
2880*6777b538SAndroid Build Coastguard Worker   InitCache();
2881*6777b538SAndroid Build Coastguard Worker 
2882*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
2883*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
2884*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2885*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
2886*6777b538SAndroid Build Coastguard Worker   entry->Close();
2887*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
2888*6777b538SAndroid Build Coastguard Worker 
2889*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
2890*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
2891*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
2892*6777b538SAndroid Build Coastguard Worker 
2893*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Data()->state = 0xbad;
2894*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Store();
2895*6777b538SAndroid Build Coastguard Worker   entry->Close();
2896*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
2897*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
2898*6777b538SAndroid Build Coastguard Worker 
2899*6777b538SAndroid Build Coastguard Worker   if (eviction) {
2900*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
2901*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
2902*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
2903*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
2904*6777b538SAndroid Build Coastguard Worker   } else {
2905*6777b538SAndroid Build Coastguard Worker     // We should detect the problem through the list, but we should not delete
2906*6777b538SAndroid Build Coastguard Worker     // the entry, just fail the iteration.
2907*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<TestIterator> iter = CreateIterator();
2908*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
2909*6777b538SAndroid Build Coastguard Worker 
2910*6777b538SAndroid Build Coastguard Worker     // Now a full iteration will work, and return one entry.
2911*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
2912*6777b538SAndroid Build Coastguard Worker     entry->Close();
2913*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
2914*6777b538SAndroid Build Coastguard Worker 
2915*6777b538SAndroid Build Coastguard Worker     // This should detect what's left of the bad entry.
2916*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, OpenEntry(second, &entry));
2917*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, cache_->GetEntryCount());
2918*6777b538SAndroid Build Coastguard Worker   }
2919*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
2920*6777b538SAndroid Build Coastguard Worker }
2921*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry9)2922*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry9) {
2923*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry9(false);
2924*6777b538SAndroid Build Coastguard Worker }
2925*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidEntry9)2926*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry9) {
2927*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2928*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry9(false);
2929*6777b538SAndroid Build Coastguard Worker }
2930*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,TrimInvalidEntry9)2931*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry9) {
2932*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry9(true);
2933*6777b538SAndroid Build Coastguard Worker }
2934*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionTrimInvalidEntry9)2935*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry9) {
2936*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2937*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry9(true);
2938*6777b538SAndroid Build Coastguard Worker }
2939*6777b538SAndroid Build Coastguard Worker 
2940*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries detected by enumerations.
BackendInvalidEntry10(bool eviction)2941*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry10(bool eviction) {
2942*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB.
2943*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
2944*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
2945*6777b538SAndroid Build Coastguard Worker   InitCache();
2946*6777b538SAndroid Build Coastguard Worker 
2947*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
2948*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
2949*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
2950*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
2951*6777b538SAndroid Build Coastguard Worker   entry->Close();
2952*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(first, &entry), IsOk());
2953*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
2954*6777b538SAndroid Build Coastguard Worker   entry->Close();
2955*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
2956*6777b538SAndroid Build Coastguard Worker 
2957*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
2958*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
2959*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
2960*6777b538SAndroid Build Coastguard Worker 
2961*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Data()->state = 0xbad;
2962*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Store();
2963*6777b538SAndroid Build Coastguard Worker   entry->Close();
2964*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry), IsOk());
2965*6777b538SAndroid Build Coastguard Worker   entry->Close();
2966*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, cache_->GetEntryCount());
2967*6777b538SAndroid Build Coastguard Worker 
2968*6777b538SAndroid Build Coastguard Worker   // We have:
2969*6777b538SAndroid Build Coastguard Worker   // List 0: third -> second (bad).
2970*6777b538SAndroid Build Coastguard Worker   // List 1: first.
2971*6777b538SAndroid Build Coastguard Worker 
2972*6777b538SAndroid Build Coastguard Worker   if (eviction) {
2973*6777b538SAndroid Build Coastguard Worker     // Detection order: second -> first -> third.
2974*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
2975*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, cache_->GetEntryCount());
2976*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
2977*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, cache_->GetEntryCount());
2978*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
2979*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
2980*6777b538SAndroid Build Coastguard Worker   } else {
2981*6777b538SAndroid Build Coastguard Worker     // Detection order: third -> second -> first.
2982*6777b538SAndroid Build Coastguard Worker     // We should detect the problem through the list, but we should not delete
2983*6777b538SAndroid Build Coastguard Worker     // the entry.
2984*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<TestIterator> iter = CreateIterator();
2985*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
2986*6777b538SAndroid Build Coastguard Worker     entry->Close();
2987*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
2988*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(first, entry->GetKey());
2989*6777b538SAndroid Build Coastguard Worker     entry->Close();
2990*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
2991*6777b538SAndroid Build Coastguard Worker   }
2992*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
2993*6777b538SAndroid Build Coastguard Worker }
2994*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry10)2995*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry10) {
2996*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry10(false);
2997*6777b538SAndroid Build Coastguard Worker }
2998*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,TrimInvalidEntry10)2999*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry10) {
3000*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry10(true);
3001*6777b538SAndroid Build Coastguard Worker }
3002*6777b538SAndroid Build Coastguard Worker 
3003*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries detected by enumerations.
BackendInvalidEntry11(bool eviction)3004*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidEntry11(bool eviction) {
3005*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB.
3006*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
3007*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3008*6777b538SAndroid Build Coastguard Worker   InitCache();
3009*6777b538SAndroid Build Coastguard Worker 
3010*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
3011*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
3012*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3013*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
3014*6777b538SAndroid Build Coastguard Worker   entry->Close();
3015*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(first, &entry), IsOk());
3016*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
3017*6777b538SAndroid Build Coastguard Worker   entry->Close();
3018*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
3019*6777b538SAndroid Build Coastguard Worker   entry->Close();
3020*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(second, &entry), IsOk());
3021*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
3022*6777b538SAndroid Build Coastguard Worker 
3023*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
3024*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
3025*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
3026*6777b538SAndroid Build Coastguard Worker 
3027*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Data()->state = 0xbad;
3028*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Store();
3029*6777b538SAndroid Build Coastguard Worker   entry->Close();
3030*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry), IsOk());
3031*6777b538SAndroid Build Coastguard Worker   entry->Close();
3032*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
3033*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, cache_->GetEntryCount());
3034*6777b538SAndroid Build Coastguard Worker 
3035*6777b538SAndroid Build Coastguard Worker   // We have:
3036*6777b538SAndroid Build Coastguard Worker   // List 0: third.
3037*6777b538SAndroid Build Coastguard Worker   // List 1: second (bad) -> first.
3038*6777b538SAndroid Build Coastguard Worker 
3039*6777b538SAndroid Build Coastguard Worker   if (eviction) {
3040*6777b538SAndroid Build Coastguard Worker     // Detection order: third -> first -> second.
3041*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
3042*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(2, cache_->GetEntryCount());
3043*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
3044*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
3045*6777b538SAndroid Build Coastguard Worker     TrimForTest(false);
3046*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, cache_->GetEntryCount());
3047*6777b538SAndroid Build Coastguard Worker   } else {
3048*6777b538SAndroid Build Coastguard Worker     // Detection order: third -> second.
3049*6777b538SAndroid Build Coastguard Worker     // We should detect the problem through the list, but we should not delete
3050*6777b538SAndroid Build Coastguard Worker     // the entry, just fail the iteration.
3051*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<TestIterator> iter = CreateIterator();
3052*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
3053*6777b538SAndroid Build Coastguard Worker     entry->Close();
3054*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
3055*6777b538SAndroid Build Coastguard Worker 
3056*6777b538SAndroid Build Coastguard Worker     // Now a full iteration will work, and return two entries.
3057*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
3058*6777b538SAndroid Build Coastguard Worker     entry->Close();
3059*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
3060*6777b538SAndroid Build Coastguard Worker     entry->Close();
3061*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
3062*6777b538SAndroid Build Coastguard Worker   }
3063*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
3064*6777b538SAndroid Build Coastguard Worker }
3065*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidEntry11)3066*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidEntry11) {
3067*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry11(false);
3068*6777b538SAndroid Build Coastguard Worker }
3069*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,TrimInvalidEntry11)3070*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry11) {
3071*6777b538SAndroid Build Coastguard Worker   BackendInvalidEntry11(true);
3072*6777b538SAndroid Build Coastguard Worker }
3073*6777b538SAndroid Build Coastguard Worker 
3074*6777b538SAndroid Build Coastguard Worker // Tests handling of corrupt entries in the middle of a long eviction run.
BackendTrimInvalidEntry12()3075*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendTrimInvalidEntry12() {
3076*6777b538SAndroid Build Coastguard Worker   const int kSize = 0x3000;  // 12 kB
3077*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kSize * 10);
3078*6777b538SAndroid Build Coastguard Worker   InitCache();
3079*6777b538SAndroid Build Coastguard Worker 
3080*6777b538SAndroid Build Coastguard Worker   std::string first("some key");
3081*6777b538SAndroid Build Coastguard Worker   std::string second("something else");
3082*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3083*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
3084*6777b538SAndroid Build Coastguard Worker   entry->Close();
3085*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
3086*6777b538SAndroid Build Coastguard Worker 
3087*6777b538SAndroid Build Coastguard Worker   // Corrupt this entry.
3088*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryImpl* entry_impl =
3089*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::EntryImpl*>(entry);
3090*6777b538SAndroid Build Coastguard Worker 
3091*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Data()->state = 0xbad;
3092*6777b538SAndroid Build Coastguard Worker   entry_impl->entry()->Store();
3093*6777b538SAndroid Build Coastguard Worker   entry->Close();
3094*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry), IsOk());
3095*6777b538SAndroid Build Coastguard Worker   entry->Close();
3096*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry), IsOk());
3097*6777b538SAndroid Build Coastguard Worker   TrimForTest(true);
3098*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3099*6777b538SAndroid Build Coastguard Worker   entry->Close();
3100*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
3101*6777b538SAndroid Build Coastguard Worker }
3102*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,TrimInvalidEntry12)3103*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TrimInvalidEntry12) {
3104*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry12();
3105*6777b538SAndroid Build Coastguard Worker }
3106*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionTrimInvalidEntry12)3107*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry12) {
3108*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3109*6777b538SAndroid Build Coastguard Worker   BackendTrimInvalidEntry12();
3110*6777b538SAndroid Build Coastguard Worker }
3111*6777b538SAndroid Build Coastguard Worker 
3112*6777b538SAndroid Build Coastguard Worker // We want to be able to deal with messed up entries on disk.
BackendInvalidRankings2()3113*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidRankings2() {
3114*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3115*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3116*6777b538SAndroid Build Coastguard Worker   InitCache();
3117*6777b538SAndroid Build Coastguard Worker 
3118*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
3119*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
3120*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("some other key", &entry2), IsOk());
3121*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3122*6777b538SAndroid Build Coastguard Worker 
3123*6777b538SAndroid Build Coastguard Worker   // CheckCacheIntegrity will fail at this point.
3124*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
3125*6777b538SAndroid Build Coastguard Worker }
3126*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidRankings2)3127*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidRankings2) {
3128*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings2();
3129*6777b538SAndroid Build Coastguard Worker }
3130*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidRankings2)3131*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) {
3132*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3133*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings2();
3134*6777b538SAndroid Build Coastguard Worker }
3135*6777b538SAndroid Build Coastguard Worker 
3136*6777b538SAndroid Build Coastguard Worker // If the LRU is corrupt, we delete the cache.
BackendInvalidRankings()3137*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendInvalidRankings() {
3138*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3139*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3140*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
3141*6777b538SAndroid Build Coastguard Worker   entry->Close();
3142*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
3143*6777b538SAndroid Build Coastguard Worker 
3144*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry));
3145*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // Allow the restart to finish.
3146*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3147*6777b538SAndroid Build Coastguard Worker }
3148*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidRankingsSuccess)3149*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) {
3150*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3151*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3152*6777b538SAndroid Build Coastguard Worker   InitCache();
3153*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings();
3154*6777b538SAndroid Build Coastguard Worker }
3155*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidRankingsSuccess)3156*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) {
3157*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3158*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3159*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3160*6777b538SAndroid Build Coastguard Worker   InitCache();
3161*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings();
3162*6777b538SAndroid Build Coastguard Worker }
3163*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InvalidRankingsFailure)3164*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InvalidRankingsFailure) {
3165*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3166*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3167*6777b538SAndroid Build Coastguard Worker   InitCache();
3168*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3169*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings();
3170*6777b538SAndroid Build Coastguard Worker }
3171*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionInvalidRankingsFailure)3172*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) {
3173*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3174*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3175*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3176*6777b538SAndroid Build Coastguard Worker   InitCache();
3177*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3178*6777b538SAndroid Build Coastguard Worker   BackendInvalidRankings();
3179*6777b538SAndroid Build Coastguard Worker }
3180*6777b538SAndroid Build Coastguard Worker 
3181*6777b538SAndroid Build Coastguard Worker // If the LRU is corrupt and we have open entries, we disable the cache.
BackendDisable()3182*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDisable() {
3183*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
3184*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3185*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry1), IsOk());
3186*6777b538SAndroid Build Coastguard Worker 
3187*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry2));
3188*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3189*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, CreateEntry("Something new", &entry2));
3190*6777b538SAndroid Build Coastguard Worker 
3191*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3192*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
3193*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // This one actually allows that task to complete.
3194*6777b538SAndroid Build Coastguard Worker 
3195*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3196*6777b538SAndroid Build Coastguard Worker }
3197*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableSuccess)3198*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableSuccess) {
3199*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3200*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3201*6777b538SAndroid Build Coastguard Worker   InitCache();
3202*6777b538SAndroid Build Coastguard Worker   BackendDisable();
3203*6777b538SAndroid Build Coastguard Worker }
3204*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableSuccess)3205*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) {
3206*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3207*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3208*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3209*6777b538SAndroid Build Coastguard Worker   InitCache();
3210*6777b538SAndroid Build Coastguard Worker   BackendDisable();
3211*6777b538SAndroid Build Coastguard Worker }
3212*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableFailure)3213*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableFailure) {
3214*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3215*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3216*6777b538SAndroid Build Coastguard Worker   InitCache();
3217*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3218*6777b538SAndroid Build Coastguard Worker   BackendDisable();
3219*6777b538SAndroid Build Coastguard Worker }
3220*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableFailure)3221*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) {
3222*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3223*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3224*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3225*6777b538SAndroid Build Coastguard Worker   InitCache();
3226*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3227*6777b538SAndroid Build Coastguard Worker   BackendDisable();
3228*6777b538SAndroid Build Coastguard Worker }
3229*6777b538SAndroid Build Coastguard Worker 
3230*6777b538SAndroid Build Coastguard Worker // This is another type of corruption on the LRU; disable the cache.
BackendDisable2()3231*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDisable2() {
3232*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(8, cache_->GetEntryCount());
3233*6777b538SAndroid Build Coastguard Worker 
3234*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3235*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3236*6777b538SAndroid Build Coastguard Worker   int count = 0;
3237*6777b538SAndroid Build Coastguard Worker   while (iter->OpenNextEntry(&entry) == net::OK) {
3238*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(nullptr != entry);
3239*6777b538SAndroid Build Coastguard Worker     entry->Close();
3240*6777b538SAndroid Build Coastguard Worker     count++;
3241*6777b538SAndroid Build Coastguard Worker     ASSERT_LT(count, 9);
3242*6777b538SAndroid Build Coastguard Worker   };
3243*6777b538SAndroid Build Coastguard Worker 
3244*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
3245*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3246*6777b538SAndroid Build Coastguard Worker }
3247*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableSuccess2)3248*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableSuccess2) {
3249*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop"));
3250*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3251*6777b538SAndroid Build Coastguard Worker   InitCache();
3252*6777b538SAndroid Build Coastguard Worker   BackendDisable2();
3253*6777b538SAndroid Build Coastguard Worker }
3254*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableSuccess2)3255*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) {
3256*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop"));
3257*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3258*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3259*6777b538SAndroid Build Coastguard Worker   InitCache();
3260*6777b538SAndroid Build Coastguard Worker   BackendDisable2();
3261*6777b538SAndroid Build Coastguard Worker }
3262*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableFailure2)3263*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableFailure2) {
3264*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop"));
3265*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3266*6777b538SAndroid Build Coastguard Worker   InitCache();
3267*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3268*6777b538SAndroid Build Coastguard Worker   BackendDisable2();
3269*6777b538SAndroid Build Coastguard Worker }
3270*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableFailure2)3271*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) {
3272*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("list_loop"));
3273*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3274*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3275*6777b538SAndroid Build Coastguard Worker   InitCache();
3276*6777b538SAndroid Build Coastguard Worker   SetTestMode();  // Fail cache reinitialization.
3277*6777b538SAndroid Build Coastguard Worker   BackendDisable2();
3278*6777b538SAndroid Build Coastguard Worker }
3279*6777b538SAndroid Build Coastguard Worker 
3280*6777b538SAndroid Build Coastguard Worker // If the index size changes when we disable the cache, we should not crash.
BackendDisable3()3281*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDisable3() {
3282*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
3283*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3284*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
3285*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry1), IsOk());
3286*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3287*6777b538SAndroid Build Coastguard Worker 
3288*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry2));
3289*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
3290*6777b538SAndroid Build Coastguard Worker 
3291*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("Something new", &entry2), IsOk());
3292*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3293*6777b538SAndroid Build Coastguard Worker 
3294*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3295*6777b538SAndroid Build Coastguard Worker }
3296*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableSuccess3)3297*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableSuccess3) {
3298*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3299*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3300*6777b538SAndroid Build Coastguard Worker   SetMaxSize(20 * 1024 * 1024);
3301*6777b538SAndroid Build Coastguard Worker   InitCache();
3302*6777b538SAndroid Build Coastguard Worker   BackendDisable3();
3303*6777b538SAndroid Build Coastguard Worker }
3304*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableSuccess3)3305*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) {
3306*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3307*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3308*6777b538SAndroid Build Coastguard Worker   SetMaxSize(20 * 1024 * 1024);
3309*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3310*6777b538SAndroid Build Coastguard Worker   InitCache();
3311*6777b538SAndroid Build Coastguard Worker   BackendDisable3();
3312*6777b538SAndroid Build Coastguard Worker }
3313*6777b538SAndroid Build Coastguard Worker 
3314*6777b538SAndroid Build Coastguard Worker // If we disable the cache, already open entries should work as far as possible.
BackendDisable4()3315*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDisable4() {
3316*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2, *entry3, *entry4;
3317*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3318*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry1), IsOk());
3319*6777b538SAndroid Build Coastguard Worker 
3320*6777b538SAndroid Build Coastguard Worker   char key2[2000];
3321*6777b538SAndroid Build Coastguard Worker   char key3[20000];
3322*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(key2, sizeof(key2), true);
3323*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(key3, sizeof(key3), true);
3324*6777b538SAndroid Build Coastguard Worker   key2[sizeof(key2) - 1] = '\0';
3325*6777b538SAndroid Build Coastguard Worker   key3[sizeof(key3) - 1] = '\0';
3326*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key2, &entry2), IsOk());
3327*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key3, &entry3), IsOk());
3328*6777b538SAndroid Build Coastguard Worker 
3329*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 20000;
3330*6777b538SAndroid Build Coastguard Worker   auto buf = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
3331*6777b538SAndroid Build Coastguard Worker   memset(buf->data(), 0, kBufSize);
3332*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false));
3333*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false));
3334*6777b538SAndroid Build Coastguard Worker 
3335*6777b538SAndroid Build Coastguard Worker   // This line should disable the cache but not delete it.
3336*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry4));
3337*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3338*6777b538SAndroid Build Coastguard Worker 
3339*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4));
3340*6777b538SAndroid Build Coastguard Worker 
3341*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(100, ReadData(entry2, 0, 0, buf.get(), 100));
3342*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false));
3343*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(100, WriteData(entry2, 1, 0, buf.get(), 100, false));
3344*6777b538SAndroid Build Coastguard Worker 
3345*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf.get(), kBufSize));
3346*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false));
3347*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf.get(), kBufSize, false));
3348*6777b538SAndroid Build Coastguard Worker 
3349*6777b538SAndroid Build Coastguard Worker   std::string key = entry2->GetKey();
3350*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(key2) - 1, key.size());
3351*6777b538SAndroid Build Coastguard Worker   key = entry3->GetKey();
3352*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(key3) - 1, key.size());
3353*6777b538SAndroid Build Coastguard Worker 
3354*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3355*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3356*6777b538SAndroid Build Coastguard Worker   entry3->Close();
3357*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
3358*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();  // This one actually allows that task to complete.
3359*6777b538SAndroid Build Coastguard Worker 
3360*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3361*6777b538SAndroid Build Coastguard Worker }
3362*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisableSuccess4)3363*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisableSuccess4) {
3364*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3365*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3366*6777b538SAndroid Build Coastguard Worker   InitCache();
3367*6777b538SAndroid Build Coastguard Worker   BackendDisable4();
3368*6777b538SAndroid Build Coastguard Worker }
3369*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisableSuccess4)3370*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) {
3371*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings"));
3372*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3373*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3374*6777b538SAndroid Build Coastguard Worker   InitCache();
3375*6777b538SAndroid Build Coastguard Worker   BackendDisable4();
3376*6777b538SAndroid Build Coastguard Worker }
3377*6777b538SAndroid Build Coastguard Worker 
3378*6777b538SAndroid Build Coastguard Worker // Tests the exposed API with a disabled cache.
BackendDisabledAPI()3379*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDisabledAPI() {
3380*6777b538SAndroid Build Coastguard Worker   cache_impl_->SetUnitTestMode();  // Simulate failure restarting the cache.
3381*6777b538SAndroid Build Coastguard Worker 
3382*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
3383*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
3384*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
3385*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry1), IsOk());
3386*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3387*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry2));
3388*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
3389*6777b538SAndroid Build Coastguard Worker   // The cache should be disabled.
3390*6777b538SAndroid Build Coastguard Worker 
3391*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType());
3392*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_->GetEntryCount());
3393*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("First", &entry2));
3394*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, CreateEntry("Something new", &entry2));
3395*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, DoomEntry("First"));
3396*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, DoomAllEntries());
3397*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, DoomEntriesBetween(Time(), Time::Now()));
3398*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, DoomEntriesSince(Time()));
3399*6777b538SAndroid Build Coastguard Worker   iter = CreateIterator();
3400*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, iter->OpenNextEntry(&entry2));
3401*6777b538SAndroid Build Coastguard Worker 
3402*6777b538SAndroid Build Coastguard Worker   base::StringPairs stats;
3403*6777b538SAndroid Build Coastguard Worker   cache_->GetStats(&stats);
3404*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(stats.empty());
3405*6777b538SAndroid Build Coastguard Worker   OnExternalCacheHit("First");
3406*6777b538SAndroid Build Coastguard Worker }
3407*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DisabledAPI)3408*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DisabledAPI) {
3409*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3410*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3411*6777b538SAndroid Build Coastguard Worker   InitCache();
3412*6777b538SAndroid Build Coastguard Worker   BackendDisabledAPI();
3413*6777b538SAndroid Build Coastguard Worker }
3414*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDisabledAPI)3415*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDisabledAPI) {
3416*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3417*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3418*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3419*6777b538SAndroid Build Coastguard Worker   InitCache();
3420*6777b538SAndroid Build Coastguard Worker   BackendDisabledAPI();
3421*6777b538SAndroid Build Coastguard Worker }
3422*6777b538SAndroid Build Coastguard Worker 
3423*6777b538SAndroid Build Coastguard Worker // Test that some eviction of some kind happens.
BackendEviction()3424*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendEviction() {
3425*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 200 * 1024;
3426*6777b538SAndroid Build Coastguard Worker   const int kMaxEntryCount = 20;
3427*6777b538SAndroid Build Coastguard Worker   const int kWriteSize = kMaxSize / kMaxEntryCount;
3428*6777b538SAndroid Build Coastguard Worker 
3429*6777b538SAndroid Build Coastguard Worker   const int kWriteEntryCount = kMaxEntryCount * 2;
3430*6777b538SAndroid Build Coastguard Worker 
3431*6777b538SAndroid Build Coastguard Worker   static_assert(kWriteEntryCount * kWriteSize > kMaxSize,
3432*6777b538SAndroid Build Coastguard Worker                 "must write more than MaxSize");
3433*6777b538SAndroid Build Coastguard Worker 
3434*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
3435*6777b538SAndroid Build Coastguard Worker   InitSparseCache(nullptr, nullptr);
3436*6777b538SAndroid Build Coastguard Worker 
3437*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kWriteSize);
3438*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kWriteSize, false);
3439*6777b538SAndroid Build Coastguard Worker 
3440*6777b538SAndroid Build Coastguard Worker   std::string key_prefix("prefix");
3441*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kWriteEntryCount; ++i) {
3442*6777b538SAndroid Build Coastguard Worker     AddDelay();
3443*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry = nullptr;
3444*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key_prefix + base::NumberToString(i), &entry),
3445*6777b538SAndroid Build Coastguard Worker                 IsOk());
3446*6777b538SAndroid Build Coastguard Worker     disk_cache::ScopedEntryPtr entry_closer(entry);
3447*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kWriteSize,
3448*6777b538SAndroid Build Coastguard Worker               WriteData(entry, 1, 0, buffer.get(), kWriteSize, false));
3449*6777b538SAndroid Build Coastguard Worker   }
3450*6777b538SAndroid Build Coastguard Worker 
3451*6777b538SAndroid Build Coastguard Worker   int size = CalculateSizeOfAllEntries();
3452*6777b538SAndroid Build Coastguard Worker   EXPECT_GT(kMaxSize, size);
3453*6777b538SAndroid Build Coastguard Worker }
3454*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BackendEviction)3455*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BackendEviction) {
3456*6777b538SAndroid Build Coastguard Worker   BackendEviction();
3457*6777b538SAndroid Build Coastguard Worker }
3458*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyBackendEviction)3459*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyBackendEviction) {
3460*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
3461*6777b538SAndroid Build Coastguard Worker   BackendEviction();
3462*6777b538SAndroid Build Coastguard Worker }
3463*6777b538SAndroid Build Coastguard Worker 
3464*6777b538SAndroid Build Coastguard Worker // TODO(morlovich): Enable BackendEviction test for simple cache after
3465*6777b538SAndroid Build Coastguard Worker // performance problems are addressed. See crbug.com/588184 for more
3466*6777b538SAndroid Build Coastguard Worker // information.
3467*6777b538SAndroid Build Coastguard Worker 
3468*6777b538SAndroid Build Coastguard Worker // This overly specific looking test is a regression test aimed at
3469*6777b538SAndroid Build Coastguard Worker // crbug.com/589186.
TEST_F(DiskCacheBackendTest,MemoryOnlyUseAfterFree)3470*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyUseAfterFree) {
3471*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
3472*6777b538SAndroid Build Coastguard Worker 
3473*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 200 * 1024;
3474*6777b538SAndroid Build Coastguard Worker   const int kMaxEntryCount = 20;
3475*6777b538SAndroid Build Coastguard Worker   const int kWriteSize = kMaxSize / kMaxEntryCount;
3476*6777b538SAndroid Build Coastguard Worker 
3477*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
3478*6777b538SAndroid Build Coastguard Worker   InitCache();
3479*6777b538SAndroid Build Coastguard Worker 
3480*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kWriteSize);
3481*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kWriteSize, false);
3482*6777b538SAndroid Build Coastguard Worker 
3483*6777b538SAndroid Build Coastguard Worker   // Create an entry to be our sparse entry that gets written later.
3484*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3485*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first parent", &entry), IsOk());
3486*6777b538SAndroid Build Coastguard Worker   disk_cache::ScopedEntryPtr first_parent(entry);
3487*6777b538SAndroid Build Coastguard Worker 
3488*6777b538SAndroid Build Coastguard Worker   // Create a ton of entries, and keep them open, to put the cache well above
3489*6777b538SAndroid Build Coastguard Worker   // its eviction threshhold.
3490*6777b538SAndroid Build Coastguard Worker   const int kTooManyEntriesCount = kMaxEntryCount * 2;
3491*6777b538SAndroid Build Coastguard Worker   std::list<disk_cache::ScopedEntryPtr> open_entries;
3492*6777b538SAndroid Build Coastguard Worker   std::string key_prefix("prefix");
3493*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kTooManyEntriesCount; ++i) {
3494*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key_prefix + base::NumberToString(i), &entry),
3495*6777b538SAndroid Build Coastguard Worker                 IsOk());
3496*6777b538SAndroid Build Coastguard Worker     // Not checking the result because it will start to fail once the max size
3497*6777b538SAndroid Build Coastguard Worker     // is reached.
3498*6777b538SAndroid Build Coastguard Worker     WriteData(entry, 1, 0, buffer.get(), kWriteSize, false);
3499*6777b538SAndroid Build Coastguard Worker     open_entries.push_back(disk_cache::ScopedEntryPtr(entry));
3500*6777b538SAndroid Build Coastguard Worker   }
3501*6777b538SAndroid Build Coastguard Worker 
3502*6777b538SAndroid Build Coastguard Worker   // Writing this sparse data should not crash. Ignoring the result because
3503*6777b538SAndroid Build Coastguard Worker   // we're only concerned with not crashing in this particular test.
3504*6777b538SAndroid Build Coastguard Worker   first_parent->WriteSparseData(32768, buffer.get(), 1024,
3505*6777b538SAndroid Build Coastguard Worker                                 net::CompletionOnceCallback());
3506*6777b538SAndroid Build Coastguard Worker }
3507*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryCapsWritesToMaxSize)3508*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryCapsWritesToMaxSize) {
3509*6777b538SAndroid Build Coastguard Worker   // Verify that the memory backend won't grow beyond its max size if lots of
3510*6777b538SAndroid Build Coastguard Worker   // open entries (each smaller than the max entry size) are trying to write
3511*6777b538SAndroid Build Coastguard Worker   // beyond the max size.
3512*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
3513*6777b538SAndroid Build Coastguard Worker 
3514*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 100 * 1024;       // 100KB cache
3515*6777b538SAndroid Build Coastguard Worker   const int kNumEntries = 20;            // 20 entries to write
3516*6777b538SAndroid Build Coastguard Worker   const int kWriteSize = kMaxSize / 10;  // Each entry writes 1/10th the max
3517*6777b538SAndroid Build Coastguard Worker 
3518*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
3519*6777b538SAndroid Build Coastguard Worker   InitCache();
3520*6777b538SAndroid Build Coastguard Worker 
3521*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kWriteSize);
3522*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kWriteSize, false);
3523*6777b538SAndroid Build Coastguard Worker 
3524*6777b538SAndroid Build Coastguard Worker   // Create an entry to be the final entry that gets written later.
3525*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3526*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("final", &entry), IsOk());
3527*6777b538SAndroid Build Coastguard Worker   disk_cache::ScopedEntryPtr final_entry(entry);
3528*6777b538SAndroid Build Coastguard Worker 
3529*6777b538SAndroid Build Coastguard Worker   // Create a ton of entries, write to the cache, and keep the entries open.
3530*6777b538SAndroid Build Coastguard Worker   // They should start failing writes once the cache fills.
3531*6777b538SAndroid Build Coastguard Worker   std::list<disk_cache::ScopedEntryPtr> open_entries;
3532*6777b538SAndroid Build Coastguard Worker   std::string key_prefix("prefix");
3533*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kNumEntries; ++i) {
3534*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key_prefix + base::NumberToString(i), &entry),
3535*6777b538SAndroid Build Coastguard Worker                 IsOk());
3536*6777b538SAndroid Build Coastguard Worker     WriteData(entry, 1, 0, buffer.get(), kWriteSize, false);
3537*6777b538SAndroid Build Coastguard Worker     open_entries.push_back(disk_cache::ScopedEntryPtr(entry));
3538*6777b538SAndroid Build Coastguard Worker   }
3539*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(kMaxSize, CalculateSizeOfAllEntries());
3540*6777b538SAndroid Build Coastguard Worker 
3541*6777b538SAndroid Build Coastguard Worker   // Any more writing at this point should cause an error.
3542*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
3543*6777b538SAndroid Build Coastguard Worker       WriteData(final_entry.get(), 1, 0, buffer.get(), kWriteSize, false),
3544*6777b538SAndroid Build Coastguard Worker       IsError(net::ERR_INSUFFICIENT_RESOURCES));
3545*6777b538SAndroid Build Coastguard Worker }
3546*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheTest,Backend_UsageStatsTimer)3547*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, Backend_UsageStatsTimer) {
3548*6777b538SAndroid Build Coastguard Worker   MessageLoopHelper helper;
3549*6777b538SAndroid Build Coastguard Worker 
3550*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CleanupCacheDir());
3551*6777b538SAndroid Build Coastguard Worker   // Want to use our thread since we call SyncInit ourselves.
3552*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache(
3553*6777b538SAndroid Build Coastguard Worker       std::make_unique<disk_cache::BackendImpl>(
3554*6777b538SAndroid Build Coastguard Worker           cache_path_, nullptr,
3555*6777b538SAndroid Build Coastguard Worker           base::SingleThreadTaskRunner::GetCurrentDefault(), net::DISK_CACHE,
3556*6777b538SAndroid Build Coastguard Worker           nullptr));
3557*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != cache.get());
3558*6777b538SAndroid Build Coastguard Worker   cache->SetUnitTestMode();
3559*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(cache->SyncInit(), IsOk());
3560*6777b538SAndroid Build Coastguard Worker 
3561*6777b538SAndroid Build Coastguard Worker   // Wait for a callback that never comes... about 2 secs :). The message loop
3562*6777b538SAndroid Build Coastguard Worker   // has to run to allow invocation of the usage timer.
3563*6777b538SAndroid Build Coastguard Worker   helper.WaitUntilCacheIoFinished(1);
3564*6777b538SAndroid Build Coastguard Worker }
3565*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,TimerNotCreated)3566*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TimerNotCreated) {
3567*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("wrong_version"));
3568*6777b538SAndroid Build Coastguard Worker 
3569*6777b538SAndroid Build Coastguard Worker   // Want to use our thread since we call SyncInit ourselves.
3570*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendImpl> cache(
3571*6777b538SAndroid Build Coastguard Worker       std::make_unique<disk_cache::BackendImpl>(
3572*6777b538SAndroid Build Coastguard Worker           cache_path_, nullptr,
3573*6777b538SAndroid Build Coastguard Worker           base::SingleThreadTaskRunner::GetCurrentDefault(), net::DISK_CACHE,
3574*6777b538SAndroid Build Coastguard Worker           nullptr));
3575*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != cache.get());
3576*6777b538SAndroid Build Coastguard Worker   cache->SetUnitTestMode();
3577*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(net::OK, cache->SyncInit());
3578*6777b538SAndroid Build Coastguard Worker 
3579*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == cache->GetTimerForTest());
3580*6777b538SAndroid Build Coastguard Worker 
3581*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
3582*6777b538SAndroid Build Coastguard Worker }
3583*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,Backend_UsageStats)3584*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, Backend_UsageStats) {
3585*6777b538SAndroid Build Coastguard Worker   InitCache();
3586*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3587*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
3588*6777b538SAndroid Build Coastguard Worker   entry->Close();
3589*6777b538SAndroid Build Coastguard Worker   FlushQueueForTest();
3590*6777b538SAndroid Build Coastguard Worker 
3591*6777b538SAndroid Build Coastguard Worker   disk_cache::StatsItems stats;
3592*6777b538SAndroid Build Coastguard Worker   cache_->GetStats(&stats);
3593*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(stats.empty());
3594*6777b538SAndroid Build Coastguard Worker 
3595*6777b538SAndroid Build Coastguard Worker   disk_cache::StatsItems::value_type hits("Create hit", "0x1");
3596*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, base::ranges::count(stats, hits));
3597*6777b538SAndroid Build Coastguard Worker 
3598*6777b538SAndroid Build Coastguard Worker   ResetCaches();
3599*6777b538SAndroid Build Coastguard Worker 
3600*6777b538SAndroid Build Coastguard Worker   // Now open the cache and verify that the stats are still there.
3601*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3602*6777b538SAndroid Build Coastguard Worker   InitCache();
3603*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3604*6777b538SAndroid Build Coastguard Worker 
3605*6777b538SAndroid Build Coastguard Worker   stats.clear();
3606*6777b538SAndroid Build Coastguard Worker   cache_->GetStats(&stats);
3607*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(stats.empty());
3608*6777b538SAndroid Build Coastguard Worker 
3609*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, base::ranges::count(stats, hits));
3610*6777b538SAndroid Build Coastguard Worker }
3611*6777b538SAndroid Build Coastguard Worker 
BackendDoomAll()3612*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDoomAll() {
3613*6777b538SAndroid Build Coastguard Worker   InitCache();
3614*6777b538SAndroid Build Coastguard Worker 
3615*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
3616*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry1), IsOk());
3617*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry2), IsOk());
3618*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3619*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3620*6777b538SAndroid Build Coastguard Worker 
3621*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry1), IsOk());
3622*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry2), IsOk());
3623*6777b538SAndroid Build Coastguard Worker 
3624*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(4, cache_->GetEntryCount());
3625*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
3626*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, cache_->GetEntryCount());
3627*6777b538SAndroid Build Coastguard Worker 
3628*6777b538SAndroid Build Coastguard Worker   // We should stop posting tasks at some point (if we post any).
3629*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
3630*6777b538SAndroid Build Coastguard Worker 
3631*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry3, *entry4;
3632*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, OpenEntry("third", &entry3));
3633*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry3), IsOk());
3634*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry4), IsOk());
3635*6777b538SAndroid Build Coastguard Worker 
3636*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
3637*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, cache_->GetEntryCount());
3638*6777b538SAndroid Build Coastguard Worker 
3639*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3640*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3641*6777b538SAndroid Build Coastguard Worker   entry3->Doom();  // The entry should be already doomed, but this must work.
3642*6777b538SAndroid Build Coastguard Worker   entry3->Close();
3643*6777b538SAndroid Build Coastguard Worker   entry4->Close();
3644*6777b538SAndroid Build Coastguard Worker 
3645*6777b538SAndroid Build Coastguard Worker   // Now try with all references released.
3646*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("third", &entry1), IsOk());
3647*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("fourth", &entry2), IsOk());
3648*6777b538SAndroid Build Coastguard Worker   entry1->Close();
3649*6777b538SAndroid Build Coastguard Worker   entry2->Close();
3650*6777b538SAndroid Build Coastguard Worker 
3651*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2, cache_->GetEntryCount());
3652*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
3653*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, cache_->GetEntryCount());
3654*6777b538SAndroid Build Coastguard Worker 
3655*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
3656*6777b538SAndroid Build Coastguard Worker }
3657*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomAll)3658*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomAll) {
3659*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
3660*6777b538SAndroid Build Coastguard Worker }
3661*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDoomAll)3662*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) {
3663*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3664*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
3665*6777b538SAndroid Build Coastguard Worker }
3666*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemoryOnlyDoomAll)3667*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) {
3668*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
3669*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
3670*6777b538SAndroid Build Coastguard Worker }
3671*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,AppCacheOnlyDoomAll)3672*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) {
3673*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3674*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
3675*6777b538SAndroid Build Coastguard Worker }
3676*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheOnlyDoomAll)3677*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheOnlyDoomAll) {
3678*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
3679*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
3680*6777b538SAndroid Build Coastguard Worker }
3681*6777b538SAndroid Build Coastguard Worker 
3682*6777b538SAndroid Build Coastguard Worker // If the index size changes when we doom the cache, we should not crash.
BackendDoomAll2()3683*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDoomAll2() {
3684*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, cache_->GetEntryCount());
3685*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(DoomAllEntries(), IsOk());
3686*6777b538SAndroid Build Coastguard Worker 
3687*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3688*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("Something new", &entry), IsOk());
3689*6777b538SAndroid Build Coastguard Worker   entry->Close();
3690*6777b538SAndroid Build Coastguard Worker 
3691*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3692*6777b538SAndroid Build Coastguard Worker }
3693*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,DoomAll2)3694*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DoomAll2) {
3695*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3696*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3697*6777b538SAndroid Build Coastguard Worker   SetMaxSize(20 * 1024 * 1024);
3698*6777b538SAndroid Build Coastguard Worker   InitCache();
3699*6777b538SAndroid Build Coastguard Worker   BackendDoomAll2();
3700*6777b538SAndroid Build Coastguard Worker }
3701*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,NewEvictionDoomAll2)3702*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) {
3703*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("bad_rankings2"));
3704*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
3705*6777b538SAndroid Build Coastguard Worker   SetMaxSize(20 * 1024 * 1024);
3706*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
3707*6777b538SAndroid Build Coastguard Worker   InitCache();
3708*6777b538SAndroid Build Coastguard Worker   BackendDoomAll2();
3709*6777b538SAndroid Build Coastguard Worker }
3710*6777b538SAndroid Build Coastguard Worker 
3711*6777b538SAndroid Build Coastguard Worker // We should be able to create the same entry on multiple simultaneous instances
3712*6777b538SAndroid Build Coastguard Worker // of the cache.
TEST_F(DiskCacheTest,MultipleInstances)3713*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, MultipleInstances) {
3714*6777b538SAndroid Build Coastguard Worker   base::ScopedTempDir store1, store2;
3715*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(store1.CreateUniqueTempDir());
3716*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(store2.CreateUniqueTempDir());
3717*6777b538SAndroid Build Coastguard Worker 
3718*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
3719*6777b538SAndroid Build Coastguard Worker 
3720*6777b538SAndroid Build Coastguard Worker   const int kNumberOfCaches = 2;
3721*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::Backend> caches[kNumberOfCaches];
3722*6777b538SAndroid Build Coastguard Worker 
3723*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
3724*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
3725*6777b538SAndroid Build Coastguard Worker       store1.GetPath(), 0, disk_cache::ResetHandling::kNeverReset,
3726*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb.callback());
3727*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
3728*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
3729*6777b538SAndroid Build Coastguard Worker   caches[0] = std::move(rv.backend);
3730*6777b538SAndroid Build Coastguard Worker   rv = disk_cache::CreateCacheBackend(
3731*6777b538SAndroid Build Coastguard Worker       net::GENERATED_BYTE_CODE_CACHE, net::CACHE_BACKEND_DEFAULT,
3732*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, store2.GetPath(), 0,
3733*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
3734*6777b538SAndroid Build Coastguard Worker       cb.callback());
3735*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
3736*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
3737*6777b538SAndroid Build Coastguard Worker   caches[1] = std::move(rv.backend);
3738*6777b538SAndroid Build Coastguard Worker 
3739*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(caches[0].get() != nullptr && caches[1].get() != nullptr);
3740*6777b538SAndroid Build Coastguard Worker 
3741*6777b538SAndroid Build Coastguard Worker   std::string key("the first key");
3742*6777b538SAndroid Build Coastguard Worker   for (auto& cache : caches) {
3743*6777b538SAndroid Build Coastguard Worker     TestEntryResultCompletionCallback cb2;
3744*6777b538SAndroid Build Coastguard Worker     EntryResult result = cache->CreateEntry(key, net::HIGHEST, cb2.callback());
3745*6777b538SAndroid Build Coastguard Worker     result = cb2.GetResult(std::move(result));
3746*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(result.net_error(), IsOk());
3747*6777b538SAndroid Build Coastguard Worker     result.ReleaseEntry()->Close();
3748*6777b538SAndroid Build Coastguard Worker   }
3749*6777b538SAndroid Build Coastguard Worker }
3750*6777b538SAndroid Build Coastguard Worker 
3751*6777b538SAndroid Build Coastguard Worker // Test the six regions of the curve that determines the max cache size.
TEST_F(DiskCacheTest,AutomaticMaxSize)3752*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheTest, AutomaticMaxSize) {
3753*6777b538SAndroid Build Coastguard Worker   using disk_cache::kDefaultCacheSize;
3754*6777b538SAndroid Build Coastguard Worker   int64_t large_size = kDefaultCacheSize;
3755*6777b538SAndroid Build Coastguard Worker 
3756*6777b538SAndroid Build Coastguard Worker   // Region 1: expected = available * 0.8
3757*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ((kDefaultCacheSize - 1) * 8 / 10,
3758*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size - 1));
3759*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 8 / 10,
3760*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size));
3761*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize - 1,
3762*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 10 / 8 - 1));
3763*6777b538SAndroid Build Coastguard Worker 
3764*6777b538SAndroid Build Coastguard Worker   // Region 2: expected = default_size
3765*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize,
3766*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 10 / 8));
3767*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize,
3768*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 10 - 1));
3769*6777b538SAndroid Build Coastguard Worker 
3770*6777b538SAndroid Build Coastguard Worker   // Region 3: expected = available * 0.1
3771*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize, disk_cache::PreferredCacheSize(large_size * 10));
3772*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ((kDefaultCacheSize * 25 - 1) / 10,
3773*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 25 - 1));
3774*6777b538SAndroid Build Coastguard Worker 
3775*6777b538SAndroid Build Coastguard Worker   // Region 4: expected = default_size * 2.5
3776*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 25 / 10,
3777*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 25));
3778*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 25 / 10,
3779*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 100 - 1));
3780*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 25 / 10,
3781*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 100));
3782*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 25 / 10,
3783*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 250 - 1));
3784*6777b538SAndroid Build Coastguard Worker 
3785*6777b538SAndroid Build Coastguard Worker   // Region 5: expected = available * 0.1
3786*6777b538SAndroid Build Coastguard Worker   int64_t largest_size = kDefaultCacheSize * 4;
3787*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDefaultCacheSize * 25 / 10,
3788*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(large_size * 250));
3789*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(largest_size - 1,
3790*6777b538SAndroid Build Coastguard Worker             disk_cache::PreferredCacheSize(largest_size * 100 - 1));
3791*6777b538SAndroid Build Coastguard Worker 
3792*6777b538SAndroid Build Coastguard Worker   // Region 6: expected = largest possible size
3793*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(largest_size, disk_cache::PreferredCacheSize(largest_size * 100));
3794*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(largest_size, disk_cache::PreferredCacheSize(largest_size * 10000));
3795*6777b538SAndroid Build Coastguard Worker }
3796*6777b538SAndroid Build Coastguard Worker 
3797*6777b538SAndroid Build Coastguard Worker // Make sure that we keep the total memory used by the internal buffers under
3798*6777b538SAndroid Build Coastguard Worker // control.
TEST_F(DiskCacheBackendTest,TotalBuffersSize1)3799*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TotalBuffersSize1) {
3800*6777b538SAndroid Build Coastguard Worker   InitCache();
3801*6777b538SAndroid Build Coastguard Worker   std::string key("the first key");
3802*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3803*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
3804*6777b538SAndroid Build Coastguard Worker 
3805*6777b538SAndroid Build Coastguard Worker   const int kSize = 200;
3806*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
3807*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, true);
3808*6777b538SAndroid Build Coastguard Worker 
3809*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 10; i++) {
3810*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(i);
3811*6777b538SAndroid Build Coastguard Worker     // Allocate 2MB for this entry.
3812*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, true));
3813*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, true));
3814*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize,
3815*6777b538SAndroid Build Coastguard Worker               WriteData(entry, 0, 1024 * 1024, buffer.get(), kSize, false));
3816*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize,
3817*6777b538SAndroid Build Coastguard Worker               WriteData(entry, 1, 1024 * 1024, buffer.get(), kSize, false));
3818*6777b538SAndroid Build Coastguard Worker 
3819*6777b538SAndroid Build Coastguard Worker     // Delete one of the buffers and truncate the other.
3820*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true));
3821*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, WriteData(entry, 1, 10, buffer.get(), 0, true));
3822*6777b538SAndroid Build Coastguard Worker 
3823*6777b538SAndroid Build Coastguard Worker     // Delete the second buffer, writing 10 bytes to disk.
3824*6777b538SAndroid Build Coastguard Worker     entry->Close();
3825*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(OpenEntry(key, &entry), IsOk());
3826*6777b538SAndroid Build Coastguard Worker   }
3827*6777b538SAndroid Build Coastguard Worker 
3828*6777b538SAndroid Build Coastguard Worker   entry->Close();
3829*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize());
3830*6777b538SAndroid Build Coastguard Worker }
3831*6777b538SAndroid Build Coastguard Worker 
3832*6777b538SAndroid Build Coastguard Worker // This test assumes at least 150MB of system memory.
TEST_F(DiskCacheBackendTest,TotalBuffersSize2)3833*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, TotalBuffersSize2) {
3834*6777b538SAndroid Build Coastguard Worker   InitCache();
3835*6777b538SAndroid Build Coastguard Worker 
3836*6777b538SAndroid Build Coastguard Worker   const int kOneMB = 1024 * 1024;
3837*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
3838*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize());
3839*6777b538SAndroid Build Coastguard Worker 
3840*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
3841*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
3842*6777b538SAndroid Build Coastguard Worker 
3843*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
3844*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize());
3845*6777b538SAndroid Build Coastguard Worker 
3846*6777b538SAndroid Build Coastguard Worker   cache_impl_->BufferDeleted(kOneMB);
3847*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
3848*6777b538SAndroid Build Coastguard Worker 
3849*6777b538SAndroid Build Coastguard Worker   // Check the upper limit.
3850*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB));
3851*6777b538SAndroid Build Coastguard Worker 
3852*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 30; i++)
3853*6777b538SAndroid Build Coastguard Worker     cache_impl_->IsAllocAllowed(0, kOneMB);  // Ignore the result.
3854*6777b538SAndroid Build Coastguard Worker 
3855*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB));
3856*6777b538SAndroid Build Coastguard Worker }
3857*6777b538SAndroid Build Coastguard Worker 
3858*6777b538SAndroid Build Coastguard Worker // Tests that sharing of external files works and we are able to delete the
3859*6777b538SAndroid Build Coastguard Worker // files when we need to.
TEST_F(DiskCacheBackendTest,FileSharing)3860*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, FileSharing) {
3861*6777b538SAndroid Build Coastguard Worker   InitCache();
3862*6777b538SAndroid Build Coastguard Worker 
3863*6777b538SAndroid Build Coastguard Worker   disk_cache::Addr address(0x80000001);
3864*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cache_impl_->CreateExternalFile(&address));
3865*6777b538SAndroid Build Coastguard Worker   base::FilePath name = cache_impl_->GetFileName(address);
3866*6777b538SAndroid Build Coastguard Worker 
3867*6777b538SAndroid Build Coastguard Worker   {
3868*6777b538SAndroid Build Coastguard Worker     auto file = base::MakeRefCounted<disk_cache::File>(false);
3869*6777b538SAndroid Build Coastguard Worker     file->Init(name);
3870*6777b538SAndroid Build Coastguard Worker 
3871*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
3872*6777b538SAndroid Build Coastguard Worker     DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE;
3873*6777b538SAndroid Build Coastguard Worker     DWORD access = GENERIC_READ | GENERIC_WRITE;
3874*6777b538SAndroid Build Coastguard Worker     base::win::ScopedHandle file2(CreateFile(name.value().c_str(), access,
3875*6777b538SAndroid Build Coastguard Worker                                              sharing, nullptr, OPEN_EXISTING, 0,
3876*6777b538SAndroid Build Coastguard Worker                                              nullptr));
3877*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(file2.IsValid());
3878*6777b538SAndroid Build Coastguard Worker 
3879*6777b538SAndroid Build Coastguard Worker     sharing |= FILE_SHARE_DELETE;
3880*6777b538SAndroid Build Coastguard Worker     file2.Set(CreateFile(name.value().c_str(), access, sharing, nullptr,
3881*6777b538SAndroid Build Coastguard Worker                          OPEN_EXISTING, 0, nullptr));
3882*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(file2.IsValid());
3883*6777b538SAndroid Build Coastguard Worker #endif
3884*6777b538SAndroid Build Coastguard Worker 
3885*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(base::DeleteFile(name));
3886*6777b538SAndroid Build Coastguard Worker 
3887*6777b538SAndroid Build Coastguard Worker     // We should be able to use the file.
3888*6777b538SAndroid Build Coastguard Worker     const int kSize = 200;
3889*6777b538SAndroid Build Coastguard Worker     char buffer1[kSize];
3890*6777b538SAndroid Build Coastguard Worker     char buffer2[kSize];
3891*6777b538SAndroid Build Coastguard Worker     memset(buffer1, 't', kSize);
3892*6777b538SAndroid Build Coastguard Worker     memset(buffer2, 0, kSize);
3893*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(file->Write(buffer1, kSize, 0));
3894*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(file->Read(buffer2, kSize, 0));
3895*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize));
3896*6777b538SAndroid Build Coastguard Worker   }
3897*6777b538SAndroid Build Coastguard Worker 
3898*6777b538SAndroid Build Coastguard Worker   base::File file(name, base::File::FLAG_OPEN | base::File::FLAG_READ);
3899*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(file.IsValid());
3900*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(file.error_details(), base::File::FILE_ERROR_NOT_FOUND);
3901*6777b538SAndroid Build Coastguard Worker }
3902*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,UpdateRankForExternalCacheHit)3903*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) {
3904*6777b538SAndroid Build Coastguard Worker   InitCache();
3905*6777b538SAndroid Build Coastguard Worker 
3906*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3907*6777b538SAndroid Build Coastguard Worker 
3908*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
3909*6777b538SAndroid Build Coastguard Worker     std::string key = base::StringPrintf("key%d", i);
3910*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
3911*6777b538SAndroid Build Coastguard Worker     entry->Close();
3912*6777b538SAndroid Build Coastguard Worker   }
3913*6777b538SAndroid Build Coastguard Worker 
3914*6777b538SAndroid Build Coastguard Worker   // Ping the oldest entry.
3915*6777b538SAndroid Build Coastguard Worker   OnExternalCacheHit("key0");
3916*6777b538SAndroid Build Coastguard Worker 
3917*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
3918*6777b538SAndroid Build Coastguard Worker 
3919*6777b538SAndroid Build Coastguard Worker   // Make sure the older key remains.
3920*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3921*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("key0", &entry), IsOk());
3922*6777b538SAndroid Build Coastguard Worker   entry->Close();
3923*6777b538SAndroid Build Coastguard Worker }
3924*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,ShaderCacheUpdateRankForExternalCacheHit)3925*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) {
3926*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
3927*6777b538SAndroid Build Coastguard Worker   InitCache();
3928*6777b538SAndroid Build Coastguard Worker 
3929*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
3930*6777b538SAndroid Build Coastguard Worker 
3931*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
3932*6777b538SAndroid Build Coastguard Worker     std::string key = base::StringPrintf("key%d", i);
3933*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
3934*6777b538SAndroid Build Coastguard Worker     entry->Close();
3935*6777b538SAndroid Build Coastguard Worker   }
3936*6777b538SAndroid Build Coastguard Worker 
3937*6777b538SAndroid Build Coastguard Worker   // Ping the oldest entry.
3938*6777b538SAndroid Build Coastguard Worker   OnExternalCacheHit("key0");
3939*6777b538SAndroid Build Coastguard Worker 
3940*6777b538SAndroid Build Coastguard Worker   TrimForTest(false);
3941*6777b538SAndroid Build Coastguard Worker 
3942*6777b538SAndroid Build Coastguard Worker   // Make sure the older key remains.
3943*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
3944*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("key0", &entry), IsOk());
3945*6777b538SAndroid Build Coastguard Worker   entry->Close();
3946*6777b538SAndroid Build Coastguard Worker }
3947*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheShutdownWithPendingCreate)3948*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheShutdownWithPendingCreate) {
3949*6777b538SAndroid Build Coastguard Worker   // Use net::APP_CACHE to make size estimations deterministic via
3950*6777b538SAndroid Build Coastguard Worker   // non-optimistic writes.
3951*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3952*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3953*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingCreate(false);
3954*6777b538SAndroid Build Coastguard Worker }
3955*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheShutdownWithPendingDoom)3956*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheShutdownWithPendingDoom) {
3957*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3958*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3959*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingDoom();
3960*6777b538SAndroid Build Coastguard Worker }
3961*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheShutdownWithPendingFileIO)3962*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheShutdownWithPendingFileIO) {
3963*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3964*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3965*6777b538SAndroid Build Coastguard Worker   BackendShutdownWithPendingFileIO(false);
3966*6777b538SAndroid Build Coastguard Worker }
3967*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheBasics)3968*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheBasics) {
3969*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3970*6777b538SAndroid Build Coastguard Worker   BackendBasics();
3971*6777b538SAndroid Build Coastguard Worker }
3972*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheAppCacheBasics)3973*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheBasics) {
3974*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3975*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3976*6777b538SAndroid Build Coastguard Worker   BackendBasics();
3977*6777b538SAndroid Build Coastguard Worker }
3978*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheKeying)3979*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheKeying) {
3980*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3981*6777b538SAndroid Build Coastguard Worker   BackendKeying();
3982*6777b538SAndroid Build Coastguard Worker }
3983*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheAppCacheKeying)3984*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheKeying) {
3985*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3986*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3987*6777b538SAndroid Build Coastguard Worker   BackendKeying();
3988*6777b538SAndroid Build Coastguard Worker }
3989*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheLoad)3990*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheLoad) {
3991*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
3992*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3993*6777b538SAndroid Build Coastguard Worker   BackendLoad();
3994*6777b538SAndroid Build Coastguard Worker }
3995*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheAppCacheLoad)3996*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheLoad) {
3997*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
3998*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
3999*6777b538SAndroid Build Coastguard Worker   SetMaxSize(0x100000);
4000*6777b538SAndroid Build Coastguard Worker   BackendLoad();
4001*6777b538SAndroid Build Coastguard Worker }
4002*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleDoomRecent)4003*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleDoomRecent) {
4004*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4005*6777b538SAndroid Build Coastguard Worker   BackendDoomRecent();
4006*6777b538SAndroid Build Coastguard Worker }
4007*6777b538SAndroid Build Coastguard Worker 
4008*6777b538SAndroid Build Coastguard Worker // crbug.com/330926, crbug.com/370677
TEST_F(DiskCacheBackendTest,DISABLED_SimpleDoomBetween)4009*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DISABLED_SimpleDoomBetween) {
4010*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4011*6777b538SAndroid Build Coastguard Worker   BackendDoomBetween();
4012*6777b538SAndroid Build Coastguard Worker }
4013*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheDoomAll)4014*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheDoomAll) {
4015*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4016*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
4017*6777b538SAndroid Build Coastguard Worker }
4018*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheAppCacheOnlyDoomAll)4019*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheOnlyDoomAll) {
4020*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
4021*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4022*6777b538SAndroid Build Coastguard Worker   BackendDoomAll();
4023*6777b538SAndroid Build Coastguard Worker }
4024*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheOpenMissingFile)4025*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheOpenMissingFile) {
4026*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4027*6777b538SAndroid Build Coastguard Worker   InitCache();
4028*6777b538SAndroid Build Coastguard Worker 
4029*6777b538SAndroid Build Coastguard Worker   const char key[] = "the first key";
4030*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4031*6777b538SAndroid Build Coastguard Worker 
4032*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
4033*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(entry != nullptr);
4034*6777b538SAndroid Build Coastguard Worker   entry->Close();
4035*6777b538SAndroid Build Coastguard Worker   entry = nullptr;
4036*6777b538SAndroid Build Coastguard Worker 
4037*6777b538SAndroid Build Coastguard Worker   // To make sure the file creation completed we need to call open again so that
4038*6777b538SAndroid Build Coastguard Worker   // we block until it actually created the files.
4039*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
4040*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(entry != nullptr);
4041*6777b538SAndroid Build Coastguard Worker   entry->Close();
4042*6777b538SAndroid Build Coastguard Worker   entry = nullptr;
4043*6777b538SAndroid Build Coastguard Worker 
4044*6777b538SAndroid Build Coastguard Worker   // Delete one of the files in the entry.
4045*6777b538SAndroid Build Coastguard Worker   base::FilePath to_delete_file = cache_path_.AppendASCII(
4046*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
4047*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::PathExists(to_delete_file));
4048*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::DeleteFile(to_delete_file));
4049*6777b538SAndroid Build Coastguard Worker 
4050*6777b538SAndroid Build Coastguard Worker   // Failing to open the entry should delete the rest of these files.
4051*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsError(net::ERR_FAILED));
4052*6777b538SAndroid Build Coastguard Worker 
4053*6777b538SAndroid Build Coastguard Worker   // Confirm the rest of the files are gone.
4054*6777b538SAndroid Build Coastguard Worker   for (int i = 1; i < disk_cache::kSimpleEntryNormalFileCount; ++i) {
4055*6777b538SAndroid Build Coastguard Worker     base::FilePath should_be_gone_file(cache_path_.AppendASCII(
4056*6777b538SAndroid Build Coastguard Worker         disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, i)));
4057*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(base::PathExists(should_be_gone_file));
4058*6777b538SAndroid Build Coastguard Worker   }
4059*6777b538SAndroid Build Coastguard Worker }
4060*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheOpenBadFile)4061*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheOpenBadFile) {
4062*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4063*6777b538SAndroid Build Coastguard Worker   InitCache();
4064*6777b538SAndroid Build Coastguard Worker 
4065*6777b538SAndroid Build Coastguard Worker   const char key[] = "the first key";
4066*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4067*6777b538SAndroid Build Coastguard Worker 
4068*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
4069*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* null = nullptr;
4070*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(null, entry);
4071*6777b538SAndroid Build Coastguard Worker   entry->Close();
4072*6777b538SAndroid Build Coastguard Worker   entry = nullptr;
4073*6777b538SAndroid Build Coastguard Worker 
4074*6777b538SAndroid Build Coastguard Worker   // To make sure the file creation completed we need to call open again so that
4075*6777b538SAndroid Build Coastguard Worker   // we block until it actually created the files.
4076*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
4077*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(null, entry);
4078*6777b538SAndroid Build Coastguard Worker   entry->Close();
4079*6777b538SAndroid Build Coastguard Worker   entry = nullptr;
4080*6777b538SAndroid Build Coastguard Worker 
4081*6777b538SAndroid Build Coastguard Worker   // The entry is being closed on the Simple Cache worker pool
4082*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4083*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
4084*6777b538SAndroid Build Coastguard Worker 
4085*6777b538SAndroid Build Coastguard Worker   // Write an invalid header for stream 0 and stream 1.
4086*6777b538SAndroid Build Coastguard Worker   base::FilePath entry_file1_path = cache_path_.AppendASCII(
4087*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
4088*6777b538SAndroid Build Coastguard Worker 
4089*6777b538SAndroid Build Coastguard Worker   disk_cache::SimpleFileHeader header;
4090*6777b538SAndroid Build Coastguard Worker   header.initial_magic_number = UINT64_C(0xbadf00d);
4091*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::WriteFile(entry_file1_path,
4092*6777b538SAndroid Build Coastguard Worker                               base::as_bytes(base::make_span(&header, 1u))));
4093*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key, &entry), IsError(net::ERR_FAILED));
4094*6777b538SAndroid Build Coastguard Worker }
4095*6777b538SAndroid Build Coastguard Worker 
4096*6777b538SAndroid Build Coastguard Worker // Tests that the Simple Cache Backend fails to initialize with non-matching
4097*6777b538SAndroid Build Coastguard Worker // file structure on disk.
TEST_F(DiskCacheBackendTest,SimpleCacheOverBlockfileCache)4098*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) {
4099*6777b538SAndroid Build Coastguard Worker   // Create a cache structure with the |BackendImpl|.
4100*6777b538SAndroid Build Coastguard Worker   InitCache();
4101*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
4102*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
4103*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4104*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, false);
4105*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
4106*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false));
4107*6777b538SAndroid Build Coastguard Worker   entry->Close();
4108*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4109*6777b538SAndroid Build Coastguard Worker 
4110*6777b538SAndroid Build Coastguard Worker   // Check that the |SimpleBackendImpl| does not favor this structure.
4111*6777b538SAndroid Build Coastguard Worker   auto simple_cache = std::make_unique<disk_cache::SimpleBackendImpl>(
4112*6777b538SAndroid Build Coastguard Worker       /*file_operations_factory=*/nullptr, cache_path_, nullptr, nullptr, 0,
4113*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, nullptr);
4114*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
4115*6777b538SAndroid Build Coastguard Worker   simple_cache->Init(cb.callback());
4116*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, cb.WaitForResult());
4117*6777b538SAndroid Build Coastguard Worker   simple_cache.reset();
4118*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
4119*6777b538SAndroid Build Coastguard Worker }
4120*6777b538SAndroid Build Coastguard Worker 
4121*6777b538SAndroid Build Coastguard Worker // Tests that the |BackendImpl| refuses to initialize on top of the files
4122*6777b538SAndroid Build Coastguard Worker // generated by the Simple Cache Backend.
TEST_F(DiskCacheBackendTest,BlockfileCacheOverSimpleCache)4123*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) {
4124*6777b538SAndroid Build Coastguard Worker   // Create a cache structure with the |SimpleBackendImpl|.
4125*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4126*6777b538SAndroid Build Coastguard Worker   InitCache();
4127*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry;
4128*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
4129*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4130*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, false);
4131*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
4132*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false));
4133*6777b538SAndroid Build Coastguard Worker   entry->Close();
4134*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4135*6777b538SAndroid Build Coastguard Worker 
4136*6777b538SAndroid Build Coastguard Worker   // Check that the |BackendImpl| does not favor this structure.
4137*6777b538SAndroid Build Coastguard Worker   auto cache = std::make_unique<disk_cache::BackendImpl>(
4138*6777b538SAndroid Build Coastguard Worker       cache_path_, nullptr, nullptr, net::DISK_CACHE, nullptr);
4139*6777b538SAndroid Build Coastguard Worker   cache->SetUnitTestMode();
4140*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb;
4141*6777b538SAndroid Build Coastguard Worker   cache->Init(cb.callback());
4142*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(net::OK, cb.WaitForResult());
4143*6777b538SAndroid Build Coastguard Worker   cache.reset();
4144*6777b538SAndroid Build Coastguard Worker   DisableIntegrityCheck();
4145*6777b538SAndroid Build Coastguard Worker }
4146*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheFixEnumerators)4147*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheFixEnumerators) {
4148*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4149*6777b538SAndroid Build Coastguard Worker   BackendFixEnumerators();
4150*6777b538SAndroid Build Coastguard Worker }
4151*6777b538SAndroid Build Coastguard Worker 
4152*6777b538SAndroid Build Coastguard Worker // Tests basic functionality of the SimpleBackend implementation of the
4153*6777b538SAndroid Build Coastguard Worker // enumeration API.
TEST_F(DiskCacheBackendTest,SimpleCacheEnumerationBasics)4154*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheEnumerationBasics) {
4155*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4156*6777b538SAndroid Build Coastguard Worker   InitCache();
4157*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
4158*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
4159*6777b538SAndroid Build Coastguard Worker 
4160*6777b538SAndroid Build Coastguard Worker   // Check that enumeration returns all entries.
4161*6777b538SAndroid Build Coastguard Worker   std::set<std::string> keys_to_match(key_pool);
4162*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
4163*6777b538SAndroid Build Coastguard Worker   size_t count = 0;
4164*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(-1, iter.get(), &keys_to_match, &count));
4165*6777b538SAndroid Build Coastguard Worker   iter.reset();
4166*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(key_pool.size(), count);
4167*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(keys_to_match.empty());
4168*6777b538SAndroid Build Coastguard Worker 
4169*6777b538SAndroid Build Coastguard Worker   // Check that opening entries does not affect enumeration.
4170*6777b538SAndroid Build Coastguard Worker   keys_to_match = key_pool;
4171*6777b538SAndroid Build Coastguard Worker   iter = CreateIterator();
4172*6777b538SAndroid Build Coastguard Worker   count = 0;
4173*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry_opened_before;
4174*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(*(key_pool.begin()), &entry_opened_before), IsOk());
4175*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size() / 2, iter.get(),
4176*6777b538SAndroid Build Coastguard Worker                                     &keys_to_match, &count));
4177*6777b538SAndroid Build Coastguard Worker 
4178*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry_opened_middle;
4179*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, OpenEntry(*(keys_to_match.begin()), &entry_opened_middle));
4180*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(-1, iter.get(), &keys_to_match, &count));
4181*6777b538SAndroid Build Coastguard Worker   iter.reset();
4182*6777b538SAndroid Build Coastguard Worker   entry_opened_before->Close();
4183*6777b538SAndroid Build Coastguard Worker   entry_opened_middle->Close();
4184*6777b538SAndroid Build Coastguard Worker 
4185*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(key_pool.size(), count);
4186*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(keys_to_match.empty());
4187*6777b538SAndroid Build Coastguard Worker }
4188*6777b538SAndroid Build Coastguard Worker 
4189*6777b538SAndroid Build Coastguard Worker // Tests that the enumerations are not affected by dooming an entry in the
4190*6777b538SAndroid Build Coastguard Worker // middle.
TEST_F(DiskCacheBackendTest,SimpleCacheEnumerationWhileDoomed)4191*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheEnumerationWhileDoomed) {
4192*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4193*6777b538SAndroid Build Coastguard Worker   InitCache();
4194*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
4195*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
4196*6777b538SAndroid Build Coastguard Worker 
4197*6777b538SAndroid Build Coastguard Worker   // Check that enumeration returns all entries but the doomed one.
4198*6777b538SAndroid Build Coastguard Worker   std::set<std::string> keys_to_match(key_pool);
4199*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
4200*6777b538SAndroid Build Coastguard Worker   size_t count = 0;
4201*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size() / 2, iter.get(),
4202*6777b538SAndroid Build Coastguard Worker                                     &keys_to_match, &count));
4203*6777b538SAndroid Build Coastguard Worker 
4204*6777b538SAndroid Build Coastguard Worker   std::string key_to_delete = *(keys_to_match.begin());
4205*6777b538SAndroid Build Coastguard Worker   DoomEntry(key_to_delete);
4206*6777b538SAndroid Build Coastguard Worker   keys_to_match.erase(key_to_delete);
4207*6777b538SAndroid Build Coastguard Worker   key_pool.erase(key_to_delete);
4208*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(-1, iter.get(), &keys_to_match, &count));
4209*6777b538SAndroid Build Coastguard Worker   iter.reset();
4210*6777b538SAndroid Build Coastguard Worker 
4211*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(key_pool.size(), count);
4212*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(keys_to_match.empty());
4213*6777b538SAndroid Build Coastguard Worker }
4214*6777b538SAndroid Build Coastguard Worker 
4215*6777b538SAndroid Build Coastguard Worker // Tests that enumerations are not affected by corrupt files.
TEST_F(DiskCacheBackendTest,SimpleCacheEnumerationCorruption)4216*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheEnumerationCorruption) {
4217*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4218*6777b538SAndroid Build Coastguard Worker   InitCache();
4219*6777b538SAndroid Build Coastguard Worker   // Create a corrupt entry.
4220*6777b538SAndroid Build Coastguard Worker   const std::string key = "the key";
4221*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* corrupted_entry;
4222*6777b538SAndroid Build Coastguard Worker 
4223*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key, &corrupted_entry), IsOk());
4224*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(corrupted_entry);
4225*6777b538SAndroid Build Coastguard Worker   const int kSize = 50;
4226*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4227*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kSize, false);
4228*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize,
4229*6777b538SAndroid Build Coastguard Worker             WriteData(corrupted_entry, 0, 0, buffer.get(), kSize, false));
4230*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, ReadData(corrupted_entry, 0, 0, buffer.get(), kSize));
4231*6777b538SAndroid Build Coastguard Worker   corrupted_entry->Close();
4232*6777b538SAndroid Build Coastguard Worker   // Let all I/O finish so it doesn't race with corrupting the file below.
4233*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
4234*6777b538SAndroid Build Coastguard Worker 
4235*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
4236*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
4237*6777b538SAndroid Build Coastguard Worker 
4238*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
4239*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::CreateCorruptFileForTests(key, cache_path_));
4240*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(key_pool.size() + 1, static_cast<size_t>(cache_->GetEntryCount()));
4241*6777b538SAndroid Build Coastguard Worker 
4242*6777b538SAndroid Build Coastguard Worker   // Check that enumeration returns all entries but the corrupt one.
4243*6777b538SAndroid Build Coastguard Worker   std::set<std::string> keys_to_match(key_pool);
4244*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
4245*6777b538SAndroid Build Coastguard Worker   size_t count = 0;
4246*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(EnumerateAndMatchKeys(-1, iter.get(), &keys_to_match, &count));
4247*6777b538SAndroid Build Coastguard Worker   iter.reset();
4248*6777b538SAndroid Build Coastguard Worker 
4249*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(key_pool.size(), count);
4250*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(keys_to_match.empty());
4251*6777b538SAndroid Build Coastguard Worker }
4252*6777b538SAndroid Build Coastguard Worker 
4253*6777b538SAndroid Build Coastguard Worker // Tests that enumerations don't leak memory when the backend is destructed
4254*6777b538SAndroid Build Coastguard Worker // mid-enumeration.
TEST_F(DiskCacheBackendTest,SimpleCacheEnumerationDestruction)4255*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheEnumerationDestruction) {
4256*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4257*6777b538SAndroid Build Coastguard Worker   InitCache();
4258*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
4259*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
4260*6777b538SAndroid Build Coastguard Worker 
4261*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
4262*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4263*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
4264*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(entry);
4265*6777b538SAndroid Build Coastguard Worker   disk_cache::ScopedEntryPtr entry_closer(entry);
4266*6777b538SAndroid Build Coastguard Worker 
4267*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4268*6777b538SAndroid Build Coastguard Worker   // This test passes if we don't leak memory.
4269*6777b538SAndroid Build Coastguard Worker }
4270*6777b538SAndroid Build Coastguard Worker 
4271*6777b538SAndroid Build Coastguard Worker // Verify that tasks run in priority order when the experiment is enabled.
4272*6777b538SAndroid Build Coastguard Worker // Test has races, disabling until fixed: https://crbug.com/853283
TEST_F(DiskCacheBackendTest,DISABLED_SimpleCachePrioritizedEntryOrder)4273*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, DISABLED_SimpleCachePrioritizedEntryOrder) {
4274*6777b538SAndroid Build Coastguard Worker   base::test::ScopedFeatureList scoped_feature_list;
4275*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4276*6777b538SAndroid Build Coastguard Worker   InitCache();
4277*6777b538SAndroid Build Coastguard Worker 
4278*6777b538SAndroid Build Coastguard Worker   // Set the SimpleCache's worker pool to a sequenced type for testing
4279*6777b538SAndroid Build Coastguard Worker   // priority order.
4280*6777b538SAndroid Build Coastguard Worker   disk_cache::SimpleBackendImpl* simple_cache =
4281*6777b538SAndroid Build Coastguard Worker       static_cast<disk_cache::SimpleBackendImpl*>(cache_.get());
4282*6777b538SAndroid Build Coastguard Worker   auto task_runner = base::ThreadPool::CreateSequencedTaskRunner(
4283*6777b538SAndroid Build Coastguard Worker       {base::TaskPriority::USER_VISIBLE, base::MayBlock()});
4284*6777b538SAndroid Build Coastguard Worker   simple_cache->SetTaskRunnerForTesting(task_runner);
4285*6777b538SAndroid Build Coastguard Worker 
4286*6777b538SAndroid Build Coastguard Worker   // Create three entries. Priority order is 3, 1, 2 because 3 has the highest
4287*6777b538SAndroid Build Coastguard Worker   // request priority and 1 is created before 2.
4288*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1 = nullptr;
4289*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2 = nullptr;
4290*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry3 = nullptr;
4291*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntryWithPriority("first", net::LOWEST, &entry1), IsOk());
4292*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntryWithPriority("second", net::LOWEST, &entry2), IsOk());
4293*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntryWithPriority("third", net::HIGHEST, &entry3), IsOk());
4294*6777b538SAndroid Build Coastguard Worker 
4295*6777b538SAndroid Build Coastguard Worker   // Write some data to the entries.
4296*6777b538SAndroid Build Coastguard Worker   const int kSize = 10;
4297*6777b538SAndroid Build Coastguard Worker   auto buf1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4298*6777b538SAndroid Build Coastguard Worker   auto buf2 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4299*6777b538SAndroid Build Coastguard Worker   auto buf3 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4300*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buf1->data(), kSize, false);
4301*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buf2->data(), kSize, false);
4302*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buf3->data(), kSize, false);
4303*6777b538SAndroid Build Coastguard Worker 
4304*6777b538SAndroid Build Coastguard Worker   // Write to stream 2 because it's the only stream that can't be read from
4305*6777b538SAndroid Build Coastguard Worker   // synchronously.
4306*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry1, 2, 0, buf1.get(), kSize, true));
4307*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry2, 2, 0, buf1.get(), kSize, true));
4308*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entry3, 2, 0, buf1.get(), kSize, true));
4309*6777b538SAndroid Build Coastguard Worker 
4310*6777b538SAndroid Build Coastguard Worker   // Wait until the task_runner's queue is empty (WriteData might have
4311*6777b538SAndroid Build Coastguard Worker   // optimistically returned synchronously but still had some tasks to run in
4312*6777b538SAndroid Build Coastguard Worker   // the worker pool.
4313*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
4314*6777b538SAndroid Build Coastguard Worker   task_runner->PostTaskAndReply(FROM_HERE, base::DoNothing(),
4315*6777b538SAndroid Build Coastguard Worker                                 run_loop.QuitClosure());
4316*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
4317*6777b538SAndroid Build Coastguard Worker 
4318*6777b538SAndroid Build Coastguard Worker   std::vector<int> finished_read_order;
4319*6777b538SAndroid Build Coastguard Worker   auto finished_callback = [](std::vector<int>* finished_read_order,
4320*6777b538SAndroid Build Coastguard Worker                               int entry_number, base::OnceClosure quit_closure,
4321*6777b538SAndroid Build Coastguard Worker                               int rv) {
4322*6777b538SAndroid Build Coastguard Worker     finished_read_order->push_back(entry_number);
4323*6777b538SAndroid Build Coastguard Worker     if (quit_closure)
4324*6777b538SAndroid Build Coastguard Worker       std::move(quit_closure).Run();
4325*6777b538SAndroid Build Coastguard Worker   };
4326*6777b538SAndroid Build Coastguard Worker 
4327*6777b538SAndroid Build Coastguard Worker   auto read_buf1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4328*6777b538SAndroid Build Coastguard Worker   auto read_buf2 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4329*6777b538SAndroid Build Coastguard Worker   auto read_buf3 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4330*6777b538SAndroid Build Coastguard Worker 
4331*6777b538SAndroid Build Coastguard Worker   // Read from the entries in order 2, 3, 1. They should be reprioritized to
4332*6777b538SAndroid Build Coastguard Worker   // 3, 1, 2.
4333*6777b538SAndroid Build Coastguard Worker   base::RunLoop read_run_loop;
4334*6777b538SAndroid Build Coastguard Worker 
4335*6777b538SAndroid Build Coastguard Worker   entry2->ReadData(2, 0, read_buf2.get(), kSize,
4336*6777b538SAndroid Build Coastguard Worker                    base::BindOnce(finished_callback, &finished_read_order, 2,
4337*6777b538SAndroid Build Coastguard Worker                                   read_run_loop.QuitClosure()));
4338*6777b538SAndroid Build Coastguard Worker   entry3->ReadData(2, 0, read_buf3.get(), kSize,
4339*6777b538SAndroid Build Coastguard Worker                    base::BindOnce(finished_callback, &finished_read_order, 3,
4340*6777b538SAndroid Build Coastguard Worker                                   base::OnceClosure()));
4341*6777b538SAndroid Build Coastguard Worker   entry1->ReadData(2, 0, read_buf1.get(), kSize,
4342*6777b538SAndroid Build Coastguard Worker                    base::BindOnce(finished_callback, &finished_read_order, 1,
4343*6777b538SAndroid Build Coastguard Worker                                   base::OnceClosure()));
4344*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, finished_read_order.size());
4345*6777b538SAndroid Build Coastguard Worker 
4346*6777b538SAndroid Build Coastguard Worker   read_run_loop.Run();
4347*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ((std::vector<int>{3, 1, 2}), finished_read_order);
4348*6777b538SAndroid Build Coastguard Worker   entry1->Close();
4349*6777b538SAndroid Build Coastguard Worker   entry2->Close();
4350*6777b538SAndroid Build Coastguard Worker   entry3->Close();
4351*6777b538SAndroid Build Coastguard Worker }
4352*6777b538SAndroid Build Coastguard Worker 
4353*6777b538SAndroid Build Coastguard Worker // Tests that enumerations include entries with long keys.
TEST_F(DiskCacheBackendTest,SimpleCacheEnumerationLongKeys)4354*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheEnumerationLongKeys) {
4355*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4356*6777b538SAndroid Build Coastguard Worker   InitCache();
4357*6777b538SAndroid Build Coastguard Worker   std::set<std::string> key_pool;
4358*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
4359*6777b538SAndroid Build Coastguard Worker 
4360*6777b538SAndroid Build Coastguard Worker   const size_t long_key_length =
4361*6777b538SAndroid Build Coastguard Worker       disk_cache::SimpleSynchronousEntry::kInitialHeaderRead + 10;
4362*6777b538SAndroid Build Coastguard Worker   std::string long_key(long_key_length, 'X');
4363*6777b538SAndroid Build Coastguard Worker   key_pool.insert(long_key);
4364*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4365*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(long_key.c_str(), &entry), IsOk());
4366*6777b538SAndroid Build Coastguard Worker   entry->Close();
4367*6777b538SAndroid Build Coastguard Worker 
4368*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
4369*6777b538SAndroid Build Coastguard Worker   size_t count = 0;
4370*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(EnumerateAndMatchKeys(-1, iter.get(), &key_pool, &count));
4371*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(key_pool.empty());
4372*6777b538SAndroid Build Coastguard Worker }
4373*6777b538SAndroid Build Coastguard Worker 
4374*6777b538SAndroid Build Coastguard Worker // Tests that a SimpleCache doesn't crash when files are deleted very quickly
4375*6777b538SAndroid Build Coastguard Worker // after closing.
4376*6777b538SAndroid Build Coastguard Worker // NOTE: IF THIS TEST IS FLAKY THEN IT IS FAILING. See https://crbug.com/416940
TEST_F(DiskCacheBackendTest,SimpleCacheDeleteQuickly)4377*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheDeleteQuickly) {
4378*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4379*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 100; ++i) {
4380*6777b538SAndroid Build Coastguard Worker     InitCache();
4381*6777b538SAndroid Build Coastguard Worker     ResetCaches();
4382*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(CleanupCacheDir());
4383*6777b538SAndroid Build Coastguard Worker   }
4384*6777b538SAndroid Build Coastguard Worker }
4385*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheLateDoom)4386*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheLateDoom) {
4387*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4388*6777b538SAndroid Build Coastguard Worker   InitCache();
4389*6777b538SAndroid Build Coastguard Worker 
4390*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry *entry1, *entry2;
4391*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("first", &entry1), IsOk());
4392*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("second", &entry2), IsOk());
4393*6777b538SAndroid Build Coastguard Worker   entry1->Close();
4394*6777b538SAndroid Build Coastguard Worker 
4395*6777b538SAndroid Build Coastguard Worker   // Ensure that the directory mtime is flushed to disk before serializing the
4396*6777b538SAndroid Build Coastguard Worker   // index.
4397*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4398*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
4399*6777b538SAndroid Build Coastguard Worker   base::File cache_dir(cache_path_,
4400*6777b538SAndroid Build Coastguard Worker                        base::File::FLAG_OPEN | base::File::FLAG_READ);
4401*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cache_dir.Flush());
4402*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_POSIX)
4403*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4404*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4405*6777b538SAndroid Build Coastguard Worker 
4406*6777b538SAndroid Build Coastguard Worker   // The index is now written. Dooming the last entry can't delete a file,
4407*6777b538SAndroid Build Coastguard Worker   // because that would advance the cache directory mtime and invalidate the
4408*6777b538SAndroid Build Coastguard Worker   // index.
4409*6777b538SAndroid Build Coastguard Worker   entry2->Doom();
4410*6777b538SAndroid Build Coastguard Worker   entry2->Close();
4411*6777b538SAndroid Build Coastguard Worker 
4412*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
4413*6777b538SAndroid Build Coastguard Worker   InitCache();
4414*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(disk_cache::SimpleIndex::INITIALIZE_METHOD_LOADED,
4415*6777b538SAndroid Build Coastguard Worker             simple_cache_impl_->index()->init_method());
4416*6777b538SAndroid Build Coastguard Worker }
4417*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleCacheNegMaxSize)4418*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheNegMaxSize) {
4419*6777b538SAndroid Build Coastguard Worker   SetMaxSize(-1);
4420*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4421*6777b538SAndroid Build Coastguard Worker   InitCache();
4422*6777b538SAndroid Build Coastguard Worker   // We don't know what it will pick, but it's limited to what
4423*6777b538SAndroid Build Coastguard Worker   // disk_cache::PreferredCacheSize would return, scaled by the size experiment,
4424*6777b538SAndroid Build Coastguard Worker   // which only goes as much as 4x. It definitely should not be MAX_UINT64.
4425*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(simple_cache_impl_->index()->max_size(),
4426*6777b538SAndroid Build Coastguard Worker             std::numeric_limits<uint64_t>::max());
4427*6777b538SAndroid Build Coastguard Worker 
4428*6777b538SAndroid Build Coastguard Worker   int max_default_size =
4429*6777b538SAndroid Build Coastguard Worker       2 * disk_cache::PreferredCacheSize(std::numeric_limits<int32_t>::max());
4430*6777b538SAndroid Build Coastguard Worker 
4431*6777b538SAndroid Build Coastguard Worker   ASSERT_GE(max_default_size, 0);
4432*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(simple_cache_impl_->index()->max_size(),
4433*6777b538SAndroid Build Coastguard Worker             static_cast<unsigned>(max_default_size));
4434*6777b538SAndroid Build Coastguard Worker 
4435*6777b538SAndroid Build Coastguard Worker   uint64_t max_size_without_scaling = simple_cache_impl_->index()->max_size();
4436*6777b538SAndroid Build Coastguard Worker 
4437*6777b538SAndroid Build Coastguard Worker   // Scale to 200%. The size should be twice of |max_size_without_scaling| but
4438*6777b538SAndroid Build Coastguard Worker   // since that's capped on 20% of available size, checking for the size to be
4439*6777b538SAndroid Build Coastguard Worker   // between max_size_without_scaling and max_size_without_scaling*2.
4440*6777b538SAndroid Build Coastguard Worker   {
4441*6777b538SAndroid Build Coastguard Worker     base::test::ScopedFeatureList scoped_feature_list;
4442*6777b538SAndroid Build Coastguard Worker     std::map<std::string, std::string> field_trial_params;
4443*6777b538SAndroid Build Coastguard Worker     field_trial_params["percent_relative_size"] = "200";
4444*6777b538SAndroid Build Coastguard Worker     scoped_feature_list.InitAndEnableFeatureWithParameters(
4445*6777b538SAndroid Build Coastguard Worker         disk_cache::kChangeDiskCacheSizeExperiment, field_trial_params);
4446*6777b538SAndroid Build Coastguard Worker 
4447*6777b538SAndroid Build Coastguard Worker     InitCache();
4448*6777b538SAndroid Build Coastguard Worker 
4449*6777b538SAndroid Build Coastguard Worker     uint64_t max_size_scaled = simple_cache_impl_->index()->max_size();
4450*6777b538SAndroid Build Coastguard Worker 
4451*6777b538SAndroid Build Coastguard Worker     EXPECT_GE(max_size_scaled, max_size_without_scaling);
4452*6777b538SAndroid Build Coastguard Worker     EXPECT_LE(max_size_scaled, 2 * max_size_without_scaling);
4453*6777b538SAndroid Build Coastguard Worker   }
4454*6777b538SAndroid Build Coastguard Worker }
4455*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleLastModified)4456*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleLastModified) {
4457*6777b538SAndroid Build Coastguard Worker   // Simple cache used to incorrectly set LastModified on entries based on
4458*6777b538SAndroid Build Coastguard Worker   // timestamp of the cache directory, and not the entries' file
4459*6777b538SAndroid Build Coastguard Worker   // (https://crbug.com/714143). So this test arranges for a situation
4460*6777b538SAndroid Build Coastguard Worker   // where this would occur by doing:
4461*6777b538SAndroid Build Coastguard Worker   // 1) Write entry 1
4462*6777b538SAndroid Build Coastguard Worker   // 2) Delay
4463*6777b538SAndroid Build Coastguard Worker   // 3) Write entry 2. This sets directory time stamp to be different from
4464*6777b538SAndroid Build Coastguard Worker   //    timestamp of entry 1 (due to the delay)
4465*6777b538SAndroid Build Coastguard Worker   // It then checks whether the entry 1 got the proper timestamp or not.
4466*6777b538SAndroid Build Coastguard Worker 
4467*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4468*6777b538SAndroid Build Coastguard Worker   InitCache();
4469*6777b538SAndroid Build Coastguard Worker   std::string key1 = GenerateKey(true);
4470*6777b538SAndroid Build Coastguard Worker   std::string key2 = GenerateKey(true);
4471*6777b538SAndroid Build Coastguard Worker 
4472*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1;
4473*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key1, &entry1), IsOk());
4474*6777b538SAndroid Build Coastguard Worker 
4475*6777b538SAndroid Build Coastguard Worker   // Make the Create complete --- SimpleCache can handle it optimistically,
4476*6777b538SAndroid Build Coastguard Worker   // and if we let it go fully async then trying to flush the Close might just
4477*6777b538SAndroid Build Coastguard Worker   // flush the Create.
4478*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4479*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
4480*6777b538SAndroid Build Coastguard Worker 
4481*6777b538SAndroid Build Coastguard Worker   entry1->Close();
4482*6777b538SAndroid Build Coastguard Worker 
4483*6777b538SAndroid Build Coastguard Worker   // Make the ::Close actually complete, since it is asynchronous.
4484*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4485*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
4486*6777b538SAndroid Build Coastguard Worker 
4487*6777b538SAndroid Build Coastguard Worker   Time entry1_timestamp = Time::NowFromSystemTime();
4488*6777b538SAndroid Build Coastguard Worker 
4489*6777b538SAndroid Build Coastguard Worker   // Don't want AddDelay since it sleep 1s(!) for SimpleCache, and we don't
4490*6777b538SAndroid Build Coastguard Worker   // care about reduced precision in index here.
4491*6777b538SAndroid Build Coastguard Worker   while (base::Time::NowFromSystemTime() <=
4492*6777b538SAndroid Build Coastguard Worker          (entry1_timestamp + base::Milliseconds(10))) {
4493*6777b538SAndroid Build Coastguard Worker     base::PlatformThread::Sleep(base::Milliseconds(1));
4494*6777b538SAndroid Build Coastguard Worker   }
4495*6777b538SAndroid Build Coastguard Worker 
4496*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2;
4497*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(key2, &entry2), IsOk());
4498*6777b538SAndroid Build Coastguard Worker   entry2->Close();
4499*6777b538SAndroid Build Coastguard Worker   disk_cache::FlushCacheThreadForTesting();
4500*6777b538SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
4501*6777b538SAndroid Build Coastguard Worker 
4502*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* reopen_entry1;
4503*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(key1, &reopen_entry1), IsOk());
4504*6777b538SAndroid Build Coastguard Worker 
4505*6777b538SAndroid Build Coastguard Worker   // This shouldn't pick up entry2's write time incorrectly.
4506*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(reopen_entry1->GetLastModified(), entry1_timestamp);
4507*6777b538SAndroid Build Coastguard Worker   reopen_entry1->Close();
4508*6777b538SAndroid Build Coastguard Worker }
4509*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleFdLimit)4510*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleFdLimit) {
4511*6777b538SAndroid Build Coastguard Worker   base::HistogramTester histogram_tester;
4512*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4513*6777b538SAndroid Build Coastguard Worker   // Make things blocking so CreateEntry actually waits for file to be
4514*6777b538SAndroid Build Coastguard Worker   // created.
4515*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
4516*6777b538SAndroid Build Coastguard Worker   InitCache();
4517*6777b538SAndroid Build Coastguard Worker 
4518*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entries[kLargeNumEntries];
4519*6777b538SAndroid Build Coastguard Worker   std::string keys[kLargeNumEntries];
4520*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kLargeNumEntries; ++i) {
4521*6777b538SAndroid Build Coastguard Worker     keys[i] = GenerateKey(true);
4522*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(keys[i], &entries[i]), IsOk());
4523*6777b538SAndroid Build Coastguard Worker   }
4524*6777b538SAndroid Build Coastguard Worker 
4525*6777b538SAndroid Build Coastguard Worker   // Note the fixture sets the file limit to 64.
4526*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4527*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_CLOSE_FILE,
4528*6777b538SAndroid Build Coastguard Worker                                      kLargeNumEntries - 64);
4529*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4530*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_REOPEN_FILE, 0);
4531*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4532*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
4533*6777b538SAndroid Build Coastguard Worker 
4534*6777b538SAndroid Build Coastguard Worker   const int kSize = 25000;
4535*6777b538SAndroid Build Coastguard Worker   auto buf1 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4536*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buf1->data(), kSize, false);
4537*6777b538SAndroid Build Coastguard Worker 
4538*6777b538SAndroid Build Coastguard Worker   auto buf2 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4539*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buf2->data(), kSize, false);
4540*6777b538SAndroid Build Coastguard Worker 
4541*6777b538SAndroid Build Coastguard Worker   // Doom an entry and create a new one with same name, to test that both
4542*6777b538SAndroid Build Coastguard Worker   // re-open properly.
4543*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, DoomEntry(keys[0]));
4544*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* alt_entry;
4545*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(keys[0], &alt_entry), IsOk());
4546*6777b538SAndroid Build Coastguard Worker 
4547*6777b538SAndroid Build Coastguard Worker   // One more file closure here to accommodate for alt_entry.
4548*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4549*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_CLOSE_FILE,
4550*6777b538SAndroid Build Coastguard Worker                                      kLargeNumEntries - 64 + 1);
4551*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4552*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_REOPEN_FILE, 0);
4553*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4554*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
4555*6777b538SAndroid Build Coastguard Worker 
4556*6777b538SAndroid Build Coastguard Worker   // Do some writes in [1...kLargeNumEntries) range, both testing bring those in
4557*6777b538SAndroid Build Coastguard Worker   // and kicking out [0] and [alt_entry]. These have to be to stream != 0 to
4558*6777b538SAndroid Build Coastguard Worker   // actually need files.
4559*6777b538SAndroid Build Coastguard Worker   for (int i = 1; i < kLargeNumEntries; ++i) {
4560*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kSize, WriteData(entries[i], 1, 0, buf1.get(), kSize, true));
4561*6777b538SAndroid Build Coastguard Worker     auto read_buf = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4562*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(kSize, ReadData(entries[i], 1, 0, read_buf.get(), kSize));
4563*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, memcmp(read_buf->data(), buf1->data(), kSize));
4564*6777b538SAndroid Build Coastguard Worker   }
4565*6777b538SAndroid Build Coastguard Worker 
4566*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount(
4567*6777b538SAndroid Build Coastguard Worker       "SimpleCache.FileDescriptorLimiterAction",
4568*6777b538SAndroid Build Coastguard Worker       disk_cache::FD_LIMIT_CLOSE_FILE,
4569*6777b538SAndroid Build Coastguard Worker       kLargeNumEntries - 64 + 1 + kLargeNumEntries - 1);
4570*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4571*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_REOPEN_FILE,
4572*6777b538SAndroid Build Coastguard Worker                                      kLargeNumEntries - 1);
4573*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4574*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
4575*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(entries[0], 1, 0, buf1.get(), kSize, true));
4576*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSize, WriteData(alt_entry, 1, 0, buf2.get(), kSize, true));
4577*6777b538SAndroid Build Coastguard Worker 
4578*6777b538SAndroid Build Coastguard Worker   auto read_buf = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4579*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, ReadData(entries[0], 1, 0, read_buf.get(), kSize));
4580*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(read_buf->data(), buf1->data(), kSize));
4581*6777b538SAndroid Build Coastguard Worker 
4582*6777b538SAndroid Build Coastguard Worker   auto read_buf2 = base::MakeRefCounted<net::IOBufferWithSize>(kSize);
4583*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kSize, ReadData(alt_entry, 1, 0, read_buf2.get(), kSize));
4584*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(read_buf2->data(), buf2->data(), kSize));
4585*6777b538SAndroid Build Coastguard Worker 
4586*6777b538SAndroid Build Coastguard Worker   // Two more things than last time --- entries[0] and |alt_entry|
4587*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount(
4588*6777b538SAndroid Build Coastguard Worker       "SimpleCache.FileDescriptorLimiterAction",
4589*6777b538SAndroid Build Coastguard Worker       disk_cache::FD_LIMIT_CLOSE_FILE,
4590*6777b538SAndroid Build Coastguard Worker       kLargeNumEntries - 64 + 1 + kLargeNumEntries - 1 + 2);
4591*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4592*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_REOPEN_FILE,
4593*6777b538SAndroid Build Coastguard Worker                                      kLargeNumEntries + 1);
4594*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4595*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
4596*6777b538SAndroid Build Coastguard Worker 
4597*6777b538SAndroid Build Coastguard Worker   for (auto* entry : entries) {
4598*6777b538SAndroid Build Coastguard Worker     entry->Close();
4599*6777b538SAndroid Build Coastguard Worker     RunUntilIdle();
4600*6777b538SAndroid Build Coastguard Worker   }
4601*6777b538SAndroid Build Coastguard Worker   alt_entry->Close();
4602*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
4603*6777b538SAndroid Build Coastguard Worker 
4604*6777b538SAndroid Build Coastguard Worker   // Closes have to pull things in to write out the footer, but they also
4605*6777b538SAndroid Build Coastguard Worker   // free up FDs.
4606*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount(
4607*6777b538SAndroid Build Coastguard Worker       "SimpleCache.FileDescriptorLimiterAction",
4608*6777b538SAndroid Build Coastguard Worker       disk_cache::FD_LIMIT_CLOSE_FILE,
4609*6777b538SAndroid Build Coastguard Worker       kLargeNumEntries - 64 + 1 + kLargeNumEntries - 1 + 2);
4610*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount(
4611*6777b538SAndroid Build Coastguard Worker       "SimpleCache.FileDescriptorLimiterAction",
4612*6777b538SAndroid Build Coastguard Worker       disk_cache::FD_LIMIT_REOPEN_FILE,
4613*6777b538SAndroid Build Coastguard Worker       kLargeNumEntries - 64 + 1 + kLargeNumEntries - 1 + 2);
4614*6777b538SAndroid Build Coastguard Worker   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
4615*6777b538SAndroid Build Coastguard Worker                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
4616*6777b538SAndroid Build Coastguard Worker }
4617*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SparseEvict)4618*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SparseEvict) {
4619*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 512;
4620*6777b538SAndroid Build Coastguard Worker 
4621*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
4622*6777b538SAndroid Build Coastguard Worker   InitCache();
4623*6777b538SAndroid Build Coastguard Worker 
4624*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(64);
4625*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), 64, false);
4626*6777b538SAndroid Build Coastguard Worker 
4627*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry0 = nullptr;
4628*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("http://www.0.com/", &entry0), IsOk());
4629*6777b538SAndroid Build Coastguard Worker 
4630*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1 = nullptr;
4631*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("http://www.1.com/", &entry1), IsOk());
4632*6777b538SAndroid Build Coastguard Worker 
4633*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2 = nullptr;
4634*6777b538SAndroid Build Coastguard Worker   // This strange looking domain name affects cache trim order
4635*6777b538SAndroid Build Coastguard Worker   // due to hashing
4636*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("http://www.15360.com/", &entry2), IsOk());
4637*6777b538SAndroid Build Coastguard Worker 
4638*6777b538SAndroid Build Coastguard Worker   // Write sparse data to put us over the eviction threshold
4639*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(64, WriteSparseData(entry0, 0, buffer.get(), 64));
4640*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1, WriteSparseData(entry0, 67108923, buffer.get(), 1));
4641*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1, WriteSparseData(entry1, 53, buffer.get(), 1));
4642*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1, WriteSparseData(entry2, 0, buffer.get(), 1));
4643*6777b538SAndroid Build Coastguard Worker 
4644*6777b538SAndroid Build Coastguard Worker   // Closing these in a special order should not lead to buggy reentrant
4645*6777b538SAndroid Build Coastguard Worker   // eviction.
4646*6777b538SAndroid Build Coastguard Worker   entry1->Close();
4647*6777b538SAndroid Build Coastguard Worker   entry2->Close();
4648*6777b538SAndroid Build Coastguard Worker   entry0->Close();
4649*6777b538SAndroid Build Coastguard Worker }
4650*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InMemorySparseDoom)4651*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemorySparseDoom) {
4652*6777b538SAndroid Build Coastguard Worker   const int kMaxSize = 512;
4653*6777b538SAndroid Build Coastguard Worker 
4654*6777b538SAndroid Build Coastguard Worker   SetMaxSize(kMaxSize);
4655*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
4656*6777b538SAndroid Build Coastguard Worker   InitCache();
4657*6777b538SAndroid Build Coastguard Worker 
4658*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(64);
4659*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), 64, false);
4660*6777b538SAndroid Build Coastguard Worker 
4661*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4662*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("http://www.0.com/", &entry), IsOk());
4663*6777b538SAndroid Build Coastguard Worker 
4664*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_FAILED, WriteSparseData(entry, 4337, buffer.get(), 64));
4665*6777b538SAndroid Build Coastguard Worker   entry->Close();
4666*6777b538SAndroid Build Coastguard Worker 
4667*6777b538SAndroid Build Coastguard Worker   // Dooming all entries at this point should properly iterate over
4668*6777b538SAndroid Build Coastguard Worker   // the parent and its children
4669*6777b538SAndroid Build Coastguard Worker   DoomAllEntries();
4670*6777b538SAndroid Build Coastguard Worker }
4671*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockFileMaxSizeLimit)4672*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileMaxSizeLimit) {
4673*6777b538SAndroid Build Coastguard Worker   InitCache();
4674*6777b538SAndroid Build Coastguard Worker 
4675*6777b538SAndroid Build Coastguard Worker   int64_t size = std::numeric_limits<int32_t>::max();
4676*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, true /* should_succeed */);
4677*6777b538SAndroid Build Coastguard Worker 
4678*6777b538SAndroid Build Coastguard Worker   size += 1;
4679*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, false /* should_succeed */);
4680*6777b538SAndroid Build Coastguard Worker }
4681*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InMemoryMaxSizeLimit)4682*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemoryMaxSizeLimit) {
4683*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
4684*6777b538SAndroid Build Coastguard Worker   InitCache();
4685*6777b538SAndroid Build Coastguard Worker 
4686*6777b538SAndroid Build Coastguard Worker   int64_t size = std::numeric_limits<int32_t>::max();
4687*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, true /* should_succeed */);
4688*6777b538SAndroid Build Coastguard Worker 
4689*6777b538SAndroid Build Coastguard Worker   size += 1;
4690*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, false /* should_succeed */);
4691*6777b538SAndroid Build Coastguard Worker }
4692*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleMaxSizeLimit)4693*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleMaxSizeLimit) {
4694*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4695*6777b538SAndroid Build Coastguard Worker   InitCache();
4696*6777b538SAndroid Build Coastguard Worker 
4697*6777b538SAndroid Build Coastguard Worker   int64_t size = std::numeric_limits<int32_t>::max();
4698*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, true /* should_succeed */);
4699*6777b538SAndroid Build Coastguard Worker 
4700*6777b538SAndroid Build Coastguard Worker   size += 1;
4701*6777b538SAndroid Build Coastguard Worker   SetMaxSize(size, true /* should_succeed */);
4702*6777b538SAndroid Build Coastguard Worker }
4703*6777b538SAndroid Build Coastguard Worker 
BackendOpenOrCreateEntry()4704*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendOpenOrCreateEntry() {
4705*6777b538SAndroid Build Coastguard Worker   // Avoid the weird kNoRandom flag on blockfile, since this needs to
4706*6777b538SAndroid Build Coastguard Worker   // test cleanup behavior actually used in production.
4707*6777b538SAndroid Build Coastguard Worker   if (memory_only_) {
4708*6777b538SAndroid Build Coastguard Worker     InitCache();
4709*6777b538SAndroid Build Coastguard Worker   } else {
4710*6777b538SAndroid Build Coastguard Worker     CleanupCacheDir();
4711*6777b538SAndroid Build Coastguard Worker     // Since we're not forcing a clean shutdown, integrity check may fail.
4712*6777b538SAndroid Build Coastguard Worker     DisableIntegrityCheck();
4713*6777b538SAndroid Build Coastguard Worker     CreateBackend(disk_cache::kNone);
4714*6777b538SAndroid Build Coastguard Worker   }
4715*6777b538SAndroid Build Coastguard Worker 
4716*6777b538SAndroid Build Coastguard Worker   // Test that new key is created.
4717*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult es1 = OpenOrCreateEntry("first");
4718*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(es1.net_error(), IsOk());
4719*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(es1.opened());
4720*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* e1 = es1.ReleaseEntry();
4721*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != e1);
4722*6777b538SAndroid Build Coastguard Worker 
4723*6777b538SAndroid Build Coastguard Worker   // Test that existing key is opened and its entry matches.
4724*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult es2 = OpenOrCreateEntry("first");
4725*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(es2.net_error(), IsOk());
4726*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(es2.opened());
4727*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* e2 = es2.ReleaseEntry();
4728*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != e2);
4729*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e1, e2);
4730*6777b538SAndroid Build Coastguard Worker 
4731*6777b538SAndroid Build Coastguard Worker   // Test that different keys' entries are not the same.
4732*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult es3 = OpenOrCreateEntry("second");
4733*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(es3.net_error(), IsOk());
4734*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(es3.opened());
4735*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* e3 = es3.ReleaseEntry();
4736*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != e3);
4737*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(e3, e1);
4738*6777b538SAndroid Build Coastguard Worker 
4739*6777b538SAndroid Build Coastguard Worker   // Test that a new entry can be created with the same key as a doomed entry.
4740*6777b538SAndroid Build Coastguard Worker   e3->Doom();
4741*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult es4 = OpenOrCreateEntry("second");
4742*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(es4.net_error(), IsOk());
4743*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(es4.opened());
4744*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* e4 = es4.ReleaseEntry();
4745*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr != e4);
4746*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(e4, e3);
4747*6777b538SAndroid Build Coastguard Worker 
4748*6777b538SAndroid Build Coastguard Worker   // Verify the expected number of entries
4749*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2, cache_->GetEntryCount());
4750*6777b538SAndroid Build Coastguard Worker 
4751*6777b538SAndroid Build Coastguard Worker   e1->Close();
4752*6777b538SAndroid Build Coastguard Worker   e2->Close();
4753*6777b538SAndroid Build Coastguard Worker   e3->Close();
4754*6777b538SAndroid Build Coastguard Worker   e4->Close();
4755*6777b538SAndroid Build Coastguard Worker 
4756*6777b538SAndroid Build Coastguard Worker   // Test proper cancellation of callback. In-memory cache
4757*6777b538SAndroid Build Coastguard Worker   // is always synchronous, so this isn't' meaningful for it.
4758*6777b538SAndroid Build Coastguard Worker   if (!memory_only_) {
4759*6777b538SAndroid Build Coastguard Worker     TestEntryResultCompletionCallback callback;
4760*6777b538SAndroid Build Coastguard Worker 
4761*6777b538SAndroid Build Coastguard Worker     // Using "first" here:
4762*6777b538SAndroid Build Coastguard Worker     // 1) It's an existing entry, so SimpleCache can't cheat with an optimistic
4763*6777b538SAndroid Build Coastguard Worker     //    create.
4764*6777b538SAndroid Build Coastguard Worker     // 2) "second"'s creation is a cheated post-doom create one, which also
4765*6777b538SAndroid Build Coastguard Worker     //    makes testing trickier.
4766*6777b538SAndroid Build Coastguard Worker     EntryResult result =
4767*6777b538SAndroid Build Coastguard Worker         cache_->OpenOrCreateEntry("first", net::HIGHEST, callback.callback());
4768*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(net::ERR_IO_PENDING, result.net_error());
4769*6777b538SAndroid Build Coastguard Worker     ResetCaches();
4770*6777b538SAndroid Build Coastguard Worker 
4771*6777b538SAndroid Build Coastguard Worker     // Callback is supposed to be cancelled, so have to flush everything
4772*6777b538SAndroid Build Coastguard Worker     // to check for any trouble.
4773*6777b538SAndroid Build Coastguard Worker     disk_cache::FlushCacheThreadForTesting();
4774*6777b538SAndroid Build Coastguard Worker     RunUntilIdle();
4775*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(callback.have_result());
4776*6777b538SAndroid Build Coastguard Worker   }
4777*6777b538SAndroid Build Coastguard Worker }
4778*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InMemoryOnlyOpenOrCreateEntry)4779*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemoryOnlyOpenOrCreateEntry) {
4780*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
4781*6777b538SAndroid Build Coastguard Worker   BackendOpenOrCreateEntry();
4782*6777b538SAndroid Build Coastguard Worker }
4783*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MAYBE_BlockFileOpenOrCreateEntry)4784*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MAYBE_BlockFileOpenOrCreateEntry) {
4785*6777b538SAndroid Build Coastguard Worker   BackendOpenOrCreateEntry();
4786*6777b538SAndroid Build Coastguard Worker }
4787*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MAYBE_SimpleOpenOrCreateEntry)4788*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MAYBE_SimpleOpenOrCreateEntry) {
4789*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4790*6777b538SAndroid Build Coastguard Worker   BackendOpenOrCreateEntry();
4791*6777b538SAndroid Build Coastguard Worker }
4792*6777b538SAndroid Build Coastguard Worker 
BackendDeadOpenNextEntry()4793*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendDeadOpenNextEntry() {
4794*6777b538SAndroid Build Coastguard Worker   InitCache();
4795*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::Backend::Iterator> iter =
4796*6777b538SAndroid Build Coastguard Worker       cache_->CreateIterator();
4797*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4798*6777b538SAndroid Build Coastguard Worker   EntryResult result = iter->OpenNextEntry(base::DoNothing());
4799*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_FAILED, result.net_error());
4800*6777b538SAndroid Build Coastguard Worker }
4801*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockFileBackendDeadOpenNextEntry)4802*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileBackendDeadOpenNextEntry) {
4803*6777b538SAndroid Build Coastguard Worker   BackendDeadOpenNextEntry();
4804*6777b538SAndroid Build Coastguard Worker }
4805*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleBackendDeadOpenNextEntry)4806*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleBackendDeadOpenNextEntry) {
4807*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4808*6777b538SAndroid Build Coastguard Worker   BackendDeadOpenNextEntry();
4809*6777b538SAndroid Build Coastguard Worker }
4810*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InMemorySimpleBackendDeadOpenNextEntry)4811*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemorySimpleBackendDeadOpenNextEntry) {
4812*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
4813*6777b538SAndroid Build Coastguard Worker   BackendDeadOpenNextEntry();
4814*6777b538SAndroid Build Coastguard Worker }
4815*6777b538SAndroid Build Coastguard Worker 
BackendIteratorConcurrentDoom()4816*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendIteratorConcurrentDoom() {
4817*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry1 = nullptr;
4818*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry2 = nullptr;
4819*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, CreateEntry("Key0", &entry1));
4820*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, CreateEntry("Key1", &entry2));
4821*6777b538SAndroid Build Coastguard Worker 
4822*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::Backend::Iterator> iter =
4823*6777b538SAndroid Build Coastguard Worker       cache_->CreateIterator();
4824*6777b538SAndroid Build Coastguard Worker 
4825*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry3 = nullptr;
4826*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, OpenEntry("Key0", &entry3));
4827*6777b538SAndroid Build Coastguard Worker 
4828*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb;
4829*6777b538SAndroid Build Coastguard Worker   EntryResult result_iter = iter->OpenNextEntry(cb.callback());
4830*6777b538SAndroid Build Coastguard Worker   result_iter = cb.GetResult(std::move(result_iter));
4831*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, result_iter.net_error());
4832*6777b538SAndroid Build Coastguard Worker 
4833*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb_doom;
4834*6777b538SAndroid Build Coastguard Worker   int rv_doom = cache_->DoomAllEntries(cb_doom.callback());
4835*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, cb_doom.GetResult(rv_doom));
4836*6777b538SAndroid Build Coastguard Worker 
4837*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb2;
4838*6777b538SAndroid Build Coastguard Worker   EntryResult result_iter2 = iter->OpenNextEntry(cb2.callback());
4839*6777b538SAndroid Build Coastguard Worker   result_iter2 = cb2.GetResult(std::move(result_iter2));
4840*6777b538SAndroid Build Coastguard Worker 
4841*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(result_iter2.net_error() == net::ERR_FAILED ||
4842*6777b538SAndroid Build Coastguard Worker               result_iter2.net_error() == net::OK);
4843*6777b538SAndroid Build Coastguard Worker 
4844*6777b538SAndroid Build Coastguard Worker   entry1->Close();
4845*6777b538SAndroid Build Coastguard Worker   entry2->Close();
4846*6777b538SAndroid Build Coastguard Worker   entry3->Close();
4847*6777b538SAndroid Build Coastguard Worker }
4848*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockFileIteratorConcurrentDoom)4849*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileIteratorConcurrentDoom) {
4850*6777b538SAndroid Build Coastguard Worker   // Init in normal mode, bug not reproducible with kNoRandom. Still need to
4851*6777b538SAndroid Build Coastguard Worker   // let the test fixture know the new eviction algorithm will be on.
4852*6777b538SAndroid Build Coastguard Worker   CleanupCacheDir();
4853*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
4854*6777b538SAndroid Build Coastguard Worker   CreateBackend(disk_cache::kNone);
4855*6777b538SAndroid Build Coastguard Worker   BackendIteratorConcurrentDoom();
4856*6777b538SAndroid Build Coastguard Worker }
4857*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleIteratorConcurrentDoom)4858*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleIteratorConcurrentDoom) {
4859*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4860*6777b538SAndroid Build Coastguard Worker   InitCache();
4861*6777b538SAndroid Build Coastguard Worker   BackendIteratorConcurrentDoom();
4862*6777b538SAndroid Build Coastguard Worker }
4863*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,InMemoryConcurrentDoom)4864*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, InMemoryConcurrentDoom) {
4865*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
4866*6777b538SAndroid Build Coastguard Worker   InitCache();
4867*6777b538SAndroid Build Coastguard Worker   BackendIteratorConcurrentDoom();
4868*6777b538SAndroid Build Coastguard Worker }
4869*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,EmptyCorruptSimpleCacheRecovery)4870*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, EmptyCorruptSimpleCacheRecovery) {
4871*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4872*6777b538SAndroid Build Coastguard Worker 
4873*6777b538SAndroid Build Coastguard Worker   const std::string kCorruptData("corrupted");
4874*6777b538SAndroid Build Coastguard Worker 
4875*6777b538SAndroid Build Coastguard Worker   // Create a corrupt fake index in an otherwise empty simple cache.
4876*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::PathExists(cache_path_));
4877*6777b538SAndroid Build Coastguard Worker   const base::FilePath index = cache_path_.AppendASCII("index");
4878*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::WriteFile(index, kCorruptData));
4879*6777b538SAndroid Build Coastguard Worker 
4880*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
4881*6777b538SAndroid Build Coastguard Worker 
4882*6777b538SAndroid Build Coastguard Worker   // Simple cache should be able to recover.
4883*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
4884*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
4885*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
4886*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb.callback());
4887*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
4888*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsOk());
4889*6777b538SAndroid Build Coastguard Worker }
4890*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover)4891*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover) {
4892*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4893*6777b538SAndroid Build Coastguard Worker   BackendOpenOrCreateEntry();
4894*6777b538SAndroid Build Coastguard Worker 
4895*6777b538SAndroid Build Coastguard Worker   const std::string kCorruptData("corrupted");
4896*6777b538SAndroid Build Coastguard Worker 
4897*6777b538SAndroid Build Coastguard Worker   // Corrupt the fake index file for the populated simple cache.
4898*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::PathExists(cache_path_));
4899*6777b538SAndroid Build Coastguard Worker   const base::FilePath index = cache_path_.AppendASCII("index");
4900*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base::WriteFile(index, kCorruptData));
4901*6777b538SAndroid Build Coastguard Worker 
4902*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
4903*6777b538SAndroid Build Coastguard Worker 
4904*6777b538SAndroid Build Coastguard Worker   // Simple cache should not be able to recover when there are entry files.
4905*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
4906*6777b538SAndroid Build Coastguard Worker       net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
4907*6777b538SAndroid Build Coastguard Worker       cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
4908*6777b538SAndroid Build Coastguard Worker       /*net_log=*/nullptr, cb.callback());
4909*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
4910*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(rv.net_error, IsError(net::ERR_FAILED));
4911*6777b538SAndroid Build Coastguard Worker }
4912*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleOwnershipTransferBackendDestroyRace)4913*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleOwnershipTransferBackendDestroyRace) {
4914*6777b538SAndroid Build Coastguard Worker   struct CleanupContext {
4915*6777b538SAndroid Build Coastguard Worker     explicit CleanupContext(bool* ran_ptr) : ran_ptr(ran_ptr) {}
4916*6777b538SAndroid Build Coastguard Worker     ~CleanupContext() {
4917*6777b538SAndroid Build Coastguard Worker       *ran_ptr = true;
4918*6777b538SAndroid Build Coastguard Worker     }
4919*6777b538SAndroid Build Coastguard Worker 
4920*6777b538SAndroid Build Coastguard Worker     raw_ptr<bool> ran_ptr;
4921*6777b538SAndroid Build Coastguard Worker   };
4922*6777b538SAndroid Build Coastguard Worker 
4923*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "skeleton";
4924*6777b538SAndroid Build Coastguard Worker 
4925*6777b538SAndroid Build Coastguard Worker   // This test was for a fix for see https://crbug.com/946349, but the mechanics
4926*6777b538SAndroid Build Coastguard Worker   // of that failure became impossible after a follow up API refactor. Still,
4927*6777b538SAndroid Build Coastguard Worker   // the timing is strange, and warrant coverage; in particular this tests what
4928*6777b538SAndroid Build Coastguard Worker   // happen if the SimpleBackendImpl is destroyed after SimpleEntryImpl
4929*6777b538SAndroid Build Coastguard Worker   // decides to return an entry to the caller, but before the callback is run.
4930*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4931*6777b538SAndroid Build Coastguard Worker   InitCache();
4932*6777b538SAndroid Build Coastguard Worker 
4933*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
4934*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
4935*6777b538SAndroid Build Coastguard Worker   // Make sure create actually succeeds, not just optimistically.
4936*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
4937*6777b538SAndroid Build Coastguard Worker 
4938*6777b538SAndroid Build Coastguard Worker   bool cleanup_context_ran = false;
4939*6777b538SAndroid Build Coastguard Worker   auto cleanup_context = std::make_unique<CleanupContext>(&cleanup_context_ran);
4940*6777b538SAndroid Build Coastguard Worker 
4941*6777b538SAndroid Build Coastguard Worker   // The OpenEntry code below will find a pre-existing entry in a READY state,
4942*6777b538SAndroid Build Coastguard Worker   // so it will immediately post a task to return a result. Destroying the
4943*6777b538SAndroid Build Coastguard Worker   // backend before running the event loop again will run that callback in the
4944*6777b538SAndroid Build Coastguard Worker   // dead-backend state, while OpenEntry completion was still with it alive.
4945*6777b538SAndroid Build Coastguard Worker 
4946*6777b538SAndroid Build Coastguard Worker   EntryResult result = cache_->OpenEntry(
4947*6777b538SAndroid Build Coastguard Worker       kKey, net::HIGHEST,
4948*6777b538SAndroid Build Coastguard Worker       base::BindOnce(
4949*6777b538SAndroid Build Coastguard Worker           [](std::unique_ptr<CleanupContext>, EntryResult result) {
4950*6777b538SAndroid Build Coastguard Worker             // The callback is here for ownership of CleanupContext,
4951*6777b538SAndroid Build Coastguard Worker             // and it shouldn't get invoked in this test. Normal
4952*6777b538SAndroid Build Coastguard Worker             // one would transfer result.entry to CleanupContext.
4953*6777b538SAndroid Build Coastguard Worker             ADD_FAILURE() << "This should not actually run";
4954*6777b538SAndroid Build Coastguard Worker 
4955*6777b538SAndroid Build Coastguard Worker             // ... but if it ran, it also shouldn't see the pointer.
4956*6777b538SAndroid Build Coastguard Worker             EXPECT_EQ(nullptr, result.ReleaseEntry());
4957*6777b538SAndroid Build Coastguard Worker           },
4958*6777b538SAndroid Build Coastguard Worker           std::move(cleanup_context)));
4959*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING, result.net_error());
4960*6777b538SAndroid Build Coastguard Worker   ResetCaches();
4961*6777b538SAndroid Build Coastguard Worker 
4962*6777b538SAndroid Build Coastguard Worker   // Give CleanupContext a chance to do its thing.
4963*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
4964*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cleanup_context_ran);
4965*6777b538SAndroid Build Coastguard Worker 
4966*6777b538SAndroid Build Coastguard Worker   entry->Close();
4967*6777b538SAndroid Build Coastguard Worker }
4968*6777b538SAndroid Build Coastguard Worker 
4969*6777b538SAndroid Build Coastguard Worker // Verify that reloading the cache will preserve indices in kNeverReset mode.
TEST_F(DiskCacheBackendTest,SimpleCacheSoftResetKeepsValues)4970*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheSoftResetKeepsValues) {
4971*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
4972*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
4973*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
4974*6777b538SAndroid Build Coastguard Worker   CleanupCacheDir();
4975*6777b538SAndroid Build Coastguard Worker 
4976*6777b538SAndroid Build Coastguard Worker   {  // Do the initial cache creation then delete the values.
4977*6777b538SAndroid Build Coastguard Worker     TestBackendResultCompletionCallback cb;
4978*6777b538SAndroid Build Coastguard Worker 
4979*6777b538SAndroid Build Coastguard Worker     // Create an initial back-end and wait for indexing
4980*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
4981*6777b538SAndroid Build Coastguard Worker         net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
4982*6777b538SAndroid Build Coastguard Worker         cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
4983*6777b538SAndroid Build Coastguard Worker         /*net_log=*/nullptr, cb.callback());
4984*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
4985*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(rv.net_error, IsOk());
4986*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
4987*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
4988*6777b538SAndroid Build Coastguard Worker     WaitForSimpleCacheIndexAndCheck(cache.get());
4989*6777b538SAndroid Build Coastguard Worker 
4990*6777b538SAndroid Build Coastguard Worker     // Create an entry in the cache
4991*6777b538SAndroid Build Coastguard Worker     CreateKeyAndCheck(cache.get(), "key");
4992*6777b538SAndroid Build Coastguard Worker   }
4993*6777b538SAndroid Build Coastguard Worker 
4994*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
4995*6777b538SAndroid Build Coastguard Worker 
4996*6777b538SAndroid Build Coastguard Worker   {  // Do the second cache creation with no reset flag, preserving entries.
4997*6777b538SAndroid Build Coastguard Worker     TestBackendResultCompletionCallback cb;
4998*6777b538SAndroid Build Coastguard Worker 
4999*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
5000*6777b538SAndroid Build Coastguard Worker         net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
5001*6777b538SAndroid Build Coastguard Worker         cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
5002*6777b538SAndroid Build Coastguard Worker         /*net_log=*/nullptr, cb.callback());
5003*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
5004*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(rv.net_error, IsOk());
5005*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
5006*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
5007*6777b538SAndroid Build Coastguard Worker     WaitForSimpleCacheIndexAndCheck(cache.get());
5008*6777b538SAndroid Build Coastguard Worker 
5009*6777b538SAndroid Build Coastguard Worker     // The entry should be present, as a forced reset was not called for.
5010*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<disk_cache::SimpleBackendImpl*>(cache.get())
5011*6777b538SAndroid Build Coastguard Worker                     ->index()
5012*6777b538SAndroid Build Coastguard Worker                     ->Has(disk_cache::simple_util::GetEntryHashKey("key")));
5013*6777b538SAndroid Build Coastguard Worker   }
5014*6777b538SAndroid Build Coastguard Worker }
5015*6777b538SAndroid Build Coastguard Worker 
5016*6777b538SAndroid Build Coastguard Worker // Verify that reloading the cache will not preserve indices in Reset mode.
TEST_F(DiskCacheBackendTest,SimpleCacheHardResetDropsValues)5017*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCacheHardResetDropsValues) {
5018*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5019*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
5020*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();
5021*6777b538SAndroid Build Coastguard Worker   CleanupCacheDir();
5022*6777b538SAndroid Build Coastguard Worker 
5023*6777b538SAndroid Build Coastguard Worker   {  // Create the initial back-end.
5024*6777b538SAndroid Build Coastguard Worker     TestBackendResultCompletionCallback cb;
5025*6777b538SAndroid Build Coastguard Worker 
5026*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
5027*6777b538SAndroid Build Coastguard Worker         net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
5028*6777b538SAndroid Build Coastguard Worker         cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
5029*6777b538SAndroid Build Coastguard Worker         /*net_log=*/nullptr, cb.callback());
5030*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
5031*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(rv.net_error, IsOk());
5032*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
5033*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
5034*6777b538SAndroid Build Coastguard Worker     WaitForSimpleCacheIndexAndCheck(cache.get());
5035*6777b538SAndroid Build Coastguard Worker 
5036*6777b538SAndroid Build Coastguard Worker     // Create an entry in the cache.
5037*6777b538SAndroid Build Coastguard Worker     CreateKeyAndCheck(cache.get(), "key");
5038*6777b538SAndroid Build Coastguard Worker   }
5039*6777b538SAndroid Build Coastguard Worker 
5040*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
5041*6777b538SAndroid Build Coastguard Worker 
5042*6777b538SAndroid Build Coastguard Worker   {  // Re-load cache with a reset flag, which should ignore existing entries.
5043*6777b538SAndroid Build Coastguard Worker     TestBackendResultCompletionCallback cb;
5044*6777b538SAndroid Build Coastguard Worker 
5045*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
5046*6777b538SAndroid Build Coastguard Worker         net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
5047*6777b538SAndroid Build Coastguard Worker         cache_path_, 0, disk_cache::ResetHandling::kReset, /*net_log=*/nullptr,
5048*6777b538SAndroid Build Coastguard Worker         cb.callback());
5049*6777b538SAndroid Build Coastguard Worker     rv = cb.GetResult(std::move(rv));
5050*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(rv.net_error, IsOk());
5051*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
5052*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(cache.get());
5053*6777b538SAndroid Build Coastguard Worker     WaitForSimpleCacheIndexAndCheck(cache.get());
5054*6777b538SAndroid Build Coastguard Worker 
5055*6777b538SAndroid Build Coastguard Worker     // The entry shouldn't be present, as a forced reset was called for.
5056*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<disk_cache::SimpleBackendImpl*>(cache.get())
5057*6777b538SAndroid Build Coastguard Worker                      ->index()
5058*6777b538SAndroid Build Coastguard Worker                      ->Has(disk_cache::simple_util::GetEntryHashKey("key")));
5059*6777b538SAndroid Build Coastguard Worker 
5060*6777b538SAndroid Build Coastguard Worker     // Add the entry back in the cache, then make sure it's present.
5061*6777b538SAndroid Build Coastguard Worker     CreateKeyAndCheck(cache.get(), "key");
5062*6777b538SAndroid Build Coastguard Worker 
5063*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<disk_cache::SimpleBackendImpl*>(cache.get())
5064*6777b538SAndroid Build Coastguard Worker                     ->index()
5065*6777b538SAndroid Build Coastguard Worker                     ->Has(disk_cache::simple_util::GetEntryHashKey("key")));
5066*6777b538SAndroid Build Coastguard Worker   }
5067*6777b538SAndroid Build Coastguard Worker }
5068*6777b538SAndroid Build Coastguard Worker 
5069*6777b538SAndroid Build Coastguard Worker // Test to make sure cancelation of backend operation that got queued after
5070*6777b538SAndroid Build Coastguard Worker // a pending doom on backend destruction happens properly.
TEST_F(DiskCacheBackendTest,SimpleCancelOpPendingDoom)5071*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleCancelOpPendingDoom) {
5072*6777b538SAndroid Build Coastguard Worker   struct CleanupContext {
5073*6777b538SAndroid Build Coastguard Worker     explicit CleanupContext(bool* ran_ptr) : ran_ptr(ran_ptr) {}
5074*6777b538SAndroid Build Coastguard Worker     ~CleanupContext() { *ran_ptr = true; }
5075*6777b538SAndroid Build Coastguard Worker 
5076*6777b538SAndroid Build Coastguard Worker     raw_ptr<bool> ran_ptr;
5077*6777b538SAndroid Build Coastguard Worker   };
5078*6777b538SAndroid Build Coastguard Worker 
5079*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "skeleton";
5080*6777b538SAndroid Build Coastguard Worker 
5081*6777b538SAndroid Build Coastguard Worker   // Disable optimistic ops.
5082*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::APP_CACHE);
5083*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5084*6777b538SAndroid Build Coastguard Worker   InitCache();
5085*6777b538SAndroid Build Coastguard Worker 
5086*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5087*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5088*6777b538SAndroid Build Coastguard Worker   entry->Close();
5089*6777b538SAndroid Build Coastguard Worker 
5090*6777b538SAndroid Build Coastguard Worker   // Queue doom.
5091*6777b538SAndroid Build Coastguard Worker   cache_->DoomEntry(kKey, net::LOWEST, base::DoNothing());
5092*6777b538SAndroid Build Coastguard Worker 
5093*6777b538SAndroid Build Coastguard Worker   // Queue create after it.
5094*6777b538SAndroid Build Coastguard Worker   bool cleanup_context_ran = false;
5095*6777b538SAndroid Build Coastguard Worker   auto cleanup_context = std::make_unique<CleanupContext>(&cleanup_context_ran);
5096*6777b538SAndroid Build Coastguard Worker 
5097*6777b538SAndroid Build Coastguard Worker   EntryResult entry_result = cache_->CreateEntry(
5098*6777b538SAndroid Build Coastguard Worker       kKey, net::HIGHEST,
5099*6777b538SAndroid Build Coastguard Worker       base::BindOnce(
5100*6777b538SAndroid Build Coastguard Worker           [](std::unique_ptr<CleanupContext>, EntryResult result) {
5101*6777b538SAndroid Build Coastguard Worker             ADD_FAILURE() << "This should not actually run";
5102*6777b538SAndroid Build Coastguard Worker           },
5103*6777b538SAndroid Build Coastguard Worker           std::move(cleanup_context)));
5104*6777b538SAndroid Build Coastguard Worker 
5105*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING, entry_result.net_error());
5106*6777b538SAndroid Build Coastguard Worker   ResetCaches();
5107*6777b538SAndroid Build Coastguard Worker 
5108*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
5109*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cleanup_context_ran);
5110*6777b538SAndroid Build Coastguard Worker }
5111*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleDontLeakPostDoomCreate)5112*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleDontLeakPostDoomCreate) {
5113*6777b538SAndroid Build Coastguard Worker   // If an entry has been optimistically created after a pending doom, and the
5114*6777b538SAndroid Build Coastguard Worker   // backend destroyed before the doom completed, the entry would get wedged,
5115*6777b538SAndroid Build Coastguard Worker   // with no operations on it workable and entry leaked.
5116*6777b538SAndroid Build Coastguard Worker   // (See https://crbug.com/1015774).
5117*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "for_lock";
5118*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 2 * 1024;
5119*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5120*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
5121*6777b538SAndroid Build Coastguard Worker 
5122*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5123*6777b538SAndroid Build Coastguard Worker   InitCache();
5124*6777b538SAndroid Build Coastguard Worker 
5125*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5126*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5127*6777b538SAndroid Build Coastguard Worker   entry->Close();
5128*6777b538SAndroid Build Coastguard Worker 
5129*6777b538SAndroid Build Coastguard Worker   // Make sure create actually succeeds, not just optimistically.
5130*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
5131*6777b538SAndroid Build Coastguard Worker 
5132*6777b538SAndroid Build Coastguard Worker   // Queue doom.
5133*6777b538SAndroid Build Coastguard Worker   int rv = cache_->DoomEntry(kKey, net::LOWEST, base::DoNothing());
5134*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_IO_PENDING, rv);
5135*6777b538SAndroid Build Coastguard Worker 
5136*6777b538SAndroid Build Coastguard Worker   // And then do a create. This actually succeeds optimistically.
5137*6777b538SAndroid Build Coastguard Worker   EntryResult result =
5138*6777b538SAndroid Build Coastguard Worker       cache_->CreateEntry(kKey, net::LOWEST, base::DoNothing());
5139*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, result.net_error());
5140*6777b538SAndroid Build Coastguard Worker   entry = result.ReleaseEntry();
5141*6777b538SAndroid Build Coastguard Worker 
5142*6777b538SAndroid Build Coastguard Worker   ResetCaches();
5143*6777b538SAndroid Build Coastguard Worker 
5144*6777b538SAndroid Build Coastguard Worker   // Entry is still supposed to be operable. This part is needed to see the bug
5145*6777b538SAndroid Build Coastguard Worker   // without a leak checker.
5146*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 1, 0, buffer.get(), kBufSize, false));
5147*6777b538SAndroid Build Coastguard Worker 
5148*6777b538SAndroid Build Coastguard Worker   entry->Close();
5149*6777b538SAndroid Build Coastguard Worker 
5150*6777b538SAndroid Build Coastguard Worker   // Should not have leaked files here.
5151*6777b538SAndroid Build Coastguard Worker }
5152*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockFileDelayedWriteFailureRecovery)5153*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileDelayedWriteFailureRecovery) {
5154*6777b538SAndroid Build Coastguard Worker   // Test that blockfile recovers appropriately when some entries are
5155*6777b538SAndroid Build Coastguard Worker   // in a screwed up state due to an error in delayed writeback.
5156*6777b538SAndroid Build Coastguard Worker   //
5157*6777b538SAndroid Build Coastguard Worker   // https://crbug.com/1086727
5158*6777b538SAndroid Build Coastguard Worker   InitCache();
5159*6777b538SAndroid Build Coastguard Worker 
5160*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "Key2";
5161*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5162*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5163*6777b538SAndroid Build Coastguard Worker 
5164*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 24320;
5165*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5166*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
5167*6777b538SAndroid Build Coastguard Worker 
5168*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(kBufSize, WriteSparseData(entry, 0, buffer.get(), kBufSize));
5169*6777b538SAndroid Build Coastguard Worker 
5170*6777b538SAndroid Build Coastguard Worker   // Setting the size limit artificially low injects a failure on writing back
5171*6777b538SAndroid Build Coastguard Worker   // data buffered above.
5172*6777b538SAndroid Build Coastguard Worker   SetMaxSize(4096);
5173*6777b538SAndroid Build Coastguard Worker 
5174*6777b538SAndroid Build Coastguard Worker   // This causes SparseControl to close the child entry corresponding to
5175*6777b538SAndroid Build Coastguard Worker   // low portion of offset space, triggering the writeback --- which fails
5176*6777b538SAndroid Build Coastguard Worker   // due to the space cap, and in particular fails to allocate data for
5177*6777b538SAndroid Build Coastguard Worker   // a stream, so it gets address 0.
5178*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_FAILED, WriteSparseData(entry, 16773118, buffer.get(), 4));
5179*6777b538SAndroid Build Coastguard Worker 
5180*6777b538SAndroid Build Coastguard Worker   // Now try reading the broken child. This should report an error, not
5181*6777b538SAndroid Build Coastguard Worker   // DCHECK.
5182*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::ERR_FAILED, ReadSparseData(entry, 4, buffer.get(), 4));
5183*6777b538SAndroid Build Coastguard Worker 
5184*6777b538SAndroid Build Coastguard Worker   entry->Close();
5185*6777b538SAndroid Build Coastguard Worker }
5186*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockFileInsertAliasing)5187*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileInsertAliasing) {
5188*6777b538SAndroid Build Coastguard Worker   // Test for not having rankings corruption due to aliasing between iterator
5189*6777b538SAndroid Build Coastguard Worker   // and other ranking list copies during insertion operations.
5190*6777b538SAndroid Build Coastguard Worker   //
5191*6777b538SAndroid Build Coastguard Worker   // https://crbug.com/1156288
5192*6777b538SAndroid Build Coastguard Worker 
5193*6777b538SAndroid Build Coastguard Worker   // Need to disable weird extra sync behavior to hit the bug.
5194*6777b538SAndroid Build Coastguard Worker   CreateBackend(disk_cache::kNone);
5195*6777b538SAndroid Build Coastguard Worker   SetNewEviction();  // default, but integrity check doesn't realize that.
5196*6777b538SAndroid Build Coastguard Worker 
5197*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "Key0";
5198*6777b538SAndroid Build Coastguard Worker   const char kKeyA[] = "KeyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA41";
5199*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5200*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5201*6777b538SAndroid Build Coastguard Worker 
5202*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 61188;
5203*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5204*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
5205*6777b538SAndroid Build Coastguard Worker 
5206*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb_write64;
5207*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING,
5208*6777b538SAndroid Build Coastguard Worker             entry->WriteSparseData(8, buffer.get(), 64, cb_write64.callback()));
5209*6777b538SAndroid Build Coastguard Worker 
5210*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback cb_write61k;
5211*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING,
5212*6777b538SAndroid Build Coastguard Worker             entry->WriteSparseData(16773118, buffer.get(), 61188,
5213*6777b538SAndroid Build Coastguard Worker                                    cb_write61k.callback()));
5214*6777b538SAndroid Build Coastguard Worker 
5215*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(64, cb_write64.WaitForResult());
5216*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(61188, cb_write61k.WaitForResult());
5217*6777b538SAndroid Build Coastguard Worker 
5218*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(4128, WriteSparseData(entry, 2147479550, buffer.get(), 4128));
5219*6777b538SAndroid Build Coastguard Worker 
5220*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TestIterator> iter = CreateIterator();
5221*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(4128, WriteSparseData(entry, 2147479550, buffer.get(), 4128));
5222*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(64, WriteSparseData(entry, 8, buffer.get(), 64));
5223*6777b538SAndroid Build Coastguard Worker 
5224*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* itEntry1 = nullptr;
5225*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, iter->OpenNextEntry(&itEntry1));
5226*6777b538SAndroid Build Coastguard Worker   // These are actually child nodes for range.
5227*6777b538SAndroid Build Coastguard Worker 
5228*6777b538SAndroid Build Coastguard Worker   entry->Close();
5229*6777b538SAndroid Build Coastguard Worker 
5230*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* itEntry2 = nullptr;
5231*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(net::OK, iter->OpenNextEntry(&itEntry2));
5232*6777b538SAndroid Build Coastguard Worker 
5233*6777b538SAndroid Build Coastguard Worker   net::TestCompletionCallback doom_cb;
5234*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::ERR_IO_PENDING, cache_->DoomAllEntries(doom_cb.callback()));
5235*6777b538SAndroid Build Coastguard Worker 
5236*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb_create1;
5237*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result =
5238*6777b538SAndroid Build Coastguard Worker       cache_->CreateEntry(kKey, net::HIGHEST, cb_create1.callback());
5239*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, doom_cb.WaitForResult());
5240*6777b538SAndroid Build Coastguard Worker   result = cb_create1.WaitForResult();
5241*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, result.net_error());
5242*6777b538SAndroid Build Coastguard Worker   entry = result.ReleaseEntry();
5243*6777b538SAndroid Build Coastguard Worker 
5244*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entryA = nullptr;
5245*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKeyA, &entryA), IsOk());
5246*6777b538SAndroid Build Coastguard Worker   entryA->Close();
5247*6777b538SAndroid Build Coastguard Worker 
5248*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* itEntry3 = nullptr;
5249*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, iter->OpenNextEntry(&itEntry3));
5250*6777b538SAndroid Build Coastguard Worker 
5251*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, DoomEntry(kKeyA));
5252*6777b538SAndroid Build Coastguard Worker   itEntry1->Close();
5253*6777b538SAndroid Build Coastguard Worker   entry->Close();
5254*6777b538SAndroid Build Coastguard Worker   itEntry2->Close();
5255*6777b538SAndroid Build Coastguard Worker   if (itEntry3)
5256*6777b538SAndroid Build Coastguard Worker     itEntry3->Close();
5257*6777b538SAndroid Build Coastguard Worker }
5258*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,MemCacheBackwardsClock)5259*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, MemCacheBackwardsClock) {
5260*6777b538SAndroid Build Coastguard Worker   // Test to make sure that wall clock going backwards is tolerated.
5261*6777b538SAndroid Build Coastguard Worker 
5262*6777b538SAndroid Build Coastguard Worker   base::SimpleTestClock clock;
5263*6777b538SAndroid Build Coastguard Worker   clock.SetNow(base::Time::Now());
5264*6777b538SAndroid Build Coastguard Worker 
5265*6777b538SAndroid Build Coastguard Worker   SetMemoryOnlyMode();
5266*6777b538SAndroid Build Coastguard Worker   InitCache();
5267*6777b538SAndroid Build Coastguard Worker   mem_cache_->SetClockForTesting(&clock);
5268*6777b538SAndroid Build Coastguard Worker 
5269*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 4 * 1024;
5270*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5271*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, true);
5272*6777b538SAndroid Build Coastguard Worker 
5273*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5274*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key1", &entry), IsOk());
5275*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
5276*6777b538SAndroid Build Coastguard Worker   entry->Close();
5277*6777b538SAndroid Build Coastguard Worker 
5278*6777b538SAndroid Build Coastguard Worker   clock.Advance(-base::Hours(1));
5279*6777b538SAndroid Build Coastguard Worker 
5280*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key2", &entry), IsOk());
5281*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
5282*6777b538SAndroid Build Coastguard Worker   entry->Close();
5283*6777b538SAndroid Build Coastguard Worker 
5284*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(2 * kBufSize,
5285*6777b538SAndroid Build Coastguard Worker             CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
5286*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(net::OK, DoomEntriesBetween(base::Time(), base::Time::Max()));
5287*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfEntriesBetween(base::Time(), base::Time::Max()));
5288*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, CalculateSizeOfAllEntries());
5289*6777b538SAndroid Build Coastguard Worker 
5290*6777b538SAndroid Build Coastguard Worker   mem_cache_->SetClockForTesting(nullptr);
5291*6777b538SAndroid Build Coastguard Worker }
5292*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleOpenOrCreateIndexError)5293*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleOpenOrCreateIndexError) {
5294*6777b538SAndroid Build Coastguard Worker   // Exercise behavior of OpenOrCreateEntry in SimpleCache where the index
5295*6777b538SAndroid Build Coastguard Worker   // incorrectly claims the entry is missing. Regression test for
5296*6777b538SAndroid Build Coastguard Worker   // https://crbug.com/1316034
5297*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "http://example.org";
5298*6777b538SAndroid Build Coastguard Worker 
5299*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 256;
5300*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5301*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, /*no_nulls=*/false);
5302*6777b538SAndroid Build Coastguard Worker 
5303*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5304*6777b538SAndroid Build Coastguard Worker   InitCache();
5305*6777b538SAndroid Build Coastguard Worker 
5306*6777b538SAndroid Build Coastguard Worker   // Create an entry.
5307*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5308*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5309*6777b538SAndroid Build Coastguard Worker 
5310*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, /*index=*/1, /*offset=*/0, buffer.get(),
5311*6777b538SAndroid Build Coastguard Worker                                 /*len=*/kBufSize, /*truncate=*/false));
5312*6777b538SAndroid Build Coastguard Worker   entry->Close();
5313*6777b538SAndroid Build Coastguard Worker 
5314*6777b538SAndroid Build Coastguard Worker   // Mess up the index to say it's not there.
5315*6777b538SAndroid Build Coastguard Worker   simple_cache_impl_->index()->Remove(
5316*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::GetEntryHashKey(kKey));
5317*6777b538SAndroid Build Coastguard Worker 
5318*6777b538SAndroid Build Coastguard Worker   // Reopening with OpenOrCreateEntry should still work.
5319*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result = OpenOrCreateEntry(kKey);
5320*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(result.net_error(), IsOk());
5321*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(result.opened());
5322*6777b538SAndroid Build Coastguard Worker   entry = result.ReleaseEntry();
5323*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, entry->GetDataSize(/*index=*/1));
5324*6777b538SAndroid Build Coastguard Worker   entry->Close();
5325*6777b538SAndroid Build Coastguard Worker }
5326*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleOpenOrCreateIndexErrorOptimistic)5327*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleOpenOrCreateIndexErrorOptimistic) {
5328*6777b538SAndroid Build Coastguard Worker   // Exercise behavior of OpenOrCreateEntry in SimpleCache where the index
5329*6777b538SAndroid Build Coastguard Worker   // incorrectly claims the entry is missing and we do an optimistic create.
5330*6777b538SAndroid Build Coastguard Worker   // Covers a codepath adjacent to the one that caused https://crbug.com/1316034
5331*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "http://example.org";
5332*6777b538SAndroid Build Coastguard Worker 
5333*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5334*6777b538SAndroid Build Coastguard Worker   InitCache();
5335*6777b538SAndroid Build Coastguard Worker 
5336*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 256;
5337*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5338*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, /*no_nulls=*/false);
5339*6777b538SAndroid Build Coastguard Worker 
5340*6777b538SAndroid Build Coastguard Worker   // Create an entry.
5341*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5342*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5343*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kBufSize, WriteData(entry, /*index=*/1, /*offset=*/0, buffer.get(),
5344*6777b538SAndroid Build Coastguard Worker                                 /*len=*/kBufSize, /*truncate=*/false));
5345*6777b538SAndroid Build Coastguard Worker   entry->Close();
5346*6777b538SAndroid Build Coastguard Worker 
5347*6777b538SAndroid Build Coastguard Worker   // Let all the I/O finish, so that OpenOrCreateEntry can try optimistic path.
5348*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
5349*6777b538SAndroid Build Coastguard Worker 
5350*6777b538SAndroid Build Coastguard Worker   // Mess up the index to say it's not there.
5351*6777b538SAndroid Build Coastguard Worker   simple_cache_impl_->index()->Remove(
5352*6777b538SAndroid Build Coastguard Worker       disk_cache::simple_util::GetEntryHashKey(kKey));
5353*6777b538SAndroid Build Coastguard Worker 
5354*6777b538SAndroid Build Coastguard Worker   // Reopening with OpenOrCreateEntry should still work, but since the backend
5355*6777b538SAndroid Build Coastguard Worker   // chose to be optimistic based on index, the result should be a fresh empty
5356*6777b538SAndroid Build Coastguard Worker   // entry.
5357*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result = OpenOrCreateEntry(kKey);
5358*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(result.net_error(), IsOk());
5359*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(result.opened());
5360*6777b538SAndroid Build Coastguard Worker   entry = result.ReleaseEntry();
5361*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, entry->GetDataSize(/*index=*/1));
5362*6777b538SAndroid Build Coastguard Worker   entry->Close();
5363*6777b538SAndroid Build Coastguard Worker }
5364*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,SimpleDoomAfterBackendDestruction)5365*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleDoomAfterBackendDestruction) {
5366*6777b538SAndroid Build Coastguard Worker   // Test for when validating file headers/footers during close on simple
5367*6777b538SAndroid Build Coastguard Worker   // backend fails. To get the header to be checked on close, there needs to be
5368*6777b538SAndroid Build Coastguard Worker   // a stream 2, since 0/1 are validated on open, and no other operation must
5369*6777b538SAndroid Build Coastguard Worker   // have happened to stream 2, since those will force it, too. A way of getting
5370*6777b538SAndroid Build Coastguard Worker   // the validation to fail is to perform a doom on the file after the backend
5371*6777b538SAndroid Build Coastguard Worker   // is destroyed, since that will truncated the files to mark them invalid. See
5372*6777b538SAndroid Build Coastguard Worker   // https://crbug.com/1317884
5373*6777b538SAndroid Build Coastguard Worker   const char kKey[] = "Key0";
5374*6777b538SAndroid Build Coastguard Worker 
5375*6777b538SAndroid Build Coastguard Worker   const int kBufSize = 256;
5376*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kBufSize);
5377*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kBufSize, /*no_nulls=*/false);
5378*6777b538SAndroid Build Coastguard Worker 
5379*6777b538SAndroid Build Coastguard Worker   SetCacheType(net::SHADER_CACHE);
5380*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5381*6777b538SAndroid Build Coastguard Worker 
5382*6777b538SAndroid Build Coastguard Worker   InitCache();
5383*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5384*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
5385*6777b538SAndroid Build Coastguard Worker 
5386*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, WriteData(entry, /*index=*/2, /*offset=*/1, buffer.get(),
5387*6777b538SAndroid Build Coastguard Worker                          /*len=*/0, /*truncate=*/false));
5388*6777b538SAndroid Build Coastguard Worker   entry->Close();
5389*6777b538SAndroid Build Coastguard Worker 
5390*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry(kKey, &entry), IsOk());
5391*6777b538SAndroid Build Coastguard Worker   ResetCaches();
5392*6777b538SAndroid Build Coastguard Worker 
5393*6777b538SAndroid Build Coastguard Worker   entry->Doom();
5394*6777b538SAndroid Build Coastguard Worker   entry->Close();
5395*6777b538SAndroid Build Coastguard Worker }
5396*6777b538SAndroid Build Coastguard Worker 
BackendValidateMigrated()5397*6777b538SAndroid Build Coastguard Worker void DiskCacheBackendTest::BackendValidateMigrated() {
5398*6777b538SAndroid Build Coastguard Worker   // Blockfile 3.0 migration test.
5399*6777b538SAndroid Build Coastguard Worker   DisableFirstCleanup();  // started from copied dir, not cleaned dir.
5400*6777b538SAndroid Build Coastguard Worker   InitCache();
5401*6777b538SAndroid Build Coastguard Worker 
5402*6777b538SAndroid Build Coastguard Worker   // The total size comes straight from the headers, and is expected to be 1258
5403*6777b538SAndroid Build Coastguard Worker   // for either set of testdata.
5404*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1258, CalculateSizeOfAllEntries());
5405*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, cache_->GetEntryCount());
5406*6777b538SAndroid Build Coastguard Worker 
5407*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5408*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(OpenEntry("https://example.org/data", &entry), IsOk());
5409*6777b538SAndroid Build Coastguard Worker 
5410*6777b538SAndroid Build Coastguard Worker   // Size of the actual payload.
5411*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1234, entry->GetDataSize(1));
5412*6777b538SAndroid Build Coastguard Worker 
5413*6777b538SAndroid Build Coastguard Worker   entry->Close();
5414*6777b538SAndroid Build Coastguard Worker }
5415*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockfileMigrate20)5416*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileMigrate20) {
5417*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("good_2_0"));
5418*6777b538SAndroid Build Coastguard Worker   BackendValidateMigrated();
5419*6777b538SAndroid Build Coastguard Worker }
5420*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockfileMigrate21)5421*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileMigrate21) {
5422*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("good_2_1"));
5423*6777b538SAndroid Build Coastguard Worker   BackendValidateMigrated();
5424*6777b538SAndroid Build Coastguard Worker }
5425*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockfileMigrateNewEviction20)5426*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileMigrateNewEviction20) {
5427*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("good_2_0"));
5428*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
5429*6777b538SAndroid Build Coastguard Worker   BackendValidateMigrated();
5430*6777b538SAndroid Build Coastguard Worker }
5431*6777b538SAndroid Build Coastguard Worker 
TEST_F(DiskCacheBackendTest,BlockfileMigrateNewEviction21)5432*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileMigrateNewEviction21) {
5433*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyTestCache("good_2_1"));
5434*6777b538SAndroid Build Coastguard Worker   SetNewEviction();
5435*6777b538SAndroid Build Coastguard Worker   BackendValidateMigrated();
5436*6777b538SAndroid Build Coastguard Worker }
5437*6777b538SAndroid Build Coastguard Worker 
5438*6777b538SAndroid Build Coastguard Worker // Disabled on android since this test requires cache creator to create
5439*6777b538SAndroid Build Coastguard Worker // blockfile caches, and we don't use them on Android anyway.
5440*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
TEST_F(DiskCacheBackendTest,BlockfileEmptyIndex)5441*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockfileEmptyIndex) {
5442*6777b538SAndroid Build Coastguard Worker   // Regression case for https://crbug.com/1441330 --- blockfile DCHECKing
5443*6777b538SAndroid Build Coastguard Worker   // on mmap error for files it uses.
5444*6777b538SAndroid Build Coastguard Worker 
5445*6777b538SAndroid Build Coastguard Worker   // Create a cache.
5446*6777b538SAndroid Build Coastguard Worker   TestBackendResultCompletionCallback cb;
5447*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
5448*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
5449*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, cache_path_, 0,
5450*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
5451*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
5452*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
5453*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
5454*6777b538SAndroid Build Coastguard Worker   rv.backend.reset();
5455*6777b538SAndroid Build Coastguard Worker 
5456*6777b538SAndroid Build Coastguard Worker   // Make sure it's done doing I/O stuff.
5457*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendImpl::FlushForTesting();
5458*6777b538SAndroid Build Coastguard Worker 
5459*6777b538SAndroid Build Coastguard Worker   // Truncate the index to zero bytes.
5460*6777b538SAndroid Build Coastguard Worker   base::File index(cache_path_.AppendASCII("index"),
5461*6777b538SAndroid Build Coastguard Worker                    base::File::FLAG_OPEN | base::File::FLAG_WRITE);
5462*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(index.IsValid());
5463*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(index.SetLength(0));
5464*6777b538SAndroid Build Coastguard Worker   index.Close();
5465*6777b538SAndroid Build Coastguard Worker 
5466*6777b538SAndroid Build Coastguard Worker   // Open the backend again. Fails w/o error-recovery.
5467*6777b538SAndroid Build Coastguard Worker   rv = disk_cache::CreateCacheBackend(
5468*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
5469*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, cache_path_, 0,
5470*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
5471*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
5472*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(rv.net_error, net::ERR_FAILED);
5473*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(rv.backend);
5474*6777b538SAndroid Build Coastguard Worker 
5475*6777b538SAndroid Build Coastguard Worker   // Now try again with the "delete and start over on error" flag people
5476*6777b538SAndroid Build Coastguard Worker   // normally use.
5477*6777b538SAndroid Build Coastguard Worker   rv = disk_cache::CreateCacheBackend(
5478*6777b538SAndroid Build Coastguard Worker       net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
5479*6777b538SAndroid Build Coastguard Worker       /*file_operations=*/nullptr, cache_path_, 0,
5480*6777b538SAndroid Build Coastguard Worker       disk_cache::ResetHandling::kResetOnError, nullptr, cb.callback());
5481*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(std::move(rv));
5482*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(rv.net_error, IsOk());
5483*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(rv.backend);
5484*6777b538SAndroid Build Coastguard Worker }
5485*6777b538SAndroid Build Coastguard Worker #endif
5486*6777b538SAndroid Build Coastguard Worker 
5487*6777b538SAndroid Build Coastguard Worker // See https://crbug.com/1486958
TEST_F(DiskCacheBackendTest,SimpleDoomIter)5488*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleDoomIter) {
5489*6777b538SAndroid Build Coastguard Worker   const int kEntries = 1000;
5490*6777b538SAndroid Build Coastguard Worker 
5491*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5492*6777b538SAndroid Build Coastguard Worker   // Note: this test relies on InitCache() making sure the index is ready.
5493*6777b538SAndroid Build Coastguard Worker   InitCache();
5494*6777b538SAndroid Build Coastguard Worker 
5495*6777b538SAndroid Build Coastguard Worker   // We create a whole bunch of entries so that deleting them will hopefully
5496*6777b538SAndroid Build Coastguard Worker   // finish after the iteration, in order to reproduce timing for the bug.
5497*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kEntries; ++i) {
5498*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry = nullptr;
5499*6777b538SAndroid Build Coastguard Worker     ASSERT_THAT(CreateEntry(base::NumberToString(i), &entry), IsOk());
5500*6777b538SAndroid Build Coastguard Worker     entry->Close();
5501*6777b538SAndroid Build Coastguard Worker   }
5502*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();  // Make sure close completes.
5503*6777b538SAndroid Build Coastguard Worker 
5504*6777b538SAndroid Build Coastguard Worker   auto iterator = cache_->CreateIterator();
5505*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
5506*6777b538SAndroid Build Coastguard Worker 
5507*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result = iterator->OpenNextEntry(
5508*6777b538SAndroid Build Coastguard Worker       base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
5509*6777b538SAndroid Build Coastguard Worker         ASSERT_EQ(result.net_error(), net::OK);
5510*6777b538SAndroid Build Coastguard Worker         disk_cache::Entry* entry = result.ReleaseEntry();
5511*6777b538SAndroid Build Coastguard Worker         entry->Doom();
5512*6777b538SAndroid Build Coastguard Worker         entry->Close();
5513*6777b538SAndroid Build Coastguard Worker         run_loop.Quit();
5514*6777b538SAndroid Build Coastguard Worker       }));
5515*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(result.net_error(), net::ERR_IO_PENDING);
5516*6777b538SAndroid Build Coastguard Worker   cache_->DoomAllEntries(base::DoNothing());
5517*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
5518*6777b538SAndroid Build Coastguard Worker }
5519*6777b538SAndroid Build Coastguard Worker 
5520*6777b538SAndroid Build Coastguard Worker // See https://crbug.com/1486958 for non-corrupting version,
5521*6777b538SAndroid Build Coastguard Worker // https://crbug.com/1510452 for corrupting one.
TEST_F(DiskCacheBackendTest,SimpleOpenIter)5522*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleOpenIter) {
5523*6777b538SAndroid Build Coastguard Worker   constexpr int kEntries = 50;
5524*6777b538SAndroid Build Coastguard Worker 
5525*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5526*6777b538SAndroid Build Coastguard Worker 
5527*6777b538SAndroid Build Coastguard Worker   for (bool do_corrupt : {false, true}) {
5528*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(do_corrupt);
5529*6777b538SAndroid Build Coastguard Worker 
5530*6777b538SAndroid Build Coastguard Worker     // Note: this test relies on InitCache() making sure the index is ready.
5531*6777b538SAndroid Build Coastguard Worker     InitCache();
5532*6777b538SAndroid Build Coastguard Worker 
5533*6777b538SAndroid Build Coastguard Worker     // We create a whole bunch of entries so that deleting them will hopefully
5534*6777b538SAndroid Build Coastguard Worker     // finish after the iteration, in order to reproduce timing for the bug.
5535*6777b538SAndroid Build Coastguard Worker     for (int i = 0; i < kEntries; ++i) {
5536*6777b538SAndroid Build Coastguard Worker       disk_cache::Entry* entry = nullptr;
5537*6777b538SAndroid Build Coastguard Worker       ASSERT_THAT(CreateEntry(base::NumberToString(i), &entry), IsOk());
5538*6777b538SAndroid Build Coastguard Worker       entry->Close();
5539*6777b538SAndroid Build Coastguard Worker     }
5540*6777b538SAndroid Build Coastguard Worker     RunUntilIdle();  // Make sure close completes.
5541*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(kEntries, cache_->GetEntryCount());
5542*6777b538SAndroid Build Coastguard Worker 
5543*6777b538SAndroid Build Coastguard Worker     // Iterate once to get the order.
5544*6777b538SAndroid Build Coastguard Worker     std::list<std::string> keys;
5545*6777b538SAndroid Build Coastguard Worker     auto iterator = cache_->CreateIterator();
5546*6777b538SAndroid Build Coastguard Worker     base::RunLoop run_loop;
5547*6777b538SAndroid Build Coastguard Worker     base::RepeatingCallback<void(EntryResult)> collect_entry_key =
5548*6777b538SAndroid Build Coastguard Worker         base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
5549*6777b538SAndroid Build Coastguard Worker           if (result.net_error() == net::ERR_FAILED) {
5550*6777b538SAndroid Build Coastguard Worker             run_loop.Quit();
5551*6777b538SAndroid Build Coastguard Worker             return;  // iteration complete.
5552*6777b538SAndroid Build Coastguard Worker           }
5553*6777b538SAndroid Build Coastguard Worker           ASSERT_EQ(result.net_error(), net::OK);
5554*6777b538SAndroid Build Coastguard Worker           disk_cache::Entry* entry = result.ReleaseEntry();
5555*6777b538SAndroid Build Coastguard Worker           keys.push_back(entry->GetKey());
5556*6777b538SAndroid Build Coastguard Worker           entry->Close();
5557*6777b538SAndroid Build Coastguard Worker           result = iterator->OpenNextEntry(collect_entry_key);
5558*6777b538SAndroid Build Coastguard Worker           EXPECT_EQ(result.net_error(), net::ERR_IO_PENDING);
5559*6777b538SAndroid Build Coastguard Worker         });
5560*6777b538SAndroid Build Coastguard Worker 
5561*6777b538SAndroid Build Coastguard Worker     disk_cache::EntryResult result = iterator->OpenNextEntry(collect_entry_key);
5562*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(result.net_error(), net::ERR_IO_PENDING);
5563*6777b538SAndroid Build Coastguard Worker     run_loop.Run();
5564*6777b538SAndroid Build Coastguard Worker 
5565*6777b538SAndroid Build Coastguard Worker     // Corrupt all the files, if we're exercising that.
5566*6777b538SAndroid Build Coastguard Worker     if (do_corrupt) {
5567*6777b538SAndroid Build Coastguard Worker       for (const auto& key : keys) {
5568*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(disk_cache::simple_util::CreateCorruptFileForTests(
5569*6777b538SAndroid Build Coastguard Worker             key, cache_path_));
5570*6777b538SAndroid Build Coastguard Worker       }
5571*6777b538SAndroid Build Coastguard Worker     }
5572*6777b538SAndroid Build Coastguard Worker 
5573*6777b538SAndroid Build Coastguard Worker     // Open all entries with iterator...
5574*6777b538SAndroid Build Coastguard Worker     int opened = 0;
5575*6777b538SAndroid Build Coastguard Worker     int iter_opened = 0;
5576*6777b538SAndroid Build Coastguard Worker     bool iter_done = false;
5577*6777b538SAndroid Build Coastguard Worker     auto all_done = [&]() { return opened == kEntries && iter_done; };
5578*6777b538SAndroid Build Coastguard Worker 
5579*6777b538SAndroid Build Coastguard Worker     iterator = cache_->CreateIterator();
5580*6777b538SAndroid Build Coastguard Worker     base::RunLoop run_loop2;
5581*6777b538SAndroid Build Coastguard Worker     base::RepeatingCallback<void(EntryResult)> handle_entry =
5582*6777b538SAndroid Build Coastguard Worker         base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
5583*6777b538SAndroid Build Coastguard Worker           ++iter_opened;
5584*6777b538SAndroid Build Coastguard Worker           if (result.net_error() == net::ERR_FAILED) {
5585*6777b538SAndroid Build Coastguard Worker             EXPECT_EQ(iter_opened - 1, do_corrupt ? 0 : kEntries);
5586*6777b538SAndroid Build Coastguard Worker             iter_done = true;
5587*6777b538SAndroid Build Coastguard Worker             if (all_done()) {
5588*6777b538SAndroid Build Coastguard Worker               run_loop2.Quit();
5589*6777b538SAndroid Build Coastguard Worker             }
5590*6777b538SAndroid Build Coastguard Worker             return;  // iteration complete.
5591*6777b538SAndroid Build Coastguard Worker           }
5592*6777b538SAndroid Build Coastguard Worker           EXPECT_EQ(result.net_error(), net::OK);
5593*6777b538SAndroid Build Coastguard Worker           result = iterator->OpenNextEntry(handle_entry);
5594*6777b538SAndroid Build Coastguard Worker           EXPECT_EQ(result.net_error(), net::ERR_IO_PENDING);
5595*6777b538SAndroid Build Coastguard Worker         });
5596*6777b538SAndroid Build Coastguard Worker 
5597*6777b538SAndroid Build Coastguard Worker     result = iterator->OpenNextEntry(handle_entry);
5598*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(result.net_error(), net::ERR_IO_PENDING);
5599*6777b538SAndroid Build Coastguard Worker 
5600*6777b538SAndroid Build Coastguard Worker     // ... while simultaneously opening them via name.
5601*6777b538SAndroid Build Coastguard Worker     auto handle_open_result =
5602*6777b538SAndroid Build Coastguard Worker         base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
5603*6777b538SAndroid Build Coastguard Worker           int expected_status = do_corrupt ? net::ERR_FAILED : net::OK;
5604*6777b538SAndroid Build Coastguard Worker           if (result.net_error() == expected_status) {
5605*6777b538SAndroid Build Coastguard Worker             ++opened;
5606*6777b538SAndroid Build Coastguard Worker           }
5607*6777b538SAndroid Build Coastguard Worker           if (all_done()) {
5608*6777b538SAndroid Build Coastguard Worker             run_loop2.Quit();
5609*6777b538SAndroid Build Coastguard Worker           }
5610*6777b538SAndroid Build Coastguard Worker         });
5611*6777b538SAndroid Build Coastguard Worker 
5612*6777b538SAndroid Build Coastguard Worker     base::RepeatingClosure open_one_entry = base::BindLambdaForTesting([&]() {
5613*6777b538SAndroid Build Coastguard Worker       std::string key = keys.front();
5614*6777b538SAndroid Build Coastguard Worker       keys.pop_front();
5615*6777b538SAndroid Build Coastguard Worker       disk_cache::EntryResult result =
5616*6777b538SAndroid Build Coastguard Worker           cache_->OpenEntry(key, net::DEFAULT_PRIORITY, handle_open_result);
5617*6777b538SAndroid Build Coastguard Worker       if (result.net_error() != net::ERR_IO_PENDING) {
5618*6777b538SAndroid Build Coastguard Worker         handle_open_result.Run(std::move(result));
5619*6777b538SAndroid Build Coastguard Worker       }
5620*6777b538SAndroid Build Coastguard Worker 
5621*6777b538SAndroid Build Coastguard Worker       if (!keys.empty()) {
5622*6777b538SAndroid Build Coastguard Worker         base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
5623*6777b538SAndroid Build Coastguard Worker             FROM_HERE, open_one_entry);
5624*6777b538SAndroid Build Coastguard Worker       }
5625*6777b538SAndroid Build Coastguard Worker     });
5626*6777b538SAndroid Build Coastguard Worker     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE,
5627*6777b538SAndroid Build Coastguard Worker                                                              open_one_entry);
5628*6777b538SAndroid Build Coastguard Worker 
5629*6777b538SAndroid Build Coastguard Worker     run_loop2.Run();
5630*6777b538SAndroid Build Coastguard Worker 
5631*6777b538SAndroid Build Coastguard Worker     // Should not have eaten any entries, if not corrupting them.
5632*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(do_corrupt ? 0 : kEntries, cache_->GetEntryCount());
5633*6777b538SAndroid Build Coastguard Worker   }
5634*6777b538SAndroid Build Coastguard Worker }
5635*6777b538SAndroid Build Coastguard Worker 
5636*6777b538SAndroid Build Coastguard Worker // Make sure that if we close an entry in callback from open/create we do not
5637*6777b538SAndroid Build Coastguard Worker // trigger dangling pointer warnings.
TEST_F(DiskCacheBackendTest,BlockFileImmediateCloseNoDangle)5638*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, BlockFileImmediateCloseNoDangle) {
5639*6777b538SAndroid Build Coastguard Worker   InitCache();
5640*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
5641*6777b538SAndroid Build Coastguard Worker   EntryResult result =
5642*6777b538SAndroid Build Coastguard Worker       cache_->CreateEntry("some key", net::HIGHEST,
5643*6777b538SAndroid Build Coastguard Worker                           base::BindLambdaForTesting([&](EntryResult result) {
5644*6777b538SAndroid Build Coastguard Worker                             ASSERT_EQ(result.net_error(), net::OK);
5645*6777b538SAndroid Build Coastguard Worker                             result.ReleaseEntry()->Close();
5646*6777b538SAndroid Build Coastguard Worker                             // Make sure the close actually happens now.
5647*6777b538SAndroid Build Coastguard Worker                             disk_cache::BackendImpl::FlushForTesting();
5648*6777b538SAndroid Build Coastguard Worker                             run_loop.Quit();
5649*6777b538SAndroid Build Coastguard Worker                           }));
5650*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result.net_error(), net::ERR_IO_PENDING);
5651*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
5652*6777b538SAndroid Build Coastguard Worker }
5653*6777b538SAndroid Build Coastguard Worker 
5654*6777b538SAndroid Build Coastguard Worker // Test that when a write causes a doom, it doesn't result in wrong delivery
5655*6777b538SAndroid Build Coastguard Worker // order of callbacks due to re-entrant operation execution.
TEST_F(DiskCacheBackendTest,SimpleWriteOrderEviction)5656*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleWriteOrderEviction) {
5657*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5658*6777b538SAndroid Build Coastguard Worker   SetMaxSize(4096);
5659*6777b538SAndroid Build Coastguard Worker   InitCache();
5660*6777b538SAndroid Build Coastguard Worker 
5661*6777b538SAndroid Build Coastguard Worker   // Writes of [1, 2, ..., kMaxSize] are more than enough to trigger eviction,
5662*6777b538SAndroid Build Coastguard Worker   // as (1 + 80)*80/2 * 2 = 6480 (last * 2 since two streams are written).
5663*6777b538SAndroid Build Coastguard Worker   constexpr int kMaxSize = 80;
5664*6777b538SAndroid Build Coastguard Worker 
5665*6777b538SAndroid Build Coastguard Worker   scoped_refptr<net::IOBufferWithSize> buffer =
5666*6777b538SAndroid Build Coastguard Worker       CacheTestCreateAndFillBuffer(kMaxSize, /*no_nulls=*/false);
5667*6777b538SAndroid Build Coastguard Worker 
5668*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5669*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
5670*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(entry);
5671*6777b538SAndroid Build Coastguard Worker 
5672*6777b538SAndroid Build Coastguard Worker   bool expected_next_write_stream_1 = true;
5673*6777b538SAndroid Build Coastguard Worker   int expected_next_write_size = 1;
5674*6777b538SAndroid Build Coastguard Worker   int next_offset = 0;
5675*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
5676*6777b538SAndroid Build Coastguard Worker   for (int size = 1; size <= kMaxSize; ++size) {
5677*6777b538SAndroid Build Coastguard Worker     entry->WriteData(/*index=*/1, /*offset = */ next_offset, buffer.get(),
5678*6777b538SAndroid Build Coastguard Worker                      /*buf_len=*/size,
5679*6777b538SAndroid Build Coastguard Worker                      base::BindLambdaForTesting([&](int result) {
5680*6777b538SAndroid Build Coastguard Worker                        EXPECT_TRUE(expected_next_write_stream_1);
5681*6777b538SAndroid Build Coastguard Worker                        EXPECT_EQ(result, expected_next_write_size);
5682*6777b538SAndroid Build Coastguard Worker                        expected_next_write_stream_1 = false;
5683*6777b538SAndroid Build Coastguard Worker                      }),
5684*6777b538SAndroid Build Coastguard Worker                      /*truncate=*/true);
5685*6777b538SAndroid Build Coastguard Worker     // Stream 0 writes are used here because unlike with stream 1 ones,
5686*6777b538SAndroid Build Coastguard Worker     // WriteDataInternal can succeed and queue response callback immediately.
5687*6777b538SAndroid Build Coastguard Worker     entry->WriteData(/*index=*/0, /*offset = */ next_offset, buffer.get(),
5688*6777b538SAndroid Build Coastguard Worker                      /*buf_len=*/size,
5689*6777b538SAndroid Build Coastguard Worker                      base::BindLambdaForTesting([&](int result) {
5690*6777b538SAndroid Build Coastguard Worker                        EXPECT_FALSE(expected_next_write_stream_1);
5691*6777b538SAndroid Build Coastguard Worker                        EXPECT_EQ(result, expected_next_write_size);
5692*6777b538SAndroid Build Coastguard Worker                        expected_next_write_stream_1 = true;
5693*6777b538SAndroid Build Coastguard Worker                        ++expected_next_write_size;
5694*6777b538SAndroid Build Coastguard Worker                        if (expected_next_write_size == (kMaxSize + 1)) {
5695*6777b538SAndroid Build Coastguard Worker                          run_loop.Quit();
5696*6777b538SAndroid Build Coastguard Worker                        }
5697*6777b538SAndroid Build Coastguard Worker                      }),
5698*6777b538SAndroid Build Coastguard Worker                      /*truncate=*/true);
5699*6777b538SAndroid Build Coastguard Worker     next_offset += size;
5700*6777b538SAndroid Build Coastguard Worker   }
5701*6777b538SAndroid Build Coastguard Worker 
5702*6777b538SAndroid Build Coastguard Worker   entry->Close();
5703*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
5704*6777b538SAndroid Build Coastguard Worker }
5705*6777b538SAndroid Build Coastguard Worker 
5706*6777b538SAndroid Build Coastguard Worker // Test that when a write causes a doom, it doesn't result in wrong delivery
5707*6777b538SAndroid Build Coastguard Worker // order of callbacks due to re-entrant operation execution. Variant that
5708*6777b538SAndroid Build Coastguard Worker // uses stream 0 ops only.
TEST_F(DiskCacheBackendTest,SimpleWriteOrderEvictionStream0)5709*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleWriteOrderEvictionStream0) {
5710*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5711*6777b538SAndroid Build Coastguard Worker   SetMaxSize(4096);
5712*6777b538SAndroid Build Coastguard Worker   InitCache();
5713*6777b538SAndroid Build Coastguard Worker 
5714*6777b538SAndroid Build Coastguard Worker   // Writes of [1, 2, ..., kMaxSize] are more than enough to trigger eviction,
5715*6777b538SAndroid Build Coastguard Worker   // as (1 + 120)*120/2 = 7260.
5716*6777b538SAndroid Build Coastguard Worker   constexpr int kMaxSize = 120;
5717*6777b538SAndroid Build Coastguard Worker 
5718*6777b538SAndroid Build Coastguard Worker   scoped_refptr<net::IOBufferWithSize> buffer =
5719*6777b538SAndroid Build Coastguard Worker       CacheTestCreateAndFillBuffer(kMaxSize, /*no_nulls=*/false);
5720*6777b538SAndroid Build Coastguard Worker 
5721*6777b538SAndroid Build Coastguard Worker   disk_cache::Entry* entry = nullptr;
5722*6777b538SAndroid Build Coastguard Worker   ASSERT_THAT(CreateEntry("key", &entry), IsOk());
5723*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(entry);
5724*6777b538SAndroid Build Coastguard Worker 
5725*6777b538SAndroid Build Coastguard Worker   int expected_next_write_size = 1;
5726*6777b538SAndroid Build Coastguard Worker   int next_offset = 0;
5727*6777b538SAndroid Build Coastguard Worker   base::RunLoop run_loop;
5728*6777b538SAndroid Build Coastguard Worker   for (int size = 1; size <= kMaxSize; ++size) {
5729*6777b538SAndroid Build Coastguard Worker     // Stream 0 writes are used here because unlike with stream 1 ones,
5730*6777b538SAndroid Build Coastguard Worker     // WriteDataInternal can succeed and queue response callback immediately.
5731*6777b538SAndroid Build Coastguard Worker     entry->WriteData(/*index=*/0, /*offset = */ next_offset, buffer.get(),
5732*6777b538SAndroid Build Coastguard Worker                      /*buf_len=*/size,
5733*6777b538SAndroid Build Coastguard Worker                      base::BindLambdaForTesting([&](int result) {
5734*6777b538SAndroid Build Coastguard Worker                        EXPECT_EQ(result, expected_next_write_size);
5735*6777b538SAndroid Build Coastguard Worker                        ++expected_next_write_size;
5736*6777b538SAndroid Build Coastguard Worker                        if (expected_next_write_size == (kMaxSize + 1)) {
5737*6777b538SAndroid Build Coastguard Worker                          run_loop.Quit();
5738*6777b538SAndroid Build Coastguard Worker                        }
5739*6777b538SAndroid Build Coastguard Worker                      }),
5740*6777b538SAndroid Build Coastguard Worker                      /*truncate=*/true);
5741*6777b538SAndroid Build Coastguard Worker     next_offset += size;
5742*6777b538SAndroid Build Coastguard Worker   }
5743*6777b538SAndroid Build Coastguard Worker 
5744*6777b538SAndroid Build Coastguard Worker   entry->Close();
5745*6777b538SAndroid Build Coastguard Worker   run_loop.Run();
5746*6777b538SAndroid Build Coastguard Worker }
5747*6777b538SAndroid Build Coastguard Worker 
5748*6777b538SAndroid Build Coastguard Worker // Test to make sure that if entry creation triggers eviction, a queued up
5749*6777b538SAndroid Build Coastguard Worker // close (possible with optimistic ops) doesn't run from within creation
5750*6777b538SAndroid Build Coastguard Worker // completion handler (which is indirectly detected as a dangling pointer).
TEST_F(DiskCacheBackendTest,SimpleNoCloseFromWithinCreate)5751*6777b538SAndroid Build Coastguard Worker TEST_F(DiskCacheBackendTest, SimpleNoCloseFromWithinCreate) {
5752*6777b538SAndroid Build Coastguard Worker   SetSimpleCacheMode();
5753*6777b538SAndroid Build Coastguard Worker   SetMaxSize(4096);
5754*6777b538SAndroid Build Coastguard Worker   InitCache();
5755*6777b538SAndroid Build Coastguard Worker 
5756*6777b538SAndroid Build Coastguard Worker   // Make entries big enough to force their eviction.
5757*6777b538SAndroid Build Coastguard Worker   constexpr int kDataSize = 4097;
5758*6777b538SAndroid Build Coastguard Worker 
5759*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(kDataSize);
5760*6777b538SAndroid Build Coastguard Worker   CacheTestFillBuffer(buffer->data(), kDataSize, false);
5761*6777b538SAndroid Build Coastguard Worker 
5762*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 100; ++i) {
5763*6777b538SAndroid Build Coastguard Worker     std::string key = base::NumberToString(i);
5764*6777b538SAndroid Build Coastguard Worker     EntryResult entry_result =
5765*6777b538SAndroid Build Coastguard Worker         cache_->CreateEntry(key, net::HIGHEST, base::DoNothing());
5766*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(entry_result.net_error(), net::OK);
5767*6777b538SAndroid Build Coastguard Worker     disk_cache::Entry* entry = entry_result.ReleaseEntry();
5768*6777b538SAndroid Build Coastguard Worker     // Doing stream 0 write to avoid need for thread round-trips for it to take
5769*6777b538SAndroid Build Coastguard Worker     // effect if SimpleEntryImpl runs it.
5770*6777b538SAndroid Build Coastguard Worker     entry->WriteData(/*index=*/0, /*offset = */ 0, buffer.get(),
5771*6777b538SAndroid Build Coastguard Worker                      /*buf_len=*/kDataSize,
5772*6777b538SAndroid Build Coastguard Worker                      base::BindLambdaForTesting(
5773*6777b538SAndroid Build Coastguard Worker                          [&](int result) { EXPECT_EQ(kDataSize, result); }),
5774*6777b538SAndroid Build Coastguard Worker                      /*truncate=*/true);
5775*6777b538SAndroid Build Coastguard Worker     entry->Close();
5776*6777b538SAndroid Build Coastguard Worker   }
5777*6777b538SAndroid Build Coastguard Worker   RunUntilIdle();
5778*6777b538SAndroid Build Coastguard Worker }
5779