xref: /aosp_15_r20/external/cronet/net/http/mock_http_cache.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/http/mock_http_cache.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <limits>
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker #include <utility>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache_test_util.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/http/http_cache_writers.h"
22*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker namespace net {
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // During testing, we are going to limit the size of a cache entry to this many
29*6777b538SAndroid Build Coastguard Worker // bytes using DCHECKs in order to prevent a test from causing unbounded memory
30*6777b538SAndroid Build Coastguard Worker // growth. In practice cache entry shouldn't come anywhere near this limit for
31*6777b538SAndroid Build Coastguard Worker // tests that use the mock cache. If they do, that's likely a problem with the
32*6777b538SAndroid Build Coastguard Worker // test. If a test requires using massive cache entries, they should use a real
33*6777b538SAndroid Build Coastguard Worker // cache backend instead.
34*6777b538SAndroid Build Coastguard Worker const int kMaxMockCacheEntrySize = 100 * 1000 * 1000;
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // We can override the test mode for a given operation by setting this global
37*6777b538SAndroid Build Coastguard Worker // variable.
38*6777b538SAndroid Build Coastguard Worker int g_test_mode = 0;
39*6777b538SAndroid Build Coastguard Worker 
GetTestModeForEntry(const std::string & key)40*6777b538SAndroid Build Coastguard Worker int GetTestModeForEntry(const std::string& key) {
41*6777b538SAndroid Build Coastguard Worker   GURL url(HttpCache::GetResourceURLFromHttpCacheKey(key));
42*6777b538SAndroid Build Coastguard Worker   const MockTransaction* t = FindMockTransaction(url);
43*6777b538SAndroid Build Coastguard Worker   DCHECK(t);
44*6777b538SAndroid Build Coastguard Worker   return t->test_mode;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker }  // namespace
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker struct MockDiskEntry::CallbackInfo {
52*6777b538SAndroid Build Coastguard Worker   scoped_refptr<MockDiskEntry> entry;
53*6777b538SAndroid Build Coastguard Worker   base::OnceClosure callback;
54*6777b538SAndroid Build Coastguard Worker };
55*6777b538SAndroid Build Coastguard Worker 
MockDiskEntry(const std::string & key)56*6777b538SAndroid Build Coastguard Worker MockDiskEntry::MockDiskEntry(const std::string& key)
57*6777b538SAndroid Build Coastguard Worker     : key_(key), max_file_size_(std::numeric_limits<int>::max()) {
58*6777b538SAndroid Build Coastguard Worker   test_mode_ = GetTestModeForEntry(key);
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker 
Doom()61*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::Doom() {
62*6777b538SAndroid Build Coastguard Worker   doomed_ = true;
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
Close()65*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::Close() {
66*6777b538SAndroid Build Coastguard Worker   Release();
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker 
GetKey() const69*6777b538SAndroid Build Coastguard Worker std::string MockDiskEntry::GetKey() const {
70*6777b538SAndroid Build Coastguard Worker   return key_;
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
GetLastUsed() const73*6777b538SAndroid Build Coastguard Worker base::Time MockDiskEntry::GetLastUsed() const {
74*6777b538SAndroid Build Coastguard Worker   return base::Time::Now();
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker 
GetLastModified() const77*6777b538SAndroid Build Coastguard Worker base::Time MockDiskEntry::GetLastModified() const {
78*6777b538SAndroid Build Coastguard Worker   return base::Time::Now();
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
GetDataSize(int index) const81*6777b538SAndroid Build Coastguard Worker int32_t MockDiskEntry::GetDataSize(int index) const {
82*6777b538SAndroid Build Coastguard Worker   DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
83*6777b538SAndroid Build Coastguard Worker   return static_cast<int32_t>(data_[index].size());
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker 
ReadData(int index,int offset,IOBuffer * buf,int buf_len,CompletionOnceCallback callback)86*6777b538SAndroid Build Coastguard Worker int MockDiskEntry::ReadData(int index,
87*6777b538SAndroid Build Coastguard Worker                             int offset,
88*6777b538SAndroid Build Coastguard Worker                             IOBuffer* buf,
89*6777b538SAndroid Build Coastguard Worker                             int buf_len,
90*6777b538SAndroid Build Coastguard Worker                             CompletionOnceCallback callback) {
91*6777b538SAndroid Build Coastguard Worker   DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
92*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   if (fail_requests_ & FAIL_READ) {
95*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_READ_FAILURE;
96*6777b538SAndroid Build Coastguard Worker   }
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker   if (offset < 0 || offset > static_cast<int>(data_[index].size())) {
99*6777b538SAndroid Build Coastguard Worker     return ERR_FAILED;
100*6777b538SAndroid Build Coastguard Worker   }
101*6777b538SAndroid Build Coastguard Worker   if (static_cast<size_t>(offset) == data_[index].size()) {
102*6777b538SAndroid Build Coastguard Worker     return 0;
103*6777b538SAndroid Build Coastguard Worker   }
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   int num = std::min(buf_len, static_cast<int>(data_[index].size()) - offset);
106*6777b538SAndroid Build Coastguard Worker   memcpy(buf->data(), &data_[index][offset], num);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) {
109*6777b538SAndroid Build Coastguard Worker     return num;
110*6777b538SAndroid Build Coastguard Worker   }
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   // Pause and resume.
113*6777b538SAndroid Build Coastguard Worker   if (defer_op_ == DEFER_READ) {
114*6777b538SAndroid Build Coastguard Worker     defer_op_ = DEFER_NONE;
115*6777b538SAndroid Build Coastguard Worker     resume_callback_ = std::move(callback);
116*6777b538SAndroid Build Coastguard Worker     resume_return_code_ = num;
117*6777b538SAndroid Build Coastguard Worker     return ERR_IO_PENDING;
118*6777b538SAndroid Build Coastguard Worker   }
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(callback), num);
121*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker 
ResumeDiskEntryOperation()124*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::ResumeDiskEntryOperation() {
125*6777b538SAndroid Build Coastguard Worker   DCHECK(!resume_callback_.is_null());
126*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(resume_callback_), resume_return_code_);
127*6777b538SAndroid Build Coastguard Worker   resume_return_code_ = 0;
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker 
WriteData(int index,int offset,IOBuffer * buf,int buf_len,CompletionOnceCallback callback,bool truncate)130*6777b538SAndroid Build Coastguard Worker int MockDiskEntry::WriteData(int index,
131*6777b538SAndroid Build Coastguard Worker                              int offset,
132*6777b538SAndroid Build Coastguard Worker                              IOBuffer* buf,
133*6777b538SAndroid Build Coastguard Worker                              int buf_len,
134*6777b538SAndroid Build Coastguard Worker                              CompletionOnceCallback callback,
135*6777b538SAndroid Build Coastguard Worker                              bool truncate) {
136*6777b538SAndroid Build Coastguard Worker   DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
137*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
138*6777b538SAndroid Build Coastguard Worker   DCHECK(truncate);
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   if (fail_requests_ & FAIL_WRITE) {
141*6777b538SAndroid Build Coastguard Worker     CallbackLater(std::move(callback), ERR_CACHE_READ_FAILURE);
142*6777b538SAndroid Build Coastguard Worker     return ERR_IO_PENDING;
143*6777b538SAndroid Build Coastguard Worker   }
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker   if (offset < 0 || offset > static_cast<int>(data_[index].size())) {
146*6777b538SAndroid Build Coastguard Worker     return ERR_FAILED;
147*6777b538SAndroid Build Coastguard Worker   }
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   DCHECK_LT(offset + buf_len, kMaxMockCacheEntrySize);
150*6777b538SAndroid Build Coastguard Worker   if (offset + buf_len > max_file_size_ && index == 1) {
151*6777b538SAndroid Build Coastguard Worker     return net::ERR_FAILED;
152*6777b538SAndroid Build Coastguard Worker   }
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker   data_[index].resize(offset + buf_len);
155*6777b538SAndroid Build Coastguard Worker   if (buf_len) {
156*6777b538SAndroid Build Coastguard Worker     memcpy(&data_[index][offset], buf->data(), buf_len);
157*6777b538SAndroid Build Coastguard Worker   }
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) {
160*6777b538SAndroid Build Coastguard Worker     return buf_len;
161*6777b538SAndroid Build Coastguard Worker   }
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   if (defer_op_ == DEFER_WRITE) {
164*6777b538SAndroid Build Coastguard Worker     defer_op_ = DEFER_NONE;
165*6777b538SAndroid Build Coastguard Worker     resume_callback_ = std::move(callback);
166*6777b538SAndroid Build Coastguard Worker     resume_return_code_ = buf_len;
167*6777b538SAndroid Build Coastguard Worker     return ERR_IO_PENDING;
168*6777b538SAndroid Build Coastguard Worker   }
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(callback), buf_len);
171*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker 
ReadSparseData(int64_t offset,IOBuffer * buf,int buf_len,CompletionOnceCallback callback)174*6777b538SAndroid Build Coastguard Worker int MockDiskEntry::ReadSparseData(int64_t offset,
175*6777b538SAndroid Build Coastguard Worker                                   IOBuffer* buf,
176*6777b538SAndroid Build Coastguard Worker                                   int buf_len,
177*6777b538SAndroid Build Coastguard Worker                                   CompletionOnceCallback callback) {
178*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
179*6777b538SAndroid Build Coastguard Worker   if (fail_sparse_requests_) {
180*6777b538SAndroid Build Coastguard Worker     return ERR_NOT_IMPLEMENTED;
181*6777b538SAndroid Build Coastguard Worker   }
182*6777b538SAndroid Build Coastguard Worker   if (!sparse_ || busy_ || cancel_) {
183*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_OPERATION_NOT_SUPPORTED;
184*6777b538SAndroid Build Coastguard Worker   }
185*6777b538SAndroid Build Coastguard Worker   if (offset < 0) {
186*6777b538SAndroid Build Coastguard Worker     return ERR_FAILED;
187*6777b538SAndroid Build Coastguard Worker   }
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker   if (fail_requests_ & FAIL_READ_SPARSE) {
190*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_READ_FAILURE;
191*6777b538SAndroid Build Coastguard Worker   }
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   DCHECK(offset < std::numeric_limits<int32_t>::max());
194*6777b538SAndroid Build Coastguard Worker   int real_offset = static_cast<int>(offset);
195*6777b538SAndroid Build Coastguard Worker   if (!buf_len) {
196*6777b538SAndroid Build Coastguard Worker     return 0;
197*6777b538SAndroid Build Coastguard Worker   }
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker   int num = std::min(static_cast<int>(data_[1].size()) - real_offset, buf_len);
200*6777b538SAndroid Build Coastguard Worker   memcpy(buf->data(), &data_[1][real_offset], num);
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) {
203*6777b538SAndroid Build Coastguard Worker     return num;
204*6777b538SAndroid Build Coastguard Worker   }
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(callback), num);
207*6777b538SAndroid Build Coastguard Worker   busy_ = true;
208*6777b538SAndroid Build Coastguard Worker   delayed_ = false;
209*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker 
WriteSparseData(int64_t offset,IOBuffer * buf,int buf_len,CompletionOnceCallback callback)212*6777b538SAndroid Build Coastguard Worker int MockDiskEntry::WriteSparseData(int64_t offset,
213*6777b538SAndroid Build Coastguard Worker                                    IOBuffer* buf,
214*6777b538SAndroid Build Coastguard Worker                                    int buf_len,
215*6777b538SAndroid Build Coastguard Worker                                    CompletionOnceCallback callback) {
216*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
217*6777b538SAndroid Build Coastguard Worker   if (fail_sparse_requests_) {
218*6777b538SAndroid Build Coastguard Worker     return ERR_NOT_IMPLEMENTED;
219*6777b538SAndroid Build Coastguard Worker   }
220*6777b538SAndroid Build Coastguard Worker   if (busy_ || cancel_) {
221*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_OPERATION_NOT_SUPPORTED;
222*6777b538SAndroid Build Coastguard Worker   }
223*6777b538SAndroid Build Coastguard Worker   if (!sparse_) {
224*6777b538SAndroid Build Coastguard Worker     if (data_[1].size()) {
225*6777b538SAndroid Build Coastguard Worker       return ERR_CACHE_OPERATION_NOT_SUPPORTED;
226*6777b538SAndroid Build Coastguard Worker     }
227*6777b538SAndroid Build Coastguard Worker     sparse_ = true;
228*6777b538SAndroid Build Coastguard Worker   }
229*6777b538SAndroid Build Coastguard Worker   if (offset < 0) {
230*6777b538SAndroid Build Coastguard Worker     return ERR_FAILED;
231*6777b538SAndroid Build Coastguard Worker   }
232*6777b538SAndroid Build Coastguard Worker   if (!buf_len) {
233*6777b538SAndroid Build Coastguard Worker     return 0;
234*6777b538SAndroid Build Coastguard Worker   }
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   if (fail_requests_ & FAIL_WRITE_SPARSE) {
237*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_READ_FAILURE;
238*6777b538SAndroid Build Coastguard Worker   }
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker   DCHECK(offset < std::numeric_limits<int32_t>::max());
241*6777b538SAndroid Build Coastguard Worker   int real_offset = static_cast<int>(offset);
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker   if (static_cast<int>(data_[1].size()) < real_offset + buf_len) {
244*6777b538SAndroid Build Coastguard Worker     DCHECK_LT(real_offset + buf_len, kMaxMockCacheEntrySize);
245*6777b538SAndroid Build Coastguard Worker     data_[1].resize(real_offset + buf_len);
246*6777b538SAndroid Build Coastguard Worker   }
247*6777b538SAndroid Build Coastguard Worker 
248*6777b538SAndroid Build Coastguard Worker   memcpy(&data_[1][real_offset], buf->data(), buf_len);
249*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) {
250*6777b538SAndroid Build Coastguard Worker     return buf_len;
251*6777b538SAndroid Build Coastguard Worker   }
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(callback), buf_len);
254*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker 
GetAvailableRange(int64_t offset,int len,RangeResultCallback callback)257*6777b538SAndroid Build Coastguard Worker disk_cache::RangeResult MockDiskEntry::GetAvailableRange(
258*6777b538SAndroid Build Coastguard Worker     int64_t offset,
259*6777b538SAndroid Build Coastguard Worker     int len,
260*6777b538SAndroid Build Coastguard Worker     RangeResultCallback callback) {
261*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
262*6777b538SAndroid Build Coastguard Worker   if (!sparse_ || busy_ || cancel_) {
263*6777b538SAndroid Build Coastguard Worker     return RangeResult(ERR_CACHE_OPERATION_NOT_SUPPORTED);
264*6777b538SAndroid Build Coastguard Worker   }
265*6777b538SAndroid Build Coastguard Worker   if (offset < 0) {
266*6777b538SAndroid Build Coastguard Worker     return RangeResult(ERR_FAILED);
267*6777b538SAndroid Build Coastguard Worker   }
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker   if (fail_requests_ & FAIL_GET_AVAILABLE_RANGE) {
270*6777b538SAndroid Build Coastguard Worker     return RangeResult(ERR_CACHE_READ_FAILURE);
271*6777b538SAndroid Build Coastguard Worker   }
272*6777b538SAndroid Build Coastguard Worker 
273*6777b538SAndroid Build Coastguard Worker   RangeResult result;
274*6777b538SAndroid Build Coastguard Worker   result.net_error = OK;
275*6777b538SAndroid Build Coastguard Worker   result.start = offset;
276*6777b538SAndroid Build Coastguard Worker   result.available_len = 0;
277*6777b538SAndroid Build Coastguard Worker   DCHECK(offset < std::numeric_limits<int32_t>::max());
278*6777b538SAndroid Build Coastguard Worker   int real_offset = static_cast<int>(offset);
279*6777b538SAndroid Build Coastguard Worker   if (static_cast<int>(data_[1].size()) < real_offset) {
280*6777b538SAndroid Build Coastguard Worker     return result;
281*6777b538SAndroid Build Coastguard Worker   }
282*6777b538SAndroid Build Coastguard Worker 
283*6777b538SAndroid Build Coastguard Worker   int num = std::min(static_cast<int>(data_[1].size()) - real_offset, len);
284*6777b538SAndroid Build Coastguard Worker   for (; num > 0; num--, real_offset++) {
285*6777b538SAndroid Build Coastguard Worker     if (!result.available_len) {
286*6777b538SAndroid Build Coastguard Worker       if (data_[1][real_offset]) {
287*6777b538SAndroid Build Coastguard Worker         result.available_len++;
288*6777b538SAndroid Build Coastguard Worker         result.start = real_offset;
289*6777b538SAndroid Build Coastguard Worker       }
290*6777b538SAndroid Build Coastguard Worker     } else {
291*6777b538SAndroid Build Coastguard Worker       if (!data_[1][real_offset]) {
292*6777b538SAndroid Build Coastguard Worker         break;
293*6777b538SAndroid Build Coastguard Worker       }
294*6777b538SAndroid Build Coastguard Worker       result.available_len++;
295*6777b538SAndroid Build Coastguard Worker     }
296*6777b538SAndroid Build Coastguard Worker   }
297*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) {
298*6777b538SAndroid Build Coastguard Worker     return result;
299*6777b538SAndroid Build Coastguard Worker   }
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   CallbackLater(base::BindOnce(std::move(callback), result));
302*6777b538SAndroid Build Coastguard Worker   return RangeResult(ERR_IO_PENDING);
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker 
CouldBeSparse() const305*6777b538SAndroid Build Coastguard Worker bool MockDiskEntry::CouldBeSparse() const {
306*6777b538SAndroid Build Coastguard Worker   if (fail_sparse_requests_) {
307*6777b538SAndroid Build Coastguard Worker     return false;
308*6777b538SAndroid Build Coastguard Worker   }
309*6777b538SAndroid Build Coastguard Worker   return sparse_;
310*6777b538SAndroid Build Coastguard Worker }
311*6777b538SAndroid Build Coastguard Worker 
CancelSparseIO()312*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::CancelSparseIO() {
313*6777b538SAndroid Build Coastguard Worker   cancel_ = true;
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker 
ReadyForSparseIO(CompletionOnceCallback callback)316*6777b538SAndroid Build Coastguard Worker net::Error MockDiskEntry::ReadyForSparseIO(CompletionOnceCallback callback) {
317*6777b538SAndroid Build Coastguard Worker   if (fail_sparse_requests_) {
318*6777b538SAndroid Build Coastguard Worker     return ERR_NOT_IMPLEMENTED;
319*6777b538SAndroid Build Coastguard Worker   }
320*6777b538SAndroid Build Coastguard Worker   if (!cancel_) {
321*6777b538SAndroid Build Coastguard Worker     return OK;
322*6777b538SAndroid Build Coastguard Worker   }
323*6777b538SAndroid Build Coastguard Worker 
324*6777b538SAndroid Build Coastguard Worker   cancel_ = false;
325*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
326*6777b538SAndroid Build Coastguard Worker   if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) {
327*6777b538SAndroid Build Coastguard Worker     return OK;
328*6777b538SAndroid Build Coastguard Worker   }
329*6777b538SAndroid Build Coastguard Worker 
330*6777b538SAndroid Build Coastguard Worker   // The pending operation is already in the message loop (and hopefully
331*6777b538SAndroid Build Coastguard Worker   // already in the second pass).  Just notify the caller that it finished.
332*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(callback), 0);
333*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
334*6777b538SAndroid Build Coastguard Worker }
335*6777b538SAndroid Build Coastguard Worker 
SetLastUsedTimeForTest(base::Time time)336*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::SetLastUsedTimeForTest(base::Time time) {
337*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
338*6777b538SAndroid Build Coastguard Worker }
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker // If |value| is true, don't deliver any completion callbacks until called
341*6777b538SAndroid Build Coastguard Worker // again with |value| set to false.  Caution: remember to enable callbacks
342*6777b538SAndroid Build Coastguard Worker // again or all subsequent tests will fail.
343*6777b538SAndroid Build Coastguard Worker // Static.
IgnoreCallbacks(bool value)344*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::IgnoreCallbacks(bool value) {
345*6777b538SAndroid Build Coastguard Worker   if (ignore_callbacks_ == value) {
346*6777b538SAndroid Build Coastguard Worker     return;
347*6777b538SAndroid Build Coastguard Worker   }
348*6777b538SAndroid Build Coastguard Worker   ignore_callbacks_ = value;
349*6777b538SAndroid Build Coastguard Worker   if (!value) {
350*6777b538SAndroid Build Coastguard Worker     StoreAndDeliverCallbacks(false, nullptr, base::OnceClosure());
351*6777b538SAndroid Build Coastguard Worker   }
352*6777b538SAndroid Build Coastguard Worker }
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker MockDiskEntry::~MockDiskEntry() = default;
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker // Unlike the callbacks for MockHttpTransaction, we want this one to run even
357*6777b538SAndroid Build Coastguard Worker // if the consumer called Close on the MockDiskEntry.  We achieve that by
358*6777b538SAndroid Build Coastguard Worker // leveraging the fact that this class is reference counted.
CallbackLater(base::OnceClosure callback)359*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::CallbackLater(base::OnceClosure callback) {
360*6777b538SAndroid Build Coastguard Worker   if (ignore_callbacks_) {
361*6777b538SAndroid Build Coastguard Worker     return StoreAndDeliverCallbacks(true, this, std::move(callback));
362*6777b538SAndroid Build Coastguard Worker   }
363*6777b538SAndroid Build Coastguard Worker   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
364*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
365*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&MockDiskEntry::RunCallback, this, std::move(callback)));
366*6777b538SAndroid Build Coastguard Worker }
367*6777b538SAndroid Build Coastguard Worker 
CallbackLater(CompletionOnceCallback callback,int result)368*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::CallbackLater(CompletionOnceCallback callback, int result) {
369*6777b538SAndroid Build Coastguard Worker   CallbackLater(base::BindOnce(std::move(callback), result));
370*6777b538SAndroid Build Coastguard Worker }
371*6777b538SAndroid Build Coastguard Worker 
RunCallback(base::OnceClosure callback)372*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::RunCallback(base::OnceClosure callback) {
373*6777b538SAndroid Build Coastguard Worker   if (busy_) {
374*6777b538SAndroid Build Coastguard Worker     // This is kind of hacky, but controlling the behavior of just this entry
375*6777b538SAndroid Build Coastguard Worker     // from a test is sort of complicated.  What we really want to do is
376*6777b538SAndroid Build Coastguard Worker     // delay the delivery of a sparse IO operation a little more so that the
377*6777b538SAndroid Build Coastguard Worker     // request start operation (async) will finish without seeing the end of
378*6777b538SAndroid Build Coastguard Worker     // this operation (already posted to the message loop)... and without
379*6777b538SAndroid Build Coastguard Worker     // just delaying for n mS (which may cause trouble with slow bots).  So
380*6777b538SAndroid Build Coastguard Worker     // we re-post this operation (all async sparse IO operations will take two
381*6777b538SAndroid Build Coastguard Worker     // trips through the message loop instead of one).
382*6777b538SAndroid Build Coastguard Worker     if (!delayed_) {
383*6777b538SAndroid Build Coastguard Worker       delayed_ = true;
384*6777b538SAndroid Build Coastguard Worker       return CallbackLater(std::move(callback));
385*6777b538SAndroid Build Coastguard Worker     }
386*6777b538SAndroid Build Coastguard Worker   }
387*6777b538SAndroid Build Coastguard Worker   busy_ = false;
388*6777b538SAndroid Build Coastguard Worker   std::move(callback).Run();
389*6777b538SAndroid Build Coastguard Worker }
390*6777b538SAndroid Build Coastguard Worker 
391*6777b538SAndroid Build Coastguard Worker // When |store| is true, stores the callback to be delivered later; otherwise
392*6777b538SAndroid Build Coastguard Worker // delivers any callback previously stored.
393*6777b538SAndroid Build Coastguard Worker // Static.
StoreAndDeliverCallbacks(bool store,MockDiskEntry * entry,base::OnceClosure callback)394*6777b538SAndroid Build Coastguard Worker void MockDiskEntry::StoreAndDeliverCallbacks(bool store,
395*6777b538SAndroid Build Coastguard Worker                                              MockDiskEntry* entry,
396*6777b538SAndroid Build Coastguard Worker                                              base::OnceClosure callback) {
397*6777b538SAndroid Build Coastguard Worker   static std::vector<CallbackInfo> callback_list;
398*6777b538SAndroid Build Coastguard Worker   if (store) {
399*6777b538SAndroid Build Coastguard Worker     CallbackInfo c = {entry, std::move(callback)};
400*6777b538SAndroid Build Coastguard Worker     callback_list.push_back(std::move(c));
401*6777b538SAndroid Build Coastguard Worker   } else {
402*6777b538SAndroid Build Coastguard Worker     for (auto& callback_info : callback_list) {
403*6777b538SAndroid Build Coastguard Worker       callback_info.entry->CallbackLater(std::move(callback_info.callback));
404*6777b538SAndroid Build Coastguard Worker     }
405*6777b538SAndroid Build Coastguard Worker     callback_list.clear();
406*6777b538SAndroid Build Coastguard Worker   }
407*6777b538SAndroid Build Coastguard Worker }
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker // Statics.
410*6777b538SAndroid Build Coastguard Worker bool MockDiskEntry::ignore_callbacks_ = false;
411*6777b538SAndroid Build Coastguard Worker 
412*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
413*6777b538SAndroid Build Coastguard Worker 
MockDiskCache()414*6777b538SAndroid Build Coastguard Worker MockDiskCache::MockDiskCache()
415*6777b538SAndroid Build Coastguard Worker     : Backend(DISK_CACHE), max_file_size_(std::numeric_limits<int>::max()) {}
416*6777b538SAndroid Build Coastguard Worker 
~MockDiskCache()417*6777b538SAndroid Build Coastguard Worker MockDiskCache::~MockDiskCache() {
418*6777b538SAndroid Build Coastguard Worker   ReleaseAll();
419*6777b538SAndroid Build Coastguard Worker }
420*6777b538SAndroid Build Coastguard Worker 
GetEntryCount() const421*6777b538SAndroid Build Coastguard Worker int32_t MockDiskCache::GetEntryCount() const {
422*6777b538SAndroid Build Coastguard Worker   return static_cast<int32_t>(entries_.size());
423*6777b538SAndroid Build Coastguard Worker }
424*6777b538SAndroid Build Coastguard Worker 
OpenOrCreateEntry(const std::string & key,net::RequestPriority request_priority,EntryResultCallback callback)425*6777b538SAndroid Build Coastguard Worker disk_cache::EntryResult MockDiskCache::OpenOrCreateEntry(
426*6777b538SAndroid Build Coastguard Worker     const std::string& key,
427*6777b538SAndroid Build Coastguard Worker     net::RequestPriority request_priority,
428*6777b538SAndroid Build Coastguard Worker     EntryResultCallback callback) {
429*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
430*6777b538SAndroid Build Coastguard Worker 
431*6777b538SAndroid Build Coastguard Worker   if (force_fail_callback_later_) {
432*6777b538SAndroid Build Coastguard Worker     CallbackLater(base::BindOnce(
433*6777b538SAndroid Build Coastguard Worker         std::move(callback),
434*6777b538SAndroid Build Coastguard Worker         EntryResult::MakeError(ERR_CACHE_OPEN_OR_CREATE_FAILURE)));
435*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_IO_PENDING);
436*6777b538SAndroid Build Coastguard Worker   }
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker   if (fail_requests_) {
439*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_CACHE_OPEN_OR_CREATE_FAILURE);
440*6777b538SAndroid Build Coastguard Worker   }
441*6777b538SAndroid Build Coastguard Worker 
442*6777b538SAndroid Build Coastguard Worker   EntryResult result;
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker   // First try opening the entry.
445*6777b538SAndroid Build Coastguard Worker   auto split_callback = base::SplitOnceCallback(std::move(callback));
446*6777b538SAndroid Build Coastguard Worker   result = OpenEntry(key, request_priority, std::move(split_callback.first));
447*6777b538SAndroid Build Coastguard Worker   if (result.net_error() == OK || result.net_error() == ERR_IO_PENDING) {
448*6777b538SAndroid Build Coastguard Worker     return result;
449*6777b538SAndroid Build Coastguard Worker   }
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker   // Unable to open, try creating the entry.
452*6777b538SAndroid Build Coastguard Worker   result = CreateEntry(key, request_priority, std::move(split_callback.second));
453*6777b538SAndroid Build Coastguard Worker   if (result.net_error() == OK || result.net_error() == ERR_IO_PENDING) {
454*6777b538SAndroid Build Coastguard Worker     return result;
455*6777b538SAndroid Build Coastguard Worker   }
456*6777b538SAndroid Build Coastguard Worker 
457*6777b538SAndroid Build Coastguard Worker   return EntryResult::MakeError(ERR_CACHE_OPEN_OR_CREATE_FAILURE);
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
OpenEntry(const std::string & key,net::RequestPriority request_priority,EntryResultCallback callback)460*6777b538SAndroid Build Coastguard Worker disk_cache::EntryResult MockDiskCache::OpenEntry(
461*6777b538SAndroid Build Coastguard Worker     const std::string& key,
462*6777b538SAndroid Build Coastguard Worker     net::RequestPriority request_priority,
463*6777b538SAndroid Build Coastguard Worker     EntryResultCallback callback) {
464*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
465*6777b538SAndroid Build Coastguard Worker   if (force_fail_callback_later_) {
466*6777b538SAndroid Build Coastguard Worker     CallbackLater(base::BindOnce(
467*6777b538SAndroid Build Coastguard Worker         std::move(callback), EntryResult::MakeError(ERR_CACHE_OPEN_FAILURE)));
468*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_IO_PENDING);
469*6777b538SAndroid Build Coastguard Worker   }
470*6777b538SAndroid Build Coastguard Worker 
471*6777b538SAndroid Build Coastguard Worker   if (fail_requests_) {
472*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_CACHE_OPEN_FAILURE);
473*6777b538SAndroid Build Coastguard Worker   }
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
476*6777b538SAndroid Build Coastguard Worker   if (it == entries_.end()) {
477*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_CACHE_OPEN_FAILURE);
478*6777b538SAndroid Build Coastguard Worker   }
479*6777b538SAndroid Build Coastguard Worker 
480*6777b538SAndroid Build Coastguard Worker   if (it->second->is_doomed()) {
481*6777b538SAndroid Build Coastguard Worker     it->second->Release();
482*6777b538SAndroid Build Coastguard Worker     entries_.erase(it);
483*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_CACHE_OPEN_FAILURE);
484*6777b538SAndroid Build Coastguard Worker   }
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker   open_count_++;
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker   MockDiskEntry* entry = it->second;
489*6777b538SAndroid Build Coastguard Worker   entry->AddRef();
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   if (soft_failures_ || soft_failures_one_instance_) {
492*6777b538SAndroid Build Coastguard Worker     entry->set_fail_requests(soft_failures_ | soft_failures_one_instance_);
493*6777b538SAndroid Build Coastguard Worker     soft_failures_one_instance_ = 0;
494*6777b538SAndroid Build Coastguard Worker   }
495*6777b538SAndroid Build Coastguard Worker 
496*6777b538SAndroid Build Coastguard Worker   entry->set_max_file_size(max_file_size_);
497*6777b538SAndroid Build Coastguard Worker 
498*6777b538SAndroid Build Coastguard Worker   EntryResult result = EntryResult::MakeOpened(entry);
499*6777b538SAndroid Build Coastguard Worker   if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START) {
500*6777b538SAndroid Build Coastguard Worker     return result;
501*6777b538SAndroid Build Coastguard Worker   }
502*6777b538SAndroid Build Coastguard Worker 
503*6777b538SAndroid Build Coastguard Worker   CallbackLater(base::BindOnce(std::move(callback), std::move(result)));
504*6777b538SAndroid Build Coastguard Worker   return EntryResult::MakeError(ERR_IO_PENDING);
505*6777b538SAndroid Build Coastguard Worker }
506*6777b538SAndroid Build Coastguard Worker 
CreateEntry(const std::string & key,net::RequestPriority request_priority,EntryResultCallback callback)507*6777b538SAndroid Build Coastguard Worker disk_cache::EntryResult MockDiskCache::CreateEntry(
508*6777b538SAndroid Build Coastguard Worker     const std::string& key,
509*6777b538SAndroid Build Coastguard Worker     net::RequestPriority request_priority,
510*6777b538SAndroid Build Coastguard Worker     EntryResultCallback callback) {
511*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
512*6777b538SAndroid Build Coastguard Worker   if (force_fail_callback_later_) {
513*6777b538SAndroid Build Coastguard Worker     CallbackLater(base::BindOnce(
514*6777b538SAndroid Build Coastguard Worker         std::move(callback), EntryResult::MakeError(ERR_CACHE_CREATE_FAILURE)));
515*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_IO_PENDING);
516*6777b538SAndroid Build Coastguard Worker   }
517*6777b538SAndroid Build Coastguard Worker 
518*6777b538SAndroid Build Coastguard Worker   if (fail_requests_) {
519*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_CACHE_CREATE_FAILURE);
520*6777b538SAndroid Build Coastguard Worker   }
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
523*6777b538SAndroid Build Coastguard Worker   if (it != entries_.end()) {
524*6777b538SAndroid Build Coastguard Worker     if (!it->second->is_doomed()) {
525*6777b538SAndroid Build Coastguard Worker       if (double_create_check_) {
526*6777b538SAndroid Build Coastguard Worker         NOTREACHED();
527*6777b538SAndroid Build Coastguard Worker       } else {
528*6777b538SAndroid Build Coastguard Worker         return EntryResult::MakeError(ERR_CACHE_CREATE_FAILURE);
529*6777b538SAndroid Build Coastguard Worker       }
530*6777b538SAndroid Build Coastguard Worker     }
531*6777b538SAndroid Build Coastguard Worker     it->second->Release();
532*6777b538SAndroid Build Coastguard Worker     entries_.erase(it);
533*6777b538SAndroid Build Coastguard Worker   }
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker   create_count_++;
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   MockDiskEntry* new_entry = new MockDiskEntry(key);
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker   new_entry->AddRef();
540*6777b538SAndroid Build Coastguard Worker   entries_[key] = new_entry;
541*6777b538SAndroid Build Coastguard Worker 
542*6777b538SAndroid Build Coastguard Worker   new_entry->AddRef();
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   if (soft_failures_ || soft_failures_one_instance_) {
545*6777b538SAndroid Build Coastguard Worker     new_entry->set_fail_requests(soft_failures_ | soft_failures_one_instance_);
546*6777b538SAndroid Build Coastguard Worker     soft_failures_one_instance_ = 0;
547*6777b538SAndroid Build Coastguard Worker   }
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker   if (fail_sparse_requests_) {
550*6777b538SAndroid Build Coastguard Worker     new_entry->set_fail_sparse_requests();
551*6777b538SAndroid Build Coastguard Worker   }
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker   new_entry->set_max_file_size(max_file_size_);
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   EntryResult result = EntryResult::MakeCreated(new_entry);
556*6777b538SAndroid Build Coastguard Worker   if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START) {
557*6777b538SAndroid Build Coastguard Worker     return result;
558*6777b538SAndroid Build Coastguard Worker   }
559*6777b538SAndroid Build Coastguard Worker 
560*6777b538SAndroid Build Coastguard Worker   // Pause and resume.
561*6777b538SAndroid Build Coastguard Worker   if (defer_op_ == MockDiskEntry::DEFER_CREATE) {
562*6777b538SAndroid Build Coastguard Worker     defer_op_ = MockDiskEntry::DEFER_NONE;
563*6777b538SAndroid Build Coastguard Worker     resume_callback_ = base::BindOnce(std::move(callback), std::move(result));
564*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_IO_PENDING);
565*6777b538SAndroid Build Coastguard Worker   }
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker   CallbackLater(base::BindOnce(std::move(callback), std::move(result)));
568*6777b538SAndroid Build Coastguard Worker   return EntryResult::MakeError(ERR_IO_PENDING);
569*6777b538SAndroid Build Coastguard Worker }
570*6777b538SAndroid Build Coastguard Worker 
DoomEntry(const std::string & key,net::RequestPriority request_priority,CompletionOnceCallback callback)571*6777b538SAndroid Build Coastguard Worker net::Error MockDiskCache::DoomEntry(const std::string& key,
572*6777b538SAndroid Build Coastguard Worker                                     net::RequestPriority request_priority,
573*6777b538SAndroid Build Coastguard Worker                                     CompletionOnceCallback callback) {
574*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
575*6777b538SAndroid Build Coastguard Worker   if (force_fail_callback_later_) {
576*6777b538SAndroid Build Coastguard Worker     CallbackLater(base::BindOnce(std::move(callback), ERR_CACHE_DOOM_FAILURE));
577*6777b538SAndroid Build Coastguard Worker     return ERR_IO_PENDING;
578*6777b538SAndroid Build Coastguard Worker   }
579*6777b538SAndroid Build Coastguard Worker 
580*6777b538SAndroid Build Coastguard Worker   if (fail_requests_) {
581*6777b538SAndroid Build Coastguard Worker     return ERR_CACHE_DOOM_FAILURE;
582*6777b538SAndroid Build Coastguard Worker   }
583*6777b538SAndroid Build Coastguard Worker 
584*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
585*6777b538SAndroid Build Coastguard Worker   if (it != entries_.end()) {
586*6777b538SAndroid Build Coastguard Worker     it->second->Release();
587*6777b538SAndroid Build Coastguard Worker     entries_.erase(it);
588*6777b538SAndroid Build Coastguard Worker     doomed_count_++;
589*6777b538SAndroid Build Coastguard Worker   }
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker   if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START) {
592*6777b538SAndroid Build Coastguard Worker     return OK;
593*6777b538SAndroid Build Coastguard Worker   }
594*6777b538SAndroid Build Coastguard Worker 
595*6777b538SAndroid Build Coastguard Worker   CallbackLater(base::BindOnce(std::move(callback), OK));
596*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
597*6777b538SAndroid Build Coastguard Worker }
598*6777b538SAndroid Build Coastguard Worker 
DoomAllEntries(CompletionOnceCallback callback)599*6777b538SAndroid Build Coastguard Worker net::Error MockDiskCache::DoomAllEntries(CompletionOnceCallback callback) {
600*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
601*6777b538SAndroid Build Coastguard Worker }
602*6777b538SAndroid Build Coastguard Worker 
DoomEntriesBetween(const base::Time initial_time,const base::Time end_time,CompletionOnceCallback callback)603*6777b538SAndroid Build Coastguard Worker net::Error MockDiskCache::DoomEntriesBetween(const base::Time initial_time,
604*6777b538SAndroid Build Coastguard Worker                                              const base::Time end_time,
605*6777b538SAndroid Build Coastguard Worker                                              CompletionOnceCallback callback) {
606*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
607*6777b538SAndroid Build Coastguard Worker }
608*6777b538SAndroid Build Coastguard Worker 
DoomEntriesSince(const base::Time initial_time,CompletionOnceCallback callback)609*6777b538SAndroid Build Coastguard Worker net::Error MockDiskCache::DoomEntriesSince(const base::Time initial_time,
610*6777b538SAndroid Build Coastguard Worker                                            CompletionOnceCallback callback) {
611*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
612*6777b538SAndroid Build Coastguard Worker }
613*6777b538SAndroid Build Coastguard Worker 
CalculateSizeOfAllEntries(Int64CompletionOnceCallback callback)614*6777b538SAndroid Build Coastguard Worker int64_t MockDiskCache::CalculateSizeOfAllEntries(
615*6777b538SAndroid Build Coastguard Worker     Int64CompletionOnceCallback callback) {
616*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
617*6777b538SAndroid Build Coastguard Worker }
618*6777b538SAndroid Build Coastguard Worker 
619*6777b538SAndroid Build Coastguard Worker class MockDiskCache::NotImplementedIterator : public Iterator {
620*6777b538SAndroid Build Coastguard Worker  public:
OpenNextEntry(EntryResultCallback callback)621*6777b538SAndroid Build Coastguard Worker   EntryResult OpenNextEntry(EntryResultCallback callback) override {
622*6777b538SAndroid Build Coastguard Worker     return EntryResult::MakeError(ERR_NOT_IMPLEMENTED);
623*6777b538SAndroid Build Coastguard Worker   }
624*6777b538SAndroid Build Coastguard Worker };
625*6777b538SAndroid Build Coastguard Worker 
CreateIterator()626*6777b538SAndroid Build Coastguard Worker std::unique_ptr<disk_cache::Backend::Iterator> MockDiskCache::CreateIterator() {
627*6777b538SAndroid Build Coastguard Worker   return std::make_unique<NotImplementedIterator>();
628*6777b538SAndroid Build Coastguard Worker }
629*6777b538SAndroid Build Coastguard Worker 
GetStats(base::StringPairs * stats)630*6777b538SAndroid Build Coastguard Worker void MockDiskCache::GetStats(base::StringPairs* stats) {}
631*6777b538SAndroid Build Coastguard Worker 
OnExternalCacheHit(const std::string & key)632*6777b538SAndroid Build Coastguard Worker void MockDiskCache::OnExternalCacheHit(const std::string& key) {
633*6777b538SAndroid Build Coastguard Worker   external_cache_hits_.push_back(key);
634*6777b538SAndroid Build Coastguard Worker }
635*6777b538SAndroid Build Coastguard Worker 
GetEntryInMemoryData(const std::string & key)636*6777b538SAndroid Build Coastguard Worker uint8_t MockDiskCache::GetEntryInMemoryData(const std::string& key) {
637*6777b538SAndroid Build Coastguard Worker   if (!support_in_memory_entry_data_) {
638*6777b538SAndroid Build Coastguard Worker     return 0;
639*6777b538SAndroid Build Coastguard Worker   }
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
642*6777b538SAndroid Build Coastguard Worker   if (it != entries_.end()) {
643*6777b538SAndroid Build Coastguard Worker     return it->second->in_memory_data();
644*6777b538SAndroid Build Coastguard Worker   }
645*6777b538SAndroid Build Coastguard Worker   return 0;
646*6777b538SAndroid Build Coastguard Worker }
647*6777b538SAndroid Build Coastguard Worker 
SetEntryInMemoryData(const std::string & key,uint8_t data)648*6777b538SAndroid Build Coastguard Worker void MockDiskCache::SetEntryInMemoryData(const std::string& key, uint8_t data) {
649*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
650*6777b538SAndroid Build Coastguard Worker   if (it != entries_.end()) {
651*6777b538SAndroid Build Coastguard Worker     it->second->set_in_memory_data(data);
652*6777b538SAndroid Build Coastguard Worker   }
653*6777b538SAndroid Build Coastguard Worker }
654*6777b538SAndroid Build Coastguard Worker 
MaxFileSize() const655*6777b538SAndroid Build Coastguard Worker int64_t MockDiskCache::MaxFileSize() const {
656*6777b538SAndroid Build Coastguard Worker   return max_file_size_;
657*6777b538SAndroid Build Coastguard Worker }
658*6777b538SAndroid Build Coastguard Worker 
ReleaseAll()659*6777b538SAndroid Build Coastguard Worker void MockDiskCache::ReleaseAll() {
660*6777b538SAndroid Build Coastguard Worker   for (auto entry : entries_) {
661*6777b538SAndroid Build Coastguard Worker     entry.second->Release();
662*6777b538SAndroid Build Coastguard Worker   }
663*6777b538SAndroid Build Coastguard Worker   entries_.clear();
664*6777b538SAndroid Build Coastguard Worker }
665*6777b538SAndroid Build Coastguard Worker 
CallbackLater(base::OnceClosure callback)666*6777b538SAndroid Build Coastguard Worker void MockDiskCache::CallbackLater(base::OnceClosure callback) {
667*6777b538SAndroid Build Coastguard Worker   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
668*6777b538SAndroid Build Coastguard Worker       FROM_HERE, std::move(callback));
669*6777b538SAndroid Build Coastguard Worker }
670*6777b538SAndroid Build Coastguard Worker 
IsDiskEntryDoomed(const std::string & key)671*6777b538SAndroid Build Coastguard Worker bool MockDiskCache::IsDiskEntryDoomed(const std::string& key) {
672*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
673*6777b538SAndroid Build Coastguard Worker   if (it != entries_.end()) {
674*6777b538SAndroid Build Coastguard Worker     return it->second->is_doomed();
675*6777b538SAndroid Build Coastguard Worker   }
676*6777b538SAndroid Build Coastguard Worker 
677*6777b538SAndroid Build Coastguard Worker   return false;
678*6777b538SAndroid Build Coastguard Worker }
679*6777b538SAndroid Build Coastguard Worker 
ResumeCacheOperation()680*6777b538SAndroid Build Coastguard Worker void MockDiskCache::ResumeCacheOperation() {
681*6777b538SAndroid Build Coastguard Worker   DCHECK(!resume_callback_.is_null());
682*6777b538SAndroid Build Coastguard Worker   CallbackLater(std::move(resume_callback_));
683*6777b538SAndroid Build Coastguard Worker }
684*6777b538SAndroid Build Coastguard Worker 
GetDiskEntryRef(const std::string & key)685*6777b538SAndroid Build Coastguard Worker scoped_refptr<MockDiskEntry> MockDiskCache::GetDiskEntryRef(
686*6777b538SAndroid Build Coastguard Worker     const std::string& key) {
687*6777b538SAndroid Build Coastguard Worker   auto it = entries_.find(key);
688*6777b538SAndroid Build Coastguard Worker   if (it == entries_.end()) {
689*6777b538SAndroid Build Coastguard Worker     return nullptr;
690*6777b538SAndroid Build Coastguard Worker   }
691*6777b538SAndroid Build Coastguard Worker   return it->second;
692*6777b538SAndroid Build Coastguard Worker }
693*6777b538SAndroid Build Coastguard Worker 
GetExternalCacheHits() const694*6777b538SAndroid Build Coastguard Worker const std::vector<std::string>& MockDiskCache::GetExternalCacheHits() const {
695*6777b538SAndroid Build Coastguard Worker   return external_cache_hits_;
696*6777b538SAndroid Build Coastguard Worker }
697*6777b538SAndroid Build Coastguard Worker 
698*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
699*6777b538SAndroid Build Coastguard Worker 
CreateBackend(NetLog * net_log,disk_cache::BackendResultCallback callback)700*6777b538SAndroid Build Coastguard Worker disk_cache::BackendResult MockBackendFactory::CreateBackend(
701*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
702*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResultCallback callback) {
703*6777b538SAndroid Build Coastguard Worker   return disk_cache::BackendResult::Make(std::make_unique<MockDiskCache>());
704*6777b538SAndroid Build Coastguard Worker }
705*6777b538SAndroid Build Coastguard Worker 
706*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
707*6777b538SAndroid Build Coastguard Worker 
MockHttpCache()708*6777b538SAndroid Build Coastguard Worker MockHttpCache::MockHttpCache()
709*6777b538SAndroid Build Coastguard Worker     : MockHttpCache(std::make_unique<MockBackendFactory>()) {}
710*6777b538SAndroid Build Coastguard Worker 
MockHttpCache(std::unique_ptr<HttpCache::BackendFactory> disk_cache_factory)711*6777b538SAndroid Build Coastguard Worker MockHttpCache::MockHttpCache(
712*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<HttpCache::BackendFactory> disk_cache_factory)
713*6777b538SAndroid Build Coastguard Worker     : http_cache_(std::make_unique<MockNetworkLayer>(),
714*6777b538SAndroid Build Coastguard Worker                   std::move(disk_cache_factory)) {}
715*6777b538SAndroid Build Coastguard Worker 
backend()716*6777b538SAndroid Build Coastguard Worker disk_cache::Backend* MockHttpCache::backend() {
717*6777b538SAndroid Build Coastguard Worker   TestCompletionCallback cb;
718*6777b538SAndroid Build Coastguard Worker   disk_cache::Backend* backend;
719*6777b538SAndroid Build Coastguard Worker   int rv = http_cache_.GetBackend(&backend, cb.callback());
720*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(rv);
721*6777b538SAndroid Build Coastguard Worker   return (rv == OK) ? backend : nullptr;
722*6777b538SAndroid Build Coastguard Worker }
723*6777b538SAndroid Build Coastguard Worker 
disk_cache()724*6777b538SAndroid Build Coastguard Worker MockDiskCache* MockHttpCache::disk_cache() {
725*6777b538SAndroid Build Coastguard Worker   return static_cast<MockDiskCache*>(backend());
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker 
CreateTransaction(std::unique_ptr<HttpTransaction> * trans)728*6777b538SAndroid Build Coastguard Worker int MockHttpCache::CreateTransaction(std::unique_ptr<HttpTransaction>* trans) {
729*6777b538SAndroid Build Coastguard Worker   return http_cache_.CreateTransaction(DEFAULT_PRIORITY, trans);
730*6777b538SAndroid Build Coastguard Worker }
731*6777b538SAndroid Build Coastguard Worker 
SimulateCacheLockTimeout()732*6777b538SAndroid Build Coastguard Worker void MockHttpCache::SimulateCacheLockTimeout() {
733*6777b538SAndroid Build Coastguard Worker   http_cache_.SimulateCacheLockTimeoutForTesting();
734*6777b538SAndroid Build Coastguard Worker }
735*6777b538SAndroid Build Coastguard Worker 
SimulateCacheLockTimeoutAfterHeaders()736*6777b538SAndroid Build Coastguard Worker void MockHttpCache::SimulateCacheLockTimeoutAfterHeaders() {
737*6777b538SAndroid Build Coastguard Worker   http_cache_.SimulateCacheLockTimeoutAfterHeadersForTesting();
738*6777b538SAndroid Build Coastguard Worker }
739*6777b538SAndroid Build Coastguard Worker 
FailConditionalizations()740*6777b538SAndroid Build Coastguard Worker void MockHttpCache::FailConditionalizations() {
741*6777b538SAndroid Build Coastguard Worker   http_cache_.FailConditionalizationForTest();
742*6777b538SAndroid Build Coastguard Worker }
743*6777b538SAndroid Build Coastguard Worker 
ReadResponseInfo(disk_cache::Entry * disk_entry,HttpResponseInfo * response_info,bool * response_truncated)744*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::ReadResponseInfo(disk_cache::Entry* disk_entry,
745*6777b538SAndroid Build Coastguard Worker                                      HttpResponseInfo* response_info,
746*6777b538SAndroid Build Coastguard Worker                                      bool* response_truncated) {
747*6777b538SAndroid Build Coastguard Worker   int size = disk_entry->GetDataSize(0);
748*6777b538SAndroid Build Coastguard Worker 
749*6777b538SAndroid Build Coastguard Worker   TestCompletionCallback cb;
750*6777b538SAndroid Build Coastguard Worker   auto buffer = base::MakeRefCounted<IOBufferWithSize>(size);
751*6777b538SAndroid Build Coastguard Worker   int rv = disk_entry->ReadData(0, 0, buffer.get(), size, cb.callback());
752*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(rv);
753*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(size, rv);
754*6777b538SAndroid Build Coastguard Worker 
755*6777b538SAndroid Build Coastguard Worker   return HttpCache::ParseResponseInfo(buffer->data(), size, response_info,
756*6777b538SAndroid Build Coastguard Worker                                       response_truncated);
757*6777b538SAndroid Build Coastguard Worker }
758*6777b538SAndroid Build Coastguard Worker 
WriteResponseInfo(disk_cache::Entry * disk_entry,const HttpResponseInfo * response_info,bool skip_transient_headers,bool response_truncated)759*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::WriteResponseInfo(disk_cache::Entry* disk_entry,
760*6777b538SAndroid Build Coastguard Worker                                       const HttpResponseInfo* response_info,
761*6777b538SAndroid Build Coastguard Worker                                       bool skip_transient_headers,
762*6777b538SAndroid Build Coastguard Worker                                       bool response_truncated) {
763*6777b538SAndroid Build Coastguard Worker   base::Pickle pickle;
764*6777b538SAndroid Build Coastguard Worker   response_info->Persist(&pickle, skip_transient_headers, response_truncated);
765*6777b538SAndroid Build Coastguard Worker 
766*6777b538SAndroid Build Coastguard Worker   TestCompletionCallback cb;
767*6777b538SAndroid Build Coastguard Worker   int len = static_cast<int>(pickle.size());
768*6777b538SAndroid Build Coastguard Worker   auto data = base::MakeRefCounted<WrappedIOBuffer>(pickle);
769*6777b538SAndroid Build Coastguard Worker 
770*6777b538SAndroid Build Coastguard Worker   int rv = disk_entry->WriteData(0, 0, data.get(), len, cb.callback(), true);
771*6777b538SAndroid Build Coastguard Worker   rv = cb.GetResult(rv);
772*6777b538SAndroid Build Coastguard Worker   return (rv == len);
773*6777b538SAndroid Build Coastguard Worker }
774*6777b538SAndroid Build Coastguard Worker 
OpenBackendEntry(const std::string & key,disk_cache::Entry ** entry)775*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::OpenBackendEntry(const std::string& key,
776*6777b538SAndroid Build Coastguard Worker                                      disk_cache::Entry** entry) {
777*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb;
778*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result =
779*6777b538SAndroid Build Coastguard Worker       backend()->OpenEntry(key, net::HIGHEST, cb.callback());
780*6777b538SAndroid Build Coastguard Worker   result = cb.GetResult(std::move(result));
781*6777b538SAndroid Build Coastguard Worker   if (result.net_error() == OK) {
782*6777b538SAndroid Build Coastguard Worker     *entry = result.ReleaseEntry();
783*6777b538SAndroid Build Coastguard Worker     return true;
784*6777b538SAndroid Build Coastguard Worker   } else {
785*6777b538SAndroid Build Coastguard Worker     return false;
786*6777b538SAndroid Build Coastguard Worker   }
787*6777b538SAndroid Build Coastguard Worker }
788*6777b538SAndroid Build Coastguard Worker 
CreateBackendEntry(const std::string & key,disk_cache::Entry ** entry,NetLog * net_log)789*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::CreateBackendEntry(const std::string& key,
790*6777b538SAndroid Build Coastguard Worker                                        disk_cache::Entry** entry,
791*6777b538SAndroid Build Coastguard Worker                                        NetLog* net_log) {
792*6777b538SAndroid Build Coastguard Worker   TestEntryResultCompletionCallback cb;
793*6777b538SAndroid Build Coastguard Worker   disk_cache::EntryResult result =
794*6777b538SAndroid Build Coastguard Worker       backend()->CreateEntry(key, net::HIGHEST, cb.callback());
795*6777b538SAndroid Build Coastguard Worker   result = cb.GetResult(std::move(result));
796*6777b538SAndroid Build Coastguard Worker   if (result.net_error() == OK) {
797*6777b538SAndroid Build Coastguard Worker     *entry = result.ReleaseEntry();
798*6777b538SAndroid Build Coastguard Worker     return true;
799*6777b538SAndroid Build Coastguard Worker   } else {
800*6777b538SAndroid Build Coastguard Worker     return false;
801*6777b538SAndroid Build Coastguard Worker   }
802*6777b538SAndroid Build Coastguard Worker }
803*6777b538SAndroid Build Coastguard Worker 
804*6777b538SAndroid Build Coastguard Worker // Static.
GetTestMode(int test_mode)805*6777b538SAndroid Build Coastguard Worker int MockHttpCache::GetTestMode(int test_mode) {
806*6777b538SAndroid Build Coastguard Worker   if (!g_test_mode) {
807*6777b538SAndroid Build Coastguard Worker     return test_mode;
808*6777b538SAndroid Build Coastguard Worker   }
809*6777b538SAndroid Build Coastguard Worker 
810*6777b538SAndroid Build Coastguard Worker   return g_test_mode;
811*6777b538SAndroid Build Coastguard Worker }
812*6777b538SAndroid Build Coastguard Worker 
813*6777b538SAndroid Build Coastguard Worker // Static.
SetTestMode(int test_mode)814*6777b538SAndroid Build Coastguard Worker void MockHttpCache::SetTestMode(int test_mode) {
815*6777b538SAndroid Build Coastguard Worker   g_test_mode = test_mode;
816*6777b538SAndroid Build Coastguard Worker }
817*6777b538SAndroid Build Coastguard Worker 
IsWriterPresent(const std::string & key)818*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::IsWriterPresent(const std::string& key) {
819*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
820*6777b538SAndroid Build Coastguard Worker   return entry && entry->HasWriters() && !entry->writers()->IsEmpty();
821*6777b538SAndroid Build Coastguard Worker }
822*6777b538SAndroid Build Coastguard Worker 
IsHeadersTransactionPresent(const std::string & key)823*6777b538SAndroid Build Coastguard Worker bool MockHttpCache::IsHeadersTransactionPresent(const std::string& key) {
824*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
825*6777b538SAndroid Build Coastguard Worker   return entry && entry->headers_transaction();
826*6777b538SAndroid Build Coastguard Worker }
827*6777b538SAndroid Build Coastguard Worker 
GetCountReaders(const std::string & key)828*6777b538SAndroid Build Coastguard Worker int MockHttpCache::GetCountReaders(const std::string& key) {
829*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
830*6777b538SAndroid Build Coastguard Worker   return entry ? entry->readers().size() : 0;
831*6777b538SAndroid Build Coastguard Worker }
832*6777b538SAndroid Build Coastguard Worker 
GetCountAddToEntryQueue(const std::string & key)833*6777b538SAndroid Build Coastguard Worker int MockHttpCache::GetCountAddToEntryQueue(const std::string& key) {
834*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
835*6777b538SAndroid Build Coastguard Worker   return entry ? entry->add_to_entry_queue().size() : 0;
836*6777b538SAndroid Build Coastguard Worker }
837*6777b538SAndroid Build Coastguard Worker 
GetCountDoneHeadersQueue(const std::string & key)838*6777b538SAndroid Build Coastguard Worker int MockHttpCache::GetCountDoneHeadersQueue(const std::string& key) {
839*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
840*6777b538SAndroid Build Coastguard Worker   return entry ? entry->done_headers_queue().size() : 0;
841*6777b538SAndroid Build Coastguard Worker }
842*6777b538SAndroid Build Coastguard Worker 
GetCountWriterTransactions(const std::string & key)843*6777b538SAndroid Build Coastguard Worker int MockHttpCache::GetCountWriterTransactions(const std::string& key) {
844*6777b538SAndroid Build Coastguard Worker   auto entry = http_cache_.GetActiveEntry(key);
845*6777b538SAndroid Build Coastguard Worker   return entry && entry->writers() ? entry->writers()->GetTransactionsCount()
846*6777b538SAndroid Build Coastguard Worker                                    : 0;
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker 
GetWeakPtr()849*6777b538SAndroid Build Coastguard Worker base::WeakPtr<HttpCache> MockHttpCache::GetWeakPtr() {
850*6777b538SAndroid Build Coastguard Worker   return http_cache_.GetWeakPtr();
851*6777b538SAndroid Build Coastguard Worker }
852*6777b538SAndroid Build Coastguard Worker 
853*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
854*6777b538SAndroid Build Coastguard Worker 
CreateEntry(const std::string & key,net::RequestPriority request_priority,EntryResultCallback callback)855*6777b538SAndroid Build Coastguard Worker disk_cache::EntryResult MockDiskCacheNoCB::CreateEntry(
856*6777b538SAndroid Build Coastguard Worker     const std::string& key,
857*6777b538SAndroid Build Coastguard Worker     net::RequestPriority request_priority,
858*6777b538SAndroid Build Coastguard Worker     EntryResultCallback callback) {
859*6777b538SAndroid Build Coastguard Worker   return EntryResult::MakeError(ERR_IO_PENDING);
860*6777b538SAndroid Build Coastguard Worker }
861*6777b538SAndroid Build Coastguard Worker 
862*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
863*6777b538SAndroid Build Coastguard Worker 
CreateBackend(NetLog * net_log,disk_cache::BackendResultCallback callback)864*6777b538SAndroid Build Coastguard Worker disk_cache::BackendResult MockBackendNoCbFactory::CreateBackend(
865*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
866*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResultCallback callback) {
867*6777b538SAndroid Build Coastguard Worker   return disk_cache::BackendResult::Make(std::make_unique<MockDiskCacheNoCB>());
868*6777b538SAndroid Build Coastguard Worker }
869*6777b538SAndroid Build Coastguard Worker 
870*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
871*6777b538SAndroid Build Coastguard Worker 
872*6777b538SAndroid Build Coastguard Worker MockBlockingBackendFactory::MockBlockingBackendFactory() = default;
873*6777b538SAndroid Build Coastguard Worker MockBlockingBackendFactory::~MockBlockingBackendFactory() = default;
874*6777b538SAndroid Build Coastguard Worker 
CreateBackend(NetLog * net_log,disk_cache::BackendResultCallback callback)875*6777b538SAndroid Build Coastguard Worker disk_cache::BackendResult MockBlockingBackendFactory::CreateBackend(
876*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
877*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResultCallback callback) {
878*6777b538SAndroid Build Coastguard Worker   if (!block_) {
879*6777b538SAndroid Build Coastguard Worker     return MakeResult();
880*6777b538SAndroid Build Coastguard Worker   }
881*6777b538SAndroid Build Coastguard Worker 
882*6777b538SAndroid Build Coastguard Worker   callback_ = std::move(callback);
883*6777b538SAndroid Build Coastguard Worker   return disk_cache::BackendResult::MakeError(ERR_IO_PENDING);
884*6777b538SAndroid Build Coastguard Worker }
885*6777b538SAndroid Build Coastguard Worker 
FinishCreation()886*6777b538SAndroid Build Coastguard Worker void MockBlockingBackendFactory::FinishCreation() {
887*6777b538SAndroid Build Coastguard Worker   block_ = false;
888*6777b538SAndroid Build Coastguard Worker   if (!callback_.is_null()) {
889*6777b538SAndroid Build Coastguard Worker     // Running the callback might delete |this|.
890*6777b538SAndroid Build Coastguard Worker     std::move(callback_).Run(MakeResult());
891*6777b538SAndroid Build Coastguard Worker   }
892*6777b538SAndroid Build Coastguard Worker }
893*6777b538SAndroid Build Coastguard Worker 
MakeResult()894*6777b538SAndroid Build Coastguard Worker disk_cache::BackendResult MockBlockingBackendFactory::MakeResult() {
895*6777b538SAndroid Build Coastguard Worker   if (fail_) {
896*6777b538SAndroid Build Coastguard Worker     return disk_cache::BackendResult::MakeError(ERR_FAILED);
897*6777b538SAndroid Build Coastguard Worker   } else {
898*6777b538SAndroid Build Coastguard Worker     return disk_cache::BackendResult::Make(std::make_unique<MockDiskCache>());
899*6777b538SAndroid Build Coastguard Worker   }
900*6777b538SAndroid Build Coastguard Worker }
901*6777b538SAndroid Build Coastguard Worker 
902*6777b538SAndroid Build Coastguard Worker }  // namespace net
903