1 // Copyright 2013 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.
6 #include "base/run_loop.h"
7 #include "net/base/net_util.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "webkit/browser/quota/mock_special_storage_policy.h"
10 #include "webkit/browser/quota/usage_tracker.h"
16 void DidGetGlobalUsage(bool* done,
18 int64* unlimited_usage_out,
20 int64 unlimited_usage) {
24 *unlimited_usage_out = unlimited_usage;
27 void DidGetUsage(bool* done,
37 class MockQuotaClient : public QuotaClient {
40 virtual ~MockQuotaClient() {}
42 virtual ID id() const OVERRIDE {
46 virtual void OnQuotaManagerDestroyed() OVERRIDE {}
48 virtual void GetOriginUsage(const GURL& origin,
50 const GetUsageCallback& callback) OVERRIDE {
51 EXPECT_EQ(kStorageTypeTemporary, type);
52 int64 usage = GetUsage(origin);
53 base::MessageLoop::current()->PostTask(FROM_HERE,
54 base::Bind(callback, usage));
57 virtual void GetOriginsForType(StorageType type,
58 const GetOriginsCallback& callback) OVERRIDE {
59 EXPECT_EQ(kStorageTypeTemporary, type);
60 std::set<GURL> origins;
61 for (UsageMap::const_iterator itr = usage_map_.begin();
62 itr != usage_map_.end(); ++itr) {
63 origins.insert(itr->first);
65 base::MessageLoop::current()->PostTask(FROM_HERE,
66 base::Bind(callback, origins));
69 virtual void GetOriginsForHost(StorageType type,
70 const std::string& host,
71 const GetOriginsCallback& callback) OVERRIDE {
72 EXPECT_EQ(kStorageTypeTemporary, type);
73 std::set<GURL> origins;
74 for (UsageMap::const_iterator itr = usage_map_.begin();
75 itr != usage_map_.end(); ++itr) {
76 if (net::GetHostOrSpecFromURL(itr->first) == host)
77 origins.insert(itr->first);
79 base::MessageLoop::current()->PostTask(FROM_HERE,
80 base::Bind(callback, origins));
83 virtual void DeleteOriginData(const GURL& origin,
85 const DeletionCallback& callback) OVERRIDE {
86 EXPECT_EQ(kStorageTypeTemporary, type);
87 usage_map_.erase(origin);
88 base::MessageLoop::current()->PostTask(
89 FROM_HERE, base::Bind(callback, kQuotaStatusOk));
92 virtual bool DoesSupport(quota::StorageType type) const OVERRIDE {
93 return type == quota::kStorageTypeTemporary;
96 int64 GetUsage(const GURL& origin) {
97 UsageMap::const_iterator found = usage_map_.find(origin);
98 if (found == usage_map_.end())
100 return found->second;
103 void SetUsage(const GURL& origin, int64 usage) {
104 usage_map_[origin] = usage;
107 int64 UpdateUsage(const GURL& origin, int64 delta) {
108 return usage_map_[origin] += delta;
112 typedef std::map<GURL, int64> UsageMap;
116 DISALLOW_COPY_AND_ASSIGN(MockQuotaClient);
119 class UsageTrackerTest : public testing::Test {
122 : storage_policy_(new MockSpecialStoragePolicy()),
123 usage_tracker_(GetUsageTrackerList(), kStorageTypeTemporary,
124 storage_policy_.get()) {
127 virtual ~UsageTrackerTest() {}
129 UsageTracker* usage_tracker() {
130 return &usage_tracker_;
133 void UpdateUsage(const GURL& origin, int64 delta) {
134 quota_client_.UpdateUsage(origin, delta);
135 usage_tracker_.UpdateUsageCache(quota_client_.id(), origin, delta);
136 base::RunLoop().RunUntilIdle();
139 void UpdateUsageWithoutNotification(const GURL& origin, int64 delta) {
140 quota_client_.UpdateUsage(origin, delta);
143 void GetGlobalLimitedUsage(int64* limited_usage) {
145 usage_tracker_.GetGlobalLimitedUsage(base::Bind(
146 &DidGetUsage, &done, limited_usage));
147 base::RunLoop().RunUntilIdle();
152 void GetGlobalUsage(int64* usage, int64* unlimited_usage) {
154 usage_tracker_.GetGlobalUsage(base::Bind(
156 &done, usage, unlimited_usage));
157 base::RunLoop().RunUntilIdle();
162 void GetHostUsage(const std::string& host, int64* usage) {
164 usage_tracker_.GetHostUsage(host, base::Bind(&DidGetUsage, &done, usage));
165 base::RunLoop().RunUntilIdle();
170 void GrantUnlimitedStoragePolicy(const GURL& origin) {
171 if (!storage_policy_->IsStorageUnlimited(origin)) {
172 storage_policy_->AddUnlimited(origin);
173 storage_policy_->NotifyGranted(
174 origin, SpecialStoragePolicy::STORAGE_UNLIMITED);
178 void RevokeUnlimitedStoragePolicy(const GURL& origin) {
179 if (storage_policy_->IsStorageUnlimited(origin)) {
180 storage_policy_->RemoveUnlimited(origin);
181 storage_policy_->NotifyRevoked(
182 origin, SpecialStoragePolicy::STORAGE_UNLIMITED);
186 void SetUsageCacheEnabled(const GURL& origin, bool enabled) {
187 usage_tracker_.SetUsageCacheEnabled(
188 quota_client_.id(), origin, enabled);
192 QuotaClientList GetUsageTrackerList() {
193 QuotaClientList client_list;
194 client_list.push_back("a_client_);
198 base::MessageLoop message_loop_;
200 scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
201 MockQuotaClient quota_client_;
202 UsageTracker usage_tracker_;
204 DISALLOW_COPY_AND_ASSIGN(UsageTrackerTest);
207 TEST_F(UsageTrackerTest, GrantAndRevokeUnlimitedStorage) {
209 int64 unlimited_usage = 0;
210 int64 host_usage = 0;
211 GetGlobalUsage(&usage, &unlimited_usage);
213 EXPECT_EQ(0, unlimited_usage);
215 const GURL origin("http://example.com");
216 const std::string host(net::GetHostOrSpecFromURL(origin));
218 UpdateUsage(origin, 100);
219 GetGlobalUsage(&usage, &unlimited_usage);
220 GetHostUsage(host, &host_usage);
221 EXPECT_EQ(100, usage);
222 EXPECT_EQ(0, unlimited_usage);
223 EXPECT_EQ(100, host_usage);
225 GrantUnlimitedStoragePolicy(origin);
226 GetGlobalUsage(&usage, &unlimited_usage);
227 GetHostUsage(host, &host_usage);
228 EXPECT_EQ(100, usage);
229 EXPECT_EQ(100, unlimited_usage);
230 EXPECT_EQ(100, host_usage);
232 RevokeUnlimitedStoragePolicy(origin);
233 GetGlobalUsage(&usage, &unlimited_usage);
234 GetHostUsage(host, &host_usage);
235 EXPECT_EQ(100, usage);
236 EXPECT_EQ(0, unlimited_usage);
237 EXPECT_EQ(100, host_usage);
240 TEST_F(UsageTrackerTest, CacheDisabledClientTest) {
242 int64 unlimited_usage = 0;
243 int64 host_usage = 0;
245 const GURL origin("http://example.com");
246 const std::string host(net::GetHostOrSpecFromURL(origin));
248 UpdateUsage(origin, 100);
249 GetGlobalUsage(&usage, &unlimited_usage);
250 GetHostUsage(host, &host_usage);
251 EXPECT_EQ(100, usage);
252 EXPECT_EQ(0, unlimited_usage);
253 EXPECT_EQ(100, host_usage);
255 UpdateUsageWithoutNotification(origin, 100);
256 GetGlobalUsage(&usage, &unlimited_usage);
257 GetHostUsage(host, &host_usage);
258 EXPECT_EQ(100, usage);
259 EXPECT_EQ(0, unlimited_usage);
260 EXPECT_EQ(100, host_usage);
262 GrantUnlimitedStoragePolicy(origin);
263 UpdateUsageWithoutNotification(origin, 100);
264 SetUsageCacheEnabled(origin, false);
265 UpdateUsageWithoutNotification(origin, 100);
267 GetGlobalUsage(&usage, &unlimited_usage);
268 GetHostUsage(host, &host_usage);
269 EXPECT_EQ(400, usage);
270 EXPECT_EQ(400, unlimited_usage);
271 EXPECT_EQ(400, host_usage);
273 RevokeUnlimitedStoragePolicy(origin);
274 GetGlobalUsage(&usage, &unlimited_usage);
275 GetHostUsage(host, &host_usage);
276 EXPECT_EQ(400, usage);
277 EXPECT_EQ(0, unlimited_usage);
278 EXPECT_EQ(400, host_usage);
280 SetUsageCacheEnabled(origin, true);
281 UpdateUsage(origin, 100);
283 GetGlobalUsage(&usage, &unlimited_usage);
284 GetHostUsage(host, &host_usage);
285 EXPECT_EQ(500, usage);
286 EXPECT_EQ(0, unlimited_usage);
287 EXPECT_EQ(500, host_usage);
290 TEST_F(UsageTrackerTest, LimitedGlobalUsageTest) {
291 const GURL kNormal("http://normal");
292 const GURL kUnlimited("http://unlimited");
293 const GURL kNonCached("http://non_cached");
294 const GURL kNonCachedUnlimited("http://non_cached-unlimited");
296 GrantUnlimitedStoragePolicy(kUnlimited);
297 GrantUnlimitedStoragePolicy(kNonCachedUnlimited);
299 SetUsageCacheEnabled(kNonCached, false);
300 SetUsageCacheEnabled(kNonCachedUnlimited, false);
302 UpdateUsageWithoutNotification(kNormal, 1);
303 UpdateUsageWithoutNotification(kUnlimited, 2);
304 UpdateUsageWithoutNotification(kNonCached, 4);
305 UpdateUsageWithoutNotification(kNonCachedUnlimited, 8);
307 int64 limited_usage = 0;
308 int64 total_usage = 0;
309 int64 unlimited_usage = 0;
311 GetGlobalLimitedUsage(&limited_usage);
312 GetGlobalUsage(&total_usage, &unlimited_usage);
313 EXPECT_EQ(1 + 4, limited_usage);
314 EXPECT_EQ(1 + 2 + 4 + 8, total_usage);
315 EXPECT_EQ(2 + 8, unlimited_usage);
317 UpdateUsageWithoutNotification(kNonCached, 16 - 4);
318 UpdateUsageWithoutNotification(kNonCachedUnlimited, 32 - 8);
320 GetGlobalLimitedUsage(&limited_usage);
321 GetGlobalUsage(&total_usage, &unlimited_usage);
322 EXPECT_EQ(1 + 16, limited_usage);
323 EXPECT_EQ(1 + 2 + 16 + 32, total_usage);
324 EXPECT_EQ(2 + 32, unlimited_usage);