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("a_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