1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 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)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef WEBKIT_BROWSER_QUOTA_MOCK_QUOTA_MANAGER_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define WEBKIT_BROWSER_QUOTA_MOCK_QUOTA_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_client.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_task.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/quota/quota_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace quota {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mocks the pieces of QuotaManager's interface.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For usage/quota tracking test:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Usage and quota information can be updated by following private helper
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods: SetQuota() and UpdateUsage().
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For time-based deletion test:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Origins can be added to the mock by calling AddOrigin, and that list of
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// origins is then searched through in GetOriginsModifiedSince.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Neither GetOriginsModifiedSince nor DeleteOriginData touches the actual
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// origin data stored in the profile.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockQuotaManager : public QuotaManager {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockQuotaManager(bool is_incognito,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const base::FilePath& profile_path,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::SingleThreadTaskRunner* io_thread,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::SequencedTaskRunner* db_thread,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   SpecialStoragePolicy* special_storage_policy);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides QuotaManager's implementation. The internal usage data is
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updated when MockQuotaManagerProxy::NotifyStorageModified() is
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called.  The internal quota value can be updated by calling
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a helper method MockQuotaManagerProxy::SetQuota().
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetUsageAndQuota(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota::StorageType type,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetUsageAndQuotaCallback& callback) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides QuotaManager's implementation with a canned implementation that
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allows clients to set up the origin database that should be queried. This
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method will only search through the origins added explicitly via AddOrigin.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetOriginsModifiedSince(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StorageType type,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time modified_since,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetOriginsCallback& callback) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes an origin from the canned list of origins, but doesn't touch
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // anything on disk. The caller must provide |quota_client_mask| which
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specifies the types of QuotaClients which should be removed from this
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin as a bitmask built from QuotaClient::IDs. Setting the mask to
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QuotaClient::kAllClientsMask will remove all clients from the origin,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regardless of type.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteOriginData(const GURL& origin,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                StorageType type,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int quota_client_mask,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const StatusCallback& callback) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method for updating internal quota info.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetQuota(const GURL& origin, StorageType type, int64 quota);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper methods for timed-deletion testing:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an origin to the canned list that will be searched through via
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetOriginsModifiedSince. The caller must provide |quota_client_mask|
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which specifies the types of QuotaClients this canned origin contains
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as a bitmask built from QuotaClient::IDs.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddOrigin(const GURL& origin,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 StorageType type,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 int quota_client_mask,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Time modified);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper methods for timed-deletion testing:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks an origin and type against the origins that have been added via
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddOrigin and removed via DeleteOriginData. If the origin exists in the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // canned list with the proper StorageType and client, returns true.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OriginHasData(const GURL& origin,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     StorageType type,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     QuotaClient::ID quota_client) const;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockQuotaManager();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class MockQuotaManagerProxy;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the essential bits of information about an origin that the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MockQuotaManager needs to understand for time-based deletion:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the origin itself, the StorageType and its modification time.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct OriginInfo {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OriginInfo(const GURL& origin,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               StorageType type,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int quota_client_mask,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               base::Time modified);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~OriginInfo();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL origin;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StorageType type;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int quota_client_mask;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time modified;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the essential information for each origin for usage/quota testing.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Ideally this should probably merged into the above struct, but for
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regular usage/quota testing we hardly need modified time but only
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want to keep usage and quota information, so this struct exists.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct StorageInfo {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StorageInfo();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~StorageInfo();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 usage;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 quota;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<GURL, StorageType> OriginAndType;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<OriginAndType, StorageInfo> UsageAndQuotaMap;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This must be called via MockQuotaManagerProxy.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateUsage(const GURL& origin, StorageType type, int64 delta);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetModifiedSince(const GetOriginsCallback& callback,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           std::set<GURL>* origins,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           StorageType storage_type);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidDeleteOriginData(const StatusCallback& callback,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           QuotaStatusCode status);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The list of stored origins that have been added via AddOrigin.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<OriginInfo> origins_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<MockQuotaManager> weak_factory_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageAndQuotaMap usage_and_quota_map_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockQuotaManager);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockQuotaManagerProxy.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockQuotaManagerProxy : public QuotaManagerProxy {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is ok to give NULL to |quota_manager|.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockQuotaManagerProxy(MockQuotaManager* quota_manager,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::SingleThreadTaskRunner* task_runner);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterClient(QuotaClient* client) OVERRIDE;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateQuotaManagerDestroyed();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't mock them.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyOriginInUse(const GURL& origin) OVERRIDE {}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyOriginNoLongerInUse(const GURL& origin) OVERRIDE {}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Validates the |client_id| and updates the internal access count
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which can be accessed via notify_storage_accessed_count().
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The also records the |origin| and |type| in last_notified_origin_ and
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last_notified_type_.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyStorageAccessed(QuotaClient::ID client_id,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     StorageType type) OVERRIDE;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records the |origin|, |type| and |delta| as last_notified_origin_,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last_notified_type_ and last_notified_delta_ respecitvely.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If non-null MockQuotaManager is given to the constructor this also
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates the manager's internal usage information.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyStorageModified(QuotaClient::ID client_id,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     StorageType type,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int64 delta) OVERRIDE;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int notify_storage_accessed_count() const { return storage_accessed_count_; }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int notify_storage_modified_count() const { return storage_modified_count_; }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL last_notified_origin() const { return last_notified_origin_; }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType last_notified_type() const { return last_notified_type_; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 last_notified_delta() const { return last_notified_delta_; }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockQuotaManagerProxy();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockQuotaManager* mock_manager() const {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<MockQuotaManager*>(quota_manager());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int storage_accessed_count_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int storage_modified_count_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL last_notified_origin_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType last_notified_type_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 last_notified_delta_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaClient* registered_client_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace quota
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // WEBKIT_BROWSER_QUOTA_MOCK_QUOTA_MANAGER_H_
198