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