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