xref: /aosp_15_r20/external/cronet/net/http/mock_http_cache.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 // This is a mock of the http cache and related testing classes. To be fair, it
6*6777b538SAndroid Build Coastguard Worker // is not really a mock http cache given that it uses the real implementation of
7*6777b538SAndroid Build Coastguard Worker // the http cache, but it has fake implementations of all required components,
8*6777b538SAndroid Build Coastguard Worker // so it is useful for unit tests at the http layer.
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_MOCK_HTTP_CACHE_H_
11*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_MOCK_HTTP_CACHE_H_
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include <map>
16*6777b538SAndroid Build Coastguard Worker #include <memory>
17*6777b538SAndroid Build Coastguard Worker #include <string>
18*6777b538SAndroid Build Coastguard Worker #include <utility>
19*6777b538SAndroid Build Coastguard Worker #include <vector>
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/http/http_cache.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/http/http_transaction_test_util.h"
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker namespace net {
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
32*6777b538SAndroid Build Coastguard Worker // Mock disk cache (a very basic memory cache implementation).
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker class MockDiskEntry : public disk_cache::Entry,
35*6777b538SAndroid Build Coastguard Worker                       public base::RefCounted<MockDiskEntry> {
36*6777b538SAndroid Build Coastguard Worker  public:
37*6777b538SAndroid Build Coastguard Worker   enum DeferOp {
38*6777b538SAndroid Build Coastguard Worker     DEFER_NONE,
39*6777b538SAndroid Build Coastguard Worker     DEFER_CREATE,
40*6777b538SAndroid Build Coastguard Worker     DEFER_READ,
41*6777b538SAndroid Build Coastguard Worker     DEFER_WRITE,
42*6777b538SAndroid Build Coastguard Worker   };
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   // Bit mask used for set_fail_requests().
45*6777b538SAndroid Build Coastguard Worker   enum FailOp {
46*6777b538SAndroid Build Coastguard Worker     FAIL_READ = 0x01,
47*6777b538SAndroid Build Coastguard Worker     FAIL_WRITE = 0x02,
48*6777b538SAndroid Build Coastguard Worker     FAIL_READ_SPARSE = 0x04,
49*6777b538SAndroid Build Coastguard Worker     FAIL_WRITE_SPARSE = 0x08,
50*6777b538SAndroid Build Coastguard Worker     FAIL_GET_AVAILABLE_RANGE = 0x10,
51*6777b538SAndroid Build Coastguard Worker     FAIL_ALL = 0xFF
52*6777b538SAndroid Build Coastguard Worker   };
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   explicit MockDiskEntry(const std::string& key);
55*6777b538SAndroid Build Coastguard Worker 
is_doomed()56*6777b538SAndroid Build Coastguard Worker   bool is_doomed() const { return doomed_; }
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   void Doom() override;
59*6777b538SAndroid Build Coastguard Worker   void Close() override;
60*6777b538SAndroid Build Coastguard Worker   std::string GetKey() const override;
61*6777b538SAndroid Build Coastguard Worker   base::Time GetLastUsed() const override;
62*6777b538SAndroid Build Coastguard Worker   base::Time GetLastModified() const override;
63*6777b538SAndroid Build Coastguard Worker   int32_t GetDataSize(int index) const override;
64*6777b538SAndroid Build Coastguard Worker   int ReadData(int index,
65*6777b538SAndroid Build Coastguard Worker                int offset,
66*6777b538SAndroid Build Coastguard Worker                IOBuffer* buf,
67*6777b538SAndroid Build Coastguard Worker                int buf_len,
68*6777b538SAndroid Build Coastguard Worker                CompletionOnceCallback callback) override;
69*6777b538SAndroid Build Coastguard Worker   int WriteData(int index,
70*6777b538SAndroid Build Coastguard Worker                 int offset,
71*6777b538SAndroid Build Coastguard Worker                 IOBuffer* buf,
72*6777b538SAndroid Build Coastguard Worker                 int buf_len,
73*6777b538SAndroid Build Coastguard Worker                 CompletionOnceCallback callback,
74*6777b538SAndroid Build Coastguard Worker                 bool truncate) override;
75*6777b538SAndroid Build Coastguard Worker   int ReadSparseData(int64_t offset,
76*6777b538SAndroid Build Coastguard Worker                      IOBuffer* buf,
77*6777b538SAndroid Build Coastguard Worker                      int buf_len,
78*6777b538SAndroid Build Coastguard Worker                      CompletionOnceCallback callback) override;
79*6777b538SAndroid Build Coastguard Worker   int WriteSparseData(int64_t offset,
80*6777b538SAndroid Build Coastguard Worker                       IOBuffer* buf,
81*6777b538SAndroid Build Coastguard Worker                       int buf_len,
82*6777b538SAndroid Build Coastguard Worker                       CompletionOnceCallback callback) override;
83*6777b538SAndroid Build Coastguard Worker   RangeResult GetAvailableRange(int64_t offset,
84*6777b538SAndroid Build Coastguard Worker                                 int len,
85*6777b538SAndroid Build Coastguard Worker                                 RangeResultCallback callback) override;
86*6777b538SAndroid Build Coastguard Worker   bool CouldBeSparse() const override;
87*6777b538SAndroid Build Coastguard Worker   void CancelSparseIO() override;
88*6777b538SAndroid Build Coastguard Worker   net::Error ReadyForSparseIO(
89*6777b538SAndroid Build Coastguard Worker       CompletionOnceCallback completion_callback) override;
90*6777b538SAndroid Build Coastguard Worker   void SetLastUsedTimeForTest(base::Time time) override;
91*6777b538SAndroid Build Coastguard Worker 
in_memory_data()92*6777b538SAndroid Build Coastguard Worker   uint8_t in_memory_data() const { return in_memory_data_; }
set_in_memory_data(uint8_t val)93*6777b538SAndroid Build Coastguard Worker   void set_in_memory_data(uint8_t val) { in_memory_data_ = val; }
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   // Fail subsequent requests, specified via FailOp bits.
set_fail_requests(int mask)96*6777b538SAndroid Build Coastguard Worker   void set_fail_requests(int mask) { fail_requests_ = mask; }
97*6777b538SAndroid Build Coastguard Worker 
set_fail_sparse_requests()98*6777b538SAndroid Build Coastguard Worker   void set_fail_sparse_requests() { fail_sparse_requests_ = true; }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   // If |value| is true, don't deliver any completion callbacks until called
101*6777b538SAndroid Build Coastguard Worker   // again with |value| set to false.  Caution: remember to enable callbacks
102*6777b538SAndroid Build Coastguard Worker   // again or all subsequent tests will fail.
103*6777b538SAndroid Build Coastguard Worker   static void IgnoreCallbacks(bool value);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   // Defers invoking the callback for the given operation. Calling code should
106*6777b538SAndroid Build Coastguard Worker   // invoke ResumeDiskEntryOperation to resume.
SetDefer(DeferOp defer_op)107*6777b538SAndroid Build Coastguard Worker   void SetDefer(DeferOp defer_op) { defer_op_ = defer_op; }
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   // Resumes deferred cache operation by posting |resume_callback_| with
110*6777b538SAndroid Build Coastguard Worker   // |resume_return_code_|.
111*6777b538SAndroid Build Coastguard Worker   void ResumeDiskEntryOperation();
112*6777b538SAndroid Build Coastguard Worker 
113*6777b538SAndroid Build Coastguard Worker   // Sets the maximum length of a stream. This is only applied to stream 1.
set_max_file_size(int val)114*6777b538SAndroid Build Coastguard Worker   void set_max_file_size(int val) { max_file_size_ = val; }
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker  private:
117*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<MockDiskEntry>;
118*6777b538SAndroid Build Coastguard Worker   struct CallbackInfo;
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   ~MockDiskEntry() override;
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   // Unlike the callbacks for MockHttpTransaction, we want this one to run even
123*6777b538SAndroid Build Coastguard Worker   // if the consumer called Close on the MockDiskEntry.  We achieve that by
124*6777b538SAndroid Build Coastguard Worker   // leveraging the fact that this class is reference counted.
125*6777b538SAndroid Build Coastguard Worker   void CallbackLater(CompletionOnceCallback callback, int result);
126*6777b538SAndroid Build Coastguard Worker   void CallbackLater(base::OnceClosure callback);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   void RunCallback(base::OnceClosure callback);
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   // When |store| is true, stores the callback to be delivered later; otherwise
131*6777b538SAndroid Build Coastguard Worker   // delivers any callback previously stored.
132*6777b538SAndroid Build Coastguard Worker   static void StoreAndDeliverCallbacks(bool store,
133*6777b538SAndroid Build Coastguard Worker                                        MockDiskEntry* entry,
134*6777b538SAndroid Build Coastguard Worker                                        base::OnceClosure callback);
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   static const int kNumCacheEntryDataIndices = 3;
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   std::string key_;
139*6777b538SAndroid Build Coastguard Worker   std::vector<char> data_[kNumCacheEntryDataIndices];
140*6777b538SAndroid Build Coastguard Worker   uint8_t in_memory_data_ = 0;
141*6777b538SAndroid Build Coastguard Worker   int test_mode_;
142*6777b538SAndroid Build Coastguard Worker   int max_file_size_;
143*6777b538SAndroid Build Coastguard Worker   bool doomed_ = false;
144*6777b538SAndroid Build Coastguard Worker   bool sparse_ = false;
145*6777b538SAndroid Build Coastguard Worker   int fail_requests_ = 0;
146*6777b538SAndroid Build Coastguard Worker   bool fail_sparse_requests_ = false;
147*6777b538SAndroid Build Coastguard Worker   bool busy_ = false;
148*6777b538SAndroid Build Coastguard Worker   bool delayed_ = false;
149*6777b538SAndroid Build Coastguard Worker   bool cancel_ = false;
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker   // Used for pause and restart.
152*6777b538SAndroid Build Coastguard Worker   DeferOp defer_op_ = DEFER_NONE;
153*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback resume_callback_;
154*6777b538SAndroid Build Coastguard Worker   int resume_return_code_ = 0;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   static bool ignore_callbacks_;
157*6777b538SAndroid Build Coastguard Worker };
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker class MockDiskCache : public disk_cache::Backend {
160*6777b538SAndroid Build Coastguard Worker  public:
161*6777b538SAndroid Build Coastguard Worker   MockDiskCache();
162*6777b538SAndroid Build Coastguard Worker   ~MockDiskCache() override;
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   int32_t GetEntryCount() const override;
165*6777b538SAndroid Build Coastguard Worker   EntryResult OpenOrCreateEntry(const std::string& key,
166*6777b538SAndroid Build Coastguard Worker                                 net::RequestPriority request_priority,
167*6777b538SAndroid Build Coastguard Worker                                 EntryResultCallback callback) override;
168*6777b538SAndroid Build Coastguard Worker   EntryResult OpenEntry(const std::string& key,
169*6777b538SAndroid Build Coastguard Worker                         net::RequestPriority request_priority,
170*6777b538SAndroid Build Coastguard Worker                         EntryResultCallback callback) override;
171*6777b538SAndroid Build Coastguard Worker   EntryResult CreateEntry(const std::string& key,
172*6777b538SAndroid Build Coastguard Worker                           net::RequestPriority request_priority,
173*6777b538SAndroid Build Coastguard Worker                           EntryResultCallback callback) override;
174*6777b538SAndroid Build Coastguard Worker   net::Error DoomEntry(const std::string& key,
175*6777b538SAndroid Build Coastguard Worker                        net::RequestPriority request_priority,
176*6777b538SAndroid Build Coastguard Worker                        CompletionOnceCallback callback) override;
177*6777b538SAndroid Build Coastguard Worker   net::Error DoomAllEntries(CompletionOnceCallback callback) override;
178*6777b538SAndroid Build Coastguard Worker   net::Error DoomEntriesBetween(base::Time initial_time,
179*6777b538SAndroid Build Coastguard Worker                                 base::Time end_time,
180*6777b538SAndroid Build Coastguard Worker                                 CompletionOnceCallback callback) override;
181*6777b538SAndroid Build Coastguard Worker   net::Error DoomEntriesSince(base::Time initial_time,
182*6777b538SAndroid Build Coastguard Worker                               CompletionOnceCallback callback) override;
183*6777b538SAndroid Build Coastguard Worker   int64_t CalculateSizeOfAllEntries(
184*6777b538SAndroid Build Coastguard Worker       Int64CompletionOnceCallback callback) override;
185*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Iterator> CreateIterator() override;
186*6777b538SAndroid Build Coastguard Worker   void GetStats(base::StringPairs* stats) override;
187*6777b538SAndroid Build Coastguard Worker   void OnExternalCacheHit(const std::string& key) override;
188*6777b538SAndroid Build Coastguard Worker   uint8_t GetEntryInMemoryData(const std::string& key) override;
189*6777b538SAndroid Build Coastguard Worker   void SetEntryInMemoryData(const std::string& key, uint8_t data) override;
190*6777b538SAndroid Build Coastguard Worker   int64_t MaxFileSize() const override;
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   // Returns number of times a cache entry was successfully opened.
open_count()193*6777b538SAndroid Build Coastguard Worker   int open_count() const { return open_count_; }
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker   // Returns number of times a cache entry was successfully created.
create_count()196*6777b538SAndroid Build Coastguard Worker   int create_count() const { return create_count_; }
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   // Returns number of doomed entries.
doomed_count()199*6777b538SAndroid Build Coastguard Worker   int doomed_count() const { return doomed_count_; }
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   // Fail any subsequent CreateEntry, OpenEntry, and DoomEntry
set_fail_requests(bool value)202*6777b538SAndroid Build Coastguard Worker   void set_fail_requests(bool value) { fail_requests_ = value; }
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   // Return entries that fail some of their requests.
205*6777b538SAndroid Build Coastguard Worker   // The value is formed as a bitmask of MockDiskEntry::FailOp.
set_soft_failures_mask(int value)206*6777b538SAndroid Build Coastguard Worker   void set_soft_failures_mask(int value) { soft_failures_ = value; }
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   // Returns entries that fail some of their requests, but only until
209*6777b538SAndroid Build Coastguard Worker   // the entry is re-created. The value is formed as a bitmask of
210*6777b538SAndroid Build Coastguard Worker   // MockDiskEntry::FailOp.
set_soft_failures_one_instance(int value)211*6777b538SAndroid Build Coastguard Worker   void set_soft_failures_one_instance(int value) {
212*6777b538SAndroid Build Coastguard Worker     soft_failures_one_instance_ = value;
213*6777b538SAndroid Build Coastguard Worker   }
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker   // Makes sure that CreateEntry is not called twice for a given key.
set_double_create_check(bool value)216*6777b538SAndroid Build Coastguard Worker   void set_double_create_check(bool value) { double_create_check_ = value; }
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker   // Determines whether to provide the GetEntryInMemoryData/SetEntryInMemoryData
219*6777b538SAndroid Build Coastguard Worker   // interface.  Default is true.
set_support_in_memory_entry_data(bool value)220*6777b538SAndroid Build Coastguard Worker   void set_support_in_memory_entry_data(bool value) {
221*6777b538SAndroid Build Coastguard Worker     support_in_memory_entry_data_ = value;
222*6777b538SAndroid Build Coastguard Worker   }
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker   // OpenEntry, CreateEntry, and DoomEntry immediately return with
225*6777b538SAndroid Build Coastguard Worker   // ERR_IO_PENDING and will callback some time later with an error.
set_force_fail_callback_later(bool value)226*6777b538SAndroid Build Coastguard Worker   void set_force_fail_callback_later(bool value) {
227*6777b538SAndroid Build Coastguard Worker     force_fail_callback_later_ = value;
228*6777b538SAndroid Build Coastguard Worker   }
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   // Makes all requests for data ranges to fail as not implemented.
set_fail_sparse_requests()231*6777b538SAndroid Build Coastguard Worker   void set_fail_sparse_requests() { fail_sparse_requests_ = true; }
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker   // Sets the limit on how big entry streams can get. Only stream 1 enforces
234*6777b538SAndroid Build Coastguard Worker   // this, but MaxFileSize() will still report it.
set_max_file_size(int new_size)235*6777b538SAndroid Build Coastguard Worker   void set_max_file_size(int new_size) { max_file_size_ = new_size; }
236*6777b538SAndroid Build Coastguard Worker 
237*6777b538SAndroid Build Coastguard Worker   void ReleaseAll();
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker   // Returns true if a doomed entry exists with this key.
240*6777b538SAndroid Build Coastguard Worker   bool IsDiskEntryDoomed(const std::string& key);
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker   // Defers invoking the callback for the given operation. Calling code should
243*6777b538SAndroid Build Coastguard Worker   // invoke ResumeCacheOperation to resume.
SetDefer(MockDiskEntry::DeferOp defer_op)244*6777b538SAndroid Build Coastguard Worker   void SetDefer(MockDiskEntry::DeferOp defer_op) { defer_op_ = defer_op; }
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker   // Resume deferred cache operation by posting |resume_callback_| with
247*6777b538SAndroid Build Coastguard Worker   // |resume_return_code_|.
248*6777b538SAndroid Build Coastguard Worker   void ResumeCacheOperation();
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   // Returns a reference to the disk entry with the given |key|.
251*6777b538SAndroid Build Coastguard Worker   scoped_refptr<MockDiskEntry> GetDiskEntryRef(const std::string& key);
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker   // Returns a reference to the vector storing all keys for external cache hits.
254*6777b538SAndroid Build Coastguard Worker   const std::vector<std::string>& GetExternalCacheHits() const;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker  private:
257*6777b538SAndroid Build Coastguard Worker   using EntryMap = std::map<std::string, MockDiskEntry*>;
258*6777b538SAndroid Build Coastguard Worker   class NotImplementedIterator;
259*6777b538SAndroid Build Coastguard Worker 
260*6777b538SAndroid Build Coastguard Worker   void CallbackLater(base::OnceClosure callback);
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker   EntryMap entries_;
263*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> external_cache_hits_;
264*6777b538SAndroid Build Coastguard Worker   int open_count_ = 0;
265*6777b538SAndroid Build Coastguard Worker   int create_count_ = 0;
266*6777b538SAndroid Build Coastguard Worker   int doomed_count_ = 0;
267*6777b538SAndroid Build Coastguard Worker   int max_file_size_;
268*6777b538SAndroid Build Coastguard Worker   bool fail_requests_ = false;
269*6777b538SAndroid Build Coastguard Worker   int soft_failures_ = 0;
270*6777b538SAndroid Build Coastguard Worker   int soft_failures_one_instance_ = 0;
271*6777b538SAndroid Build Coastguard Worker   bool double_create_check_ = true;
272*6777b538SAndroid Build Coastguard Worker   bool fail_sparse_requests_ = false;
273*6777b538SAndroid Build Coastguard Worker   bool support_in_memory_entry_data_ = true;
274*6777b538SAndroid Build Coastguard Worker   bool force_fail_callback_later_ = false;
275*6777b538SAndroid Build Coastguard Worker 
276*6777b538SAndroid Build Coastguard Worker   // Used for pause and restart.
277*6777b538SAndroid Build Coastguard Worker   MockDiskEntry::DeferOp defer_op_ = MockDiskEntry::DEFER_NONE;
278*6777b538SAndroid Build Coastguard Worker   base::OnceClosure resume_callback_;
279*6777b538SAndroid Build Coastguard Worker };
280*6777b538SAndroid Build Coastguard Worker 
281*6777b538SAndroid Build Coastguard Worker class MockBackendFactory : public HttpCache::BackendFactory {
282*6777b538SAndroid Build Coastguard Worker  public:
283*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult CreateBackend(
284*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
285*6777b538SAndroid Build Coastguard Worker       disk_cache::BackendResultCallback callback) override;
286*6777b538SAndroid Build Coastguard Worker };
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker class MockHttpCache {
289*6777b538SAndroid Build Coastguard Worker  public:
290*6777b538SAndroid Build Coastguard Worker   MockHttpCache();
291*6777b538SAndroid Build Coastguard Worker   explicit MockHttpCache(
292*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<HttpCache::BackendFactory> disk_cache_factory);
293*6777b538SAndroid Build Coastguard Worker 
http_cache()294*6777b538SAndroid Build Coastguard Worker   HttpCache* http_cache() { return &http_cache_; }
295*6777b538SAndroid Build Coastguard Worker 
network_layer()296*6777b538SAndroid Build Coastguard Worker   MockNetworkLayer* network_layer() {
297*6777b538SAndroid Build Coastguard Worker     return static_cast<MockNetworkLayer*>(http_cache_.network_layer());
298*6777b538SAndroid Build Coastguard Worker   }
299*6777b538SAndroid Build Coastguard Worker   disk_cache::Backend* backend();
300*6777b538SAndroid Build Coastguard Worker   MockDiskCache* disk_cache();
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker   // Wrapper around http_cache()->CreateTransaction(DEFAULT_PRIORITY...)
303*6777b538SAndroid Build Coastguard Worker   int CreateTransaction(std::unique_ptr<HttpTransaction>* trans);
304*6777b538SAndroid Build Coastguard Worker 
305*6777b538SAndroid Build Coastguard Worker   // Wrapper to simulate cache lock timeout for new transactions.
306*6777b538SAndroid Build Coastguard Worker   void SimulateCacheLockTimeout();
307*6777b538SAndroid Build Coastguard Worker 
308*6777b538SAndroid Build Coastguard Worker   // Wrapper to simulate cache lock timeout for new transactions.
309*6777b538SAndroid Build Coastguard Worker   void SimulateCacheLockTimeoutAfterHeaders();
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   // Wrapper to fail request conditionalization for new transactions.
312*6777b538SAndroid Build Coastguard Worker   void FailConditionalizations();
313*6777b538SAndroid Build Coastguard Worker 
314*6777b538SAndroid Build Coastguard Worker   // Helper function for reading response info from the disk cache.
315*6777b538SAndroid Build Coastguard Worker   static bool ReadResponseInfo(disk_cache::Entry* disk_entry,
316*6777b538SAndroid Build Coastguard Worker                                HttpResponseInfo* response_info,
317*6777b538SAndroid Build Coastguard Worker                                bool* response_truncated);
318*6777b538SAndroid Build Coastguard Worker 
319*6777b538SAndroid Build Coastguard Worker   // Helper function for writing response info into the disk cache.
320*6777b538SAndroid Build Coastguard Worker   static bool WriteResponseInfo(disk_cache::Entry* disk_entry,
321*6777b538SAndroid Build Coastguard Worker                                 const HttpResponseInfo* response_info,
322*6777b538SAndroid Build Coastguard Worker                                 bool skip_transient_headers,
323*6777b538SAndroid Build Coastguard Worker                                 bool response_truncated);
324*6777b538SAndroid Build Coastguard Worker 
325*6777b538SAndroid Build Coastguard Worker   // Helper function to synchronously open a backend entry.
326*6777b538SAndroid Build Coastguard Worker   bool OpenBackendEntry(const std::string& key, disk_cache::Entry** entry);
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker   // Helper function to synchronously create a backend entry.
329*6777b538SAndroid Build Coastguard Worker   bool CreateBackendEntry(const std::string& key,
330*6777b538SAndroid Build Coastguard Worker                           disk_cache::Entry** entry,
331*6777b538SAndroid Build Coastguard Worker                           NetLog* net_log);
332*6777b538SAndroid Build Coastguard Worker 
333*6777b538SAndroid Build Coastguard Worker   // Returns the test mode after considering the global override.
334*6777b538SAndroid Build Coastguard Worker   static int GetTestMode(int test_mode);
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   // Overrides the test mode for a given operation. Remember to reset it after
337*6777b538SAndroid Build Coastguard Worker   // the test! (by setting test_mode to zero).
338*6777b538SAndroid Build Coastguard Worker   static void SetTestMode(int test_mode);
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker   // Functions to test the state of ActiveEntry.
341*6777b538SAndroid Build Coastguard Worker   bool IsWriterPresent(const std::string& key);
342*6777b538SAndroid Build Coastguard Worker   bool IsHeadersTransactionPresent(const std::string& key);
343*6777b538SAndroid Build Coastguard Worker   int GetCountReaders(const std::string& key);
344*6777b538SAndroid Build Coastguard Worker   int GetCountAddToEntryQueue(const std::string& key);
345*6777b538SAndroid Build Coastguard Worker   int GetCountDoneHeadersQueue(const std::string& key);
346*6777b538SAndroid Build Coastguard Worker   int GetCountWriterTransactions(const std::string& key);
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   base::WeakPtr<HttpCache> GetWeakPtr();
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker  private:
351*6777b538SAndroid Build Coastguard Worker   HttpCache http_cache_;
352*6777b538SAndroid Build Coastguard Worker };
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker // This version of the disk cache doesn't invoke CreateEntry callbacks.
355*6777b538SAndroid Build Coastguard Worker class MockDiskCacheNoCB : public MockDiskCache {
356*6777b538SAndroid Build Coastguard Worker   EntryResult CreateEntry(const std::string& key,
357*6777b538SAndroid Build Coastguard Worker                           net::RequestPriority request_priority,
358*6777b538SAndroid Build Coastguard Worker                           EntryResultCallback callback) override;
359*6777b538SAndroid Build Coastguard Worker };
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker class MockBackendNoCbFactory : public HttpCache::BackendFactory {
362*6777b538SAndroid Build Coastguard Worker  public:
363*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult CreateBackend(
364*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
365*6777b538SAndroid Build Coastguard Worker       disk_cache::BackendResultCallback callback) override;
366*6777b538SAndroid Build Coastguard Worker };
367*6777b538SAndroid Build Coastguard Worker 
368*6777b538SAndroid Build Coastguard Worker // This backend factory allows us to control the backend instantiation.
369*6777b538SAndroid Build Coastguard Worker class MockBlockingBackendFactory : public HttpCache::BackendFactory {
370*6777b538SAndroid Build Coastguard Worker  public:
371*6777b538SAndroid Build Coastguard Worker   MockBlockingBackendFactory();
372*6777b538SAndroid Build Coastguard Worker   ~MockBlockingBackendFactory() override;
373*6777b538SAndroid Build Coastguard Worker 
374*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult CreateBackend(
375*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
376*6777b538SAndroid Build Coastguard Worker       disk_cache::BackendResultCallback callback) override;
377*6777b538SAndroid Build Coastguard Worker 
378*6777b538SAndroid Build Coastguard Worker   // Completes the backend creation. Any blocked call will be notified via the
379*6777b538SAndroid Build Coastguard Worker   // provided callback.
380*6777b538SAndroid Build Coastguard Worker   void FinishCreation();
381*6777b538SAndroid Build Coastguard Worker 
set_fail(bool fail)382*6777b538SAndroid Build Coastguard Worker   void set_fail(bool fail) { fail_ = fail; }
383*6777b538SAndroid Build Coastguard Worker 
ReleaseCallback()384*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResultCallback ReleaseCallback() {
385*6777b538SAndroid Build Coastguard Worker     return std::move(callback_);
386*6777b538SAndroid Build Coastguard Worker   }
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker  private:
389*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult MakeResult();
390*6777b538SAndroid Build Coastguard Worker 
391*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResultCallback callback_;
392*6777b538SAndroid Build Coastguard Worker   bool block_ = true;
393*6777b538SAndroid Build Coastguard Worker   bool fail_ = false;
394*6777b538SAndroid Build Coastguard Worker };
395*6777b538SAndroid Build Coastguard Worker 
396*6777b538SAndroid Build Coastguard Worker }  // namespace net
397*6777b538SAndroid Build Coastguard Worker 
398*6777b538SAndroid Build Coastguard Worker #endif  // NET_HTTP_MOCK_HTTP_CACHE_H_
399