1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/quota/mock_quota_manager.h"
6
7#include "base/memory/ref_counted.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop/message_loop.h"
10#include "base/single_thread_task_runner.h"
11#include "url/gurl.h"
12
13using storage::kQuotaStatusOk;
14
15namespace content {
16
17MockQuotaManager::OriginInfo::OriginInfo(
18    const GURL& origin,
19    StorageType type,
20    int quota_client_mask,
21    base::Time modified)
22    : origin(origin),
23      type(type),
24      quota_client_mask(quota_client_mask),
25      modified(modified) {
26}
27
28MockQuotaManager::OriginInfo::~OriginInfo() {}
29
30MockQuotaManager::StorageInfo::StorageInfo() : usage(0), quota(kint64max) {}
31MockQuotaManager::StorageInfo::~StorageInfo() {}
32
33MockQuotaManager::MockQuotaManager(
34    bool is_incognito,
35    const base::FilePath& profile_path,
36    const scoped_refptr<base::SingleThreadTaskRunner>& io_thread,
37    const scoped_refptr<base::SequencedTaskRunner>& db_thread,
38    const scoped_refptr<SpecialStoragePolicy>& special_storage_policy)
39    : QuotaManager(is_incognito,
40                   profile_path,
41                   io_thread,
42                   db_thread,
43                   special_storage_policy),
44      weak_factory_(this) {
45}
46
47void MockQuotaManager::GetUsageAndQuota(
48    const GURL& origin,
49    storage::StorageType type,
50    const GetUsageAndQuotaCallback& callback) {
51  StorageInfo& info = usage_and_quota_map_[std::make_pair(origin, type)];
52  callback.Run(storage::kQuotaStatusOk, info.usage, info.quota);
53}
54
55void MockQuotaManager::SetQuota(const GURL& origin, StorageType type,
56                                int64 quota) {
57  usage_and_quota_map_[std::make_pair(origin, type)].quota = quota;
58}
59
60bool MockQuotaManager::AddOrigin(
61    const GURL& origin,
62    StorageType type,
63    int quota_client_mask,
64    base::Time modified) {
65  origins_.push_back(OriginInfo(origin, type, quota_client_mask, modified));
66  return true;
67}
68
69bool MockQuotaManager::OriginHasData(
70    const GURL& origin,
71    StorageType type,
72    QuotaClient::ID quota_client) const {
73  for (std::vector<OriginInfo>::const_iterator current = origins_.begin();
74       current != origins_.end();
75       ++current) {
76    if (current->origin == origin &&
77        current->type == type &&
78        current->quota_client_mask & quota_client)
79      return true;
80  }
81  return false;
82}
83
84void MockQuotaManager::GetOriginsModifiedSince(
85    StorageType type,
86    base::Time modified_since,
87    const GetOriginsCallback& callback) {
88  std::set<GURL>* origins_to_return = new std::set<GURL>();
89  for (std::vector<OriginInfo>::const_iterator current = origins_.begin();
90       current != origins_.end();
91       ++current) {
92    if (current->type == type && current->modified >= modified_since)
93      origins_to_return->insert(current->origin);
94  }
95
96  base::MessageLoop::current()->PostTask(
97      FROM_HERE,
98      base::Bind(&MockQuotaManager::DidGetModifiedSince,
99                 weak_factory_.GetWeakPtr(),
100                 callback,
101                 base::Owned(origins_to_return),
102                 type));
103}
104
105void MockQuotaManager::DeleteOriginData(
106    const GURL& origin,
107    StorageType type,
108    int quota_client_mask,
109    const StatusCallback& callback) {
110  for (std::vector<OriginInfo>::iterator current = origins_.begin();
111       current != origins_.end();
112       ++current) {
113    if (current->origin == origin && current->type == type) {
114      // Modify the mask: if it's 0 after "deletion", remove the origin.
115      current->quota_client_mask &= ~quota_client_mask;
116      if (current->quota_client_mask == 0)
117        origins_.erase(current);
118      break;
119    }
120  }
121
122  base::MessageLoop::current()->PostTask(
123      FROM_HERE,
124      base::Bind(&MockQuotaManager::DidDeleteOriginData,
125                 weak_factory_.GetWeakPtr(),
126                 callback,
127                 kQuotaStatusOk));
128}
129
130MockQuotaManager::~MockQuotaManager() {}
131
132void MockQuotaManager::UpdateUsage(
133    const GURL& origin, StorageType type, int64 delta) {
134  usage_and_quota_map_[std::make_pair(origin, type)].usage += delta;
135}
136
137void MockQuotaManager::DidGetModifiedSince(
138    const GetOriginsCallback& callback,
139    std::set<GURL>* origins,
140    StorageType storage_type) {
141  callback.Run(*origins, storage_type);
142}
143
144void MockQuotaManager::DidDeleteOriginData(
145    const StatusCallback& callback,
146    QuotaStatusCode status) {
147  callback.Run(status);
148}
149
150}  // namespace content
151