mock_http_cache.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a mock of the http cache and related testing classes. To be fair, it
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not really a mock http cache given that it uses the real implementation of
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the http cache, but it has fake implementations of all required components,
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so it is useful for unit tests at the http layer.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_MOCK_HTTP_CACHE_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_MOCK_HTTP_CACHE_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/hash_tables.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_unittest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock disk cache (a very basic memory cache implementation).
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDiskEntry : public disk_cache::Entry,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      public base::RefCounted<MockDiskEntry> {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDiskEntry();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockDiskEntry(const std::string& key);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_doomed() const { return doomed_; }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Doom() OVERRIDE;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Close() OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetKey() const OVERRIDE;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Time GetLastUsed() const OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Time GetLastModified() const OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 GetDataSize(int index) const OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReadData(int index, int offset, net::IOBuffer* buf, int buf_len,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const net::CompletionCallback& callback) OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int WriteData(int index, int offset, net::IOBuffer* buf, int buf_len,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const net::CompletionCallback& callback,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        bool truncate) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const net::CompletionCallback& callback) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int WriteSparseData(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 offset, net::IOBuffer* buf, int buf_len,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetAvailableRange(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 offset, int len, int64* start,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback) OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CouldBeSparse() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelSparseIO() OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReadyForSparseIO(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& completion_callback) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fail most subsequent requests.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_fail_requests() { fail_requests_ = true; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |value| is true, don't deliver any completion callbacks until called
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // again with |value| set to false.  Caution: remember to enable callbacks
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // again or all subsequent tests will fail.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void IgnoreCallbacks(bool value);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<MockDiskEntry>;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct CallbackInfo;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDiskEntry();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlike the callbacks for MockHttpTransaction, we want this one to run even
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the consumer called Close on the MockDiskEntry.  We achieve that by
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leveraging the fact that this class is reference counted.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallbackLater(const net::CompletionCallback& callback, int result);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunCallback(const net::CompletionCallback& callback, int result);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When |store| is true, stores the callback to be delivered later; otherwise
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delivers any callback previously stored.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void StoreAndDeliverCallbacks(bool store, MockDiskEntry* entry,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const net::CompletionCallback& callback,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int result);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kNumCacheEntryDataIndices = 3;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> data_[kNumCacheEntryDataIndices];
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int test_mode_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool doomed_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sparse_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fail_requests_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool busy_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool delayed_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool cancel_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ignore_callbacks_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDiskCache : public disk_cache::Backend {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDiskCache();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDiskCache();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::CacheType GetCacheType() const OVERRIDE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 GetEntryCount() const OVERRIDE;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OpenEntry(const std::string& key, disk_cache::Entry** entry,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const net::CompletionCallback& callback) OVERRIDE;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int CreateEntry(const std::string& key, disk_cache::Entry** entry,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const net::CompletionCallback& callback) OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int DoomEntry(const std::string& key,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const net::CompletionCallback& callback) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int DoomAllEntries(const net::CompletionCallback& callback) OVERRIDE;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int DoomEntriesBetween(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Time initial_time,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Time end_time,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback) OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int DoomEntriesSince(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Time initial_time,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OpenNextEntry(void** iter, disk_cache::Entry** next_entry,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const net::CompletionCallback& callback) OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EndEnumeration(void** iter) OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetStats(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::pair<std::string, std::string> >* stats) OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnExternalCacheHit(const std::string& key) OVERRIDE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns number of times a cache entry was successfully opened.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int open_count() const { return open_count_; }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns number of times a cache entry was successfully created.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int create_count() const { return create_count_; }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fail any subsequent CreateEntry and OpenEntry.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_fail_requests() { fail_requests_ = true; }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return entries that fail some of their requests.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_soft_failures(bool value) { soft_failures_ = value; }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure that CreateEntry is not called twice for a given key.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_double_create_check(bool value) { double_create_check_ = value; }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseAll();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<std::string, MockDiskEntry*> EntryMap;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallbackLater(const net::CompletionCallback& callback, int result);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EntryMap entries_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int open_count_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int create_count_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fail_requests_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool soft_failures_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool double_create_check_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBackendFactory : public net::HttpCache::BackendFactory {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int CreateBackend(net::NetLog* net_log,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            disk_cache::Backend** backend,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const net::CompletionCallback& callback) OVERRIDE;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockHttpCache {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHttpCache();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockHttpCache(net::HttpCache::BackendFactory* disk_cache_factory);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpCache* http_cache() { return &http_cache_; }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockNetworkLayer* network_layer() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<MockNetworkLayer*>(http_cache_.network_layer());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDiskCache* disk_cache();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for reading response info from the disk cache.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ReadResponseInfo(disk_cache::Entry* disk_entry,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               net::HttpResponseInfo* response_info,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool* response_truncated);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for writing response info into the disk cache.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool WriteResponseInfo(disk_cache::Entry* disk_entry,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const net::HttpResponseInfo* response_info,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool skip_transient_headers,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool response_truncated);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to synchronously open a backend entry.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OpenBackendEntry(const std::string& key, disk_cache::Entry** entry);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to synchronously create a backend entry.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateBackendEntry(const std::string& key, disk_cache::Entry** entry,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::NetLog* net_log);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the test mode after considering the global override.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetTestMode(int test_mode);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides the test mode for a given operation. Remember to reset it after
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the test! (by setting test_mode to zero).
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetTestMode(int test_mode);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpCache http_cache_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version of the disk cache doesn't invoke CreateEntry callbacks.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDiskCacheNoCB : public MockDiskCache {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int CreateEntry(const std::string& key, disk_cache::Entry** entry,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const net::CompletionCallback& callback) OVERRIDE;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBackendNoCbFactory : public net::HttpCache::BackendFactory {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int CreateBackend(net::NetLog* net_log,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            disk_cache::Backend** backend,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const net::CompletionCallback& callback) OVERRIDE;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This backend factory allows us to control the backend instantiation.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBlockingBackendFactory : public net::HttpCache::BackendFactory {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockBlockingBackendFactory();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockBlockingBackendFactory();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int CreateBackend(net::NetLog* net_log,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            disk_cache::Backend** backend,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const net::CompletionCallback& callback) OVERRIDE;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Completes the backend creation. Any blocked call will be notified via the
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided callback.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishCreation();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Backend** backend() { return backend_; }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_fail(bool fail) { fail_ = fail; }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::CompletionCallback& callback() { return callback_; }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int Result() { return fail_ ? net::ERR_FAILED : net::OK; }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Backend** backend_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CompletionCallback callback_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool block_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fail_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_MOCK_HTTP_CACHE_H_
242