10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h"
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/mock_special_storage_policy.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/net_util.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/usage_tracker.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::kQuotaStatusOk;
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::kStorageTypeTemporary;
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::QuotaClient;
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::QuotaClientList;
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::SpecialStoragePolicy;
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::StorageType;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing quota::UsageTracker;
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace content {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DidGetGlobalUsage(bool* done,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       int64* usage_out,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       int64* unlimited_usage_out,
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       int64 usage,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       int64 unlimited_usage) {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(*done);
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *done = true;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *usage_out = usage;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *unlimited_usage_out = unlimited_usage;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DidGetUsage(bool* done,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 int64* usage_out,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 int64 usage) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(*done);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *done = true;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *usage_out = usage;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockQuotaClient : public QuotaClient {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockQuotaClient() {}
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~MockQuotaClient() {}
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ID id() const OVERRIDE {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return kFileSystem;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnQuotaManagerDestroyed() OVERRIDE {}
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetOriginUsage(const GURL& origin,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              StorageType type,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const GetUsageCallback& callback) OVERRIDE {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kStorageTypeTemporary, type);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int64 usage = GetUsage(origin);
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                           base::Bind(callback, usage));
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetOriginsForType(StorageType type,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GetOriginsCallback& callback) OVERRIDE {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kStorageTypeTemporary, type);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::set<GURL> origins;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (UsageMap::const_iterator itr = usage_map_.begin();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         itr != usage_map_.end(); ++itr) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      origins.insert(itr->first);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                           base::Bind(callback, origins));
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void GetOriginsForHost(StorageType type,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& host,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GetOriginsCallback& callback) OVERRIDE {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kStorageTypeTemporary, type);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::set<GURL> origins;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (UsageMap::const_iterator itr = usage_map_.begin();
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         itr != usage_map_.end(); ++itr) {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (net::GetHostOrSpecFromURL(itr->first) == host)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        origins.insert(itr->first);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                           base::Bind(callback, origins));
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DeleteOriginData(const GURL& origin,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                StorageType type,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const DeletionCallback& callback) OVERRIDE {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kStorageTypeTemporary, type);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_map_.erase(origin);
96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE, base::Bind(callback, kQuotaStatusOk));
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool DoesSupport(quota::StorageType type) const OVERRIDE {
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return type == quota::kStorageTypeTemporary;
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 GetUsage(const GURL& origin) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    UsageMap::const_iterator found = usage_map_.find(origin);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (found == usage_map_.end())
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 0;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return found->second;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUsage(const GURL& origin, int64 usage) {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_map_[origin] = usage;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 UpdateUsage(const GURL& origin, int64 delta) {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return usage_map_[origin] += delta;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<GURL, int64> UsageMap;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UsageMap usage_map_;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockQuotaClient);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class UsageTrackerTest : public testing::Test {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UsageTrackerTest()
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : storage_policy_(new MockSpecialStoragePolicy()),
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        usage_tracker_(GetUsageTrackerList(), kStorageTypeTemporary,
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       storage_policy_.get(), NULL) {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~UsageTrackerTest() {}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UsageTracker* usage_tracker() {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return &usage_tracker_;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UpdateUsage(const GURL& origin, int64 delta) {
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_client_.UpdateUsage(origin, delta);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_tracker_.UpdateUsageCache(quota_client_.id(), origin, delta);
144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UpdateUsageWithoutNotification(const GURL& origin, int64 delta) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_client_.UpdateUsage(origin, delta);
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void GetGlobalLimitedUsage(int64* limited_usage) {
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool done = false;
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    usage_tracker_.GetGlobalLimitedUsage(base::Bind(
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        &DidGetUsage, &done, limited_usage));
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(done);
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetGlobalUsage(int64* usage, int64* unlimited_usage) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool done = false;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_tracker_.GetGlobalUsage(base::Bind(
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &DidGetGlobalUsage,
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        &done, usage, unlimited_usage));
165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(done);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetHostUsage(const std::string& host, int64* usage) {
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool done = false;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_tracker_.GetHostUsage(host, base::Bind(&DidGetUsage, &done, usage));
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(done);
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GrantUnlimitedStoragePolicy(const GURL& origin) {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!storage_policy_->IsStorageUnlimited(origin)) {
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      storage_policy_->AddUnlimited(origin);
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      storage_policy_->NotifyGranted(
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          origin, SpecialStoragePolicy::STORAGE_UNLIMITED);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RevokeUnlimitedStoragePolicy(const GURL& origin) {
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (storage_policy_->IsStorageUnlimited(origin)) {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      storage_policy_->RemoveUnlimited(origin);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      storage_policy_->NotifyRevoked(
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          origin, SpecialStoragePolicy::STORAGE_UNLIMITED);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUsageCacheEnabled(const GURL& origin, bool enabled) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_tracker_.SetUsageCacheEnabled(
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        quota_client_.id(), origin, enabled);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuotaClientList GetUsageTrackerList() {
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuotaClientList client_list;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_list.push_back(&quota_client_);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return client_list;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop message_loop_;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockQuotaClient quota_client_;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UsageTracker usage_tracker_;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UsageTrackerTest);
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UsageTrackerTest, GrantAndRevokeUnlimitedStorage) {
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 usage = 0;
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 unlimited_usage = 0;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 host_usage = 0;
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage);
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL origin("http://example.com");
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string host(net::GetHostOrSpecFromURL(origin));
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsage(origin, 100);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, usage);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, host_usage);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GrantUnlimitedStoragePolicy(origin);
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, usage);
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, unlimited_usage);
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, host_usage);
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RevokeUnlimitedStoragePolicy(origin);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, usage);
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, host_usage);
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UsageTrackerTest, CacheDisabledClientTest) {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 usage = 0;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 unlimited_usage = 0;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 host_usage = 0;
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL origin("http://example.com");
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string host(net::GetHostOrSpecFromURL(origin));
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsage(origin, 100);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, usage);
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, host_usage);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsageWithoutNotification(origin, 100);
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, usage);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(100, host_usage);
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GrantUnlimitedStoragePolicy(origin);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsageWithoutNotification(origin, 100);
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetUsageCacheEnabled(origin, false);
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsageWithoutNotification(origin, 100);
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(400, usage);
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(400, unlimited_usage);
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(400, host_usage);
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RevokeUnlimitedStoragePolicy(origin);
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(400, usage);
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(400, host_usage);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetUsageCacheEnabled(origin, true);
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateUsage(origin, 100);
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetGlobalUsage(&usage, &unlimited_usage);
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetHostUsage(host, &host_usage);
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(500, usage);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, unlimited_usage);
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(500, host_usage);
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(UsageTrackerTest, LimitedGlobalUsageTest) {
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kNormal("http://normal");
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kUnlimited("http://unlimited");
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kNonCached("http://non_cached");
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kNonCachedUnlimited("http://non_cached-unlimited");
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GrantUnlimitedStoragePolicy(kUnlimited);
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GrantUnlimitedStoragePolicy(kNonCachedUnlimited);
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUsageCacheEnabled(kNonCached, false);
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetUsageCacheEnabled(kNonCachedUnlimited, false);
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kNormal, 1);
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kUnlimited, 2);
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kNonCached, 4);
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kNonCachedUnlimited, 8);
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 limited_usage = 0;
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 total_usage = 0;
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 unlimited_usage = 0;
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetGlobalLimitedUsage(&limited_usage);
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetGlobalUsage(&total_usage, &unlimited_usage);
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1 + 4, limited_usage);
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1 + 2 + 4 + 8, total_usage);
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2 + 8, unlimited_usage);
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kNonCached, 16 - 4);
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateUsageWithoutNotification(kNonCachedUnlimited, 32 - 8);
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetGlobalLimitedUsage(&limited_usage);
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetGlobalUsage(&total_usage, &unlimited_usage);
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1 + 16, limited_usage);
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1 + 2 + 16 + 32, total_usage);
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2 + 32, unlimited_usage);
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace content
337