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.
5 #include "content/public/test/mock_storage_client.h"
7 #include "base/basictypes.h"
9 #include "base/location.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/singleton.h"
12 #include "base/single_thread_task_runner.h"
13 #include "base/stl_util.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "net/base/net_util.h"
16 #include "storage/browser/quota/quota_manager_proxy.h"
18 using storage::kQuotaErrorInvalidModification
;
19 using storage::kQuotaStatusOk
;
25 MockStorageClient::MockStorageClient(
26 QuotaManagerProxy
* quota_manager_proxy
,
27 const MockOriginData
* mock_data
, QuotaClient::ID id
, size_t mock_data_size
)
28 : quota_manager_proxy_(quota_manager_proxy
),
30 mock_time_counter_(0),
32 Populate(mock_data
, mock_data_size
);
35 void MockStorageClient::Populate(
36 const MockOriginData
* mock_data
,
37 size_t mock_data_size
) {
38 for (size_t i
= 0; i
< mock_data_size
; ++i
) {
39 origin_data_
[make_pair(GURL(mock_data
[i
].origin
), mock_data
[i
].type
)] =
44 MockStorageClient::~MockStorageClient() {}
46 void MockStorageClient::AddOriginAndNotify(
47 const GURL
& origin_url
, StorageType type
, int64 size
) {
48 DCHECK(origin_data_
.find(make_pair(origin_url
, type
)) == origin_data_
.end());
50 origin_data_
[make_pair(origin_url
, type
)] = size
;
51 quota_manager_proxy_
->quota_manager()->NotifyStorageModifiedInternal(
52 id(), origin_url
, type
, size
, IncrementMockTime());
55 void MockStorageClient::ModifyOriginAndNotify(
56 const GURL
& origin_url
, StorageType type
, int64 delta
) {
57 OriginDataMap::iterator find
= origin_data_
.find(make_pair(origin_url
, type
));
58 DCHECK(find
!= origin_data_
.end());
59 find
->second
+= delta
;
60 DCHECK_GE(find
->second
, 0);
62 // TODO(tzik): Check quota to prevent usage exceed
63 quota_manager_proxy_
->quota_manager()->NotifyStorageModifiedInternal(
64 id(), origin_url
, type
, delta
, IncrementMockTime());
67 void MockStorageClient::TouchAllOriginsAndNotify() {
68 for (OriginDataMap::const_iterator itr
= origin_data_
.begin();
69 itr
!= origin_data_
.end();
71 quota_manager_proxy_
->quota_manager()->NotifyStorageModifiedInternal(
72 id(), itr
->first
.first
, itr
->first
.second
, 0, IncrementMockTime());
76 void MockStorageClient::AddOriginToErrorSet(
77 const GURL
& origin_url
, StorageType type
) {
78 error_origins_
.insert(make_pair(origin_url
, type
));
81 base::Time
MockStorageClient::IncrementMockTime() {
83 return base::Time::FromDoubleT(mock_time_counter_
* 10.0);
86 QuotaClient::ID
MockStorageClient::id() const {
90 void MockStorageClient::OnQuotaManagerDestroyed() {
94 void MockStorageClient::GetOriginUsage(const GURL
& origin_url
,
96 const GetUsageCallback
& callback
) {
97 base::ThreadTaskRunnerHandle::Get()->PostTask(
99 base::Bind(&MockStorageClient::RunGetOriginUsage
,
100 weak_factory_
.GetWeakPtr(), origin_url
, type
, callback
));
103 void MockStorageClient::GetOriginsForType(
104 StorageType type
, const GetOriginsCallback
& callback
) {
105 base::ThreadTaskRunnerHandle::Get()->PostTask(
106 FROM_HERE
, base::Bind(&MockStorageClient::RunGetOriginsForType
,
107 weak_factory_
.GetWeakPtr(), type
, callback
));
110 void MockStorageClient::GetOriginsForHost(
111 StorageType type
, const std::string
& host
,
112 const GetOriginsCallback
& callback
) {
113 base::ThreadTaskRunnerHandle::Get()->PostTask(
114 FROM_HERE
, base::Bind(&MockStorageClient::RunGetOriginsForHost
,
115 weak_factory_
.GetWeakPtr(), type
, host
, callback
));
118 void MockStorageClient::DeleteOriginData(
119 const GURL
& origin
, StorageType type
,
120 const DeletionCallback
& callback
) {
121 base::ThreadTaskRunnerHandle::Get()->PostTask(
123 base::Bind(&MockStorageClient::RunDeleteOriginData
,
124 weak_factory_
.GetWeakPtr(), origin
, type
, callback
));
127 bool MockStorageClient::DoesSupport(storage::StorageType type
) const {
131 void MockStorageClient::RunGetOriginUsage(
132 const GURL
& origin_url
, StorageType type
,
133 const GetUsageCallback
& callback
) {
134 OriginDataMap::iterator find
= origin_data_
.find(make_pair(origin_url
, type
));
135 if (find
== origin_data_
.end()) {
138 callback
.Run(find
->second
);
142 void MockStorageClient::RunGetOriginsForType(
143 StorageType type
, const GetOriginsCallback
& callback
) {
144 std::set
<GURL
> origins
;
145 for (OriginDataMap::iterator iter
= origin_data_
.begin();
146 iter
!= origin_data_
.end(); ++iter
) {
147 if (type
== iter
->first
.second
)
148 origins
.insert(iter
->first
.first
);
150 callback
.Run(origins
);
153 void MockStorageClient::RunGetOriginsForHost(
154 StorageType type
, const std::string
& host
,
155 const GetOriginsCallback
& callback
) {
156 std::set
<GURL
> origins
;
157 for (OriginDataMap::iterator iter
= origin_data_
.begin();
158 iter
!= origin_data_
.end(); ++iter
) {
159 std::string host_or_spec
= net::GetHostOrSpecFromURL(iter
->first
.first
);
160 if (type
== iter
->first
.second
&& host
== host_or_spec
)
161 origins
.insert(iter
->first
.first
);
163 callback
.Run(origins
);
166 void MockStorageClient::RunDeleteOriginData(
167 const GURL
& origin_url
,
169 const DeletionCallback
& callback
) {
170 ErrorOriginSet::iterator itr_error
=
171 error_origins_
.find(make_pair(origin_url
, type
));
172 if (itr_error
!= error_origins_
.end()) {
173 callback
.Run(kQuotaErrorInvalidModification
);
177 OriginDataMap::iterator itr
=
178 origin_data_
.find(make_pair(origin_url
, type
));
179 if (itr
!= origin_data_
.end()) {
180 int64 delta
= itr
->second
;
181 quota_manager_proxy_
->
182 NotifyStorageModified(id(), origin_url
, type
, -delta
);
183 origin_data_
.erase(itr
);
186 callback
.Run(kQuotaStatusOk
);
189 } // namespace content