#ifndef STORAGE_BROWSER_TEST_MOCK_QUOTA_MANAGER_H_
#define STORAGE_BROWSER_TEST_MOCK_QUOTA_MANAGER_H_
#include <stdint.h>
#include <list>
#include <map>
#include <memory>
#include <set>
#include <utility>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "components/services/storage/public/mojom/quota_client.mojom.h"
#include "storage/browser/quota/quota_client_type.h"
#include "storage/browser/quota/quota_manager.h"
#include "storage/browser/quota/quota_task.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
namespace storage {
class MockQuotaManager : public QuotaManager {
public:
MockQuotaManager(bool is_incognito,
const base::FilePath& profile_path,
scoped_refptr<base::SingleThreadTaskRunner> io_thread,
scoped_refptr<SpecialStoragePolicy> special_storage_policy);
MockQuotaManager(const MockQuotaManager&) = delete;
MockQuotaManager& operator=(const MockQuotaManager&) = delete;
void UpdateOrCreateBucket(
const BucketInitParams& bucket_params,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)>) override;
QuotaErrorOr<BucketInfo> GetOrCreateBucketSync(
const BucketInitParams& params);
void GetBucketById(
const BucketId& bucket_id,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)>) override;
void GetBucketByNameUnsafe(
const blink::StorageKey& storage_key,
const std::string& bucket_name,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)>) override;
void GetBucketsForStorageKey(
const blink::StorageKey& storage_key,
base::OnceCallback<void(QuotaErrorOr<std::set<BucketInfo>>)> callback,
bool delete_expired = false) override;
void GetUsageAndQuota(const blink::StorageKey& storage_key,
UsageAndQuotaCallback callback) override;
int64_t GetQuotaForStorageKey(const blink::StorageKey& storage_key,
const QuotaSettings& settings) const override;
void GetBucketsModifiedBetween(base::Time begin,
base::Time end,
GetBucketsCallback callback) override;
void DeleteBucketData(const BucketLocator& bucket,
QuotaClientTypes quota_client_types,
StatusCallback callback) override;
void FindAndDeleteBucketData(const blink::StorageKey& storage_key,
const std::string& bucket_name,
StatusCallback callback) override;
void UpdateBucketPersistence(
BucketId bucket,
bool persistent,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) override;
void OnClientWriteFailed(const blink::StorageKey& storage_key) override;
void CreateBucketForTesting(
const blink::StorageKey& storage_key,
const std::string& bucket_name,
base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) override;
void SetQuota(const blink::StorageKey& storage_key,
int64_t quota);
bool AddBucket(const BucketInfo& bucket,
QuotaClientTypes quota_client_types,
base::Time modified);
BucketInfo CreateBucket(const BucketInitParams& params);
bool BucketHasData(const BucketInfo& bucket,
QuotaClientType quota_client_type) const;
int BucketDataCount(QuotaClientType quota_client);
std::map<const blink::StorageKey, int> write_error_tracker() const {
return write_error_tracker_;
}
void SetDisableDatabase(bool disable) { db_disabled_ = disable; }
void HoldBackResults() { delay_results_ = true; }
void ReleaseResults();
protected:
~MockQuotaManager() override;
private:
friend class MockQuotaManagerProxy;
FRIEND_TEST_ALL_PREFIXES(MockQuotaManagerTest, QuotaAndUsage);
struct BucketData {
BucketData(const BucketInfo& bucket,
QuotaClientTypes quota_clients,
base::Time modified);
~BucketData();
BucketData(const BucketData&) = delete;
BucketData& operator=(const BucketData&) = delete;
BucketData(BucketData&&);
BucketData& operator=(BucketData&&);
BucketInfo bucket;
QuotaClientTypes quota_client_types;
base::Time modified;
};
struct StorageKeyQuota {
int64_t quota = std::numeric_limits<int64_t>::max();
};
struct BucketUsage {
int64_t usage = 0;
};
QuotaErrorOr<BucketInfo> FindBucketById(const BucketId& bucket_id);
QuotaErrorOr<BucketInfo> FindBucket(const blink::StorageKey& storage_key,
const std::string& bucket_name);
QuotaErrorOr<BucketInfo> FindBucket(const BucketLocator& locator);
QuotaErrorOr<BucketInfo> FindAndUpdateBucket(
const BucketInitParams& bucket_params);
void UpdateUsage(const BucketLocator& bucket, std::optional<int64_t> delta);
void DidGetBucket(base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
QuotaErrorOr<BucketInfo> result);
void DidGetModifiedInTimeRange(
GetBucketsCallback callback,
std::unique_ptr<std::set<BucketLocator>> buckets);
void DidDeleteBucketData(StatusCallback callback,
blink::mojom::QuotaStatusCode status);
base::FilePath profile_path() { return profile_path_; }
const base::FilePath profile_path_;
BucketId::Generator bucket_id_generator_;
std::vector<BucketData> buckets_;
std::map<blink::StorageKey, StorageKeyQuota> quota_map_;
std::map<BucketLocator, BucketUsage, CompareBucketLocators> usage_map_;
std::map<const blink::StorageKey, int> write_error_tracker_;
bool db_disabled_ = false;
bool delay_results_ = false;
std::list<base::ScopedClosureRunner> delayed_results_;
base::WeakPtrFactory<MockQuotaManager> weak_factory_{this};
};
}
#endif