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