10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/mock_special_storage_policy.h"
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/mock_storage_client.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_database.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager_proxy.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::MessageLoopProxy;
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kQuotaErrorAbort;
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kQuotaErrorInvalidModification;
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kQuotaErrorNotSupported;
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kQuotaStatusOk;
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kQuotaStatusUnknown;
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kStorageTypePersistent;
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kStorageTypeSyncable;
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kStorageTypeTemporary;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kStorageTypeUnknown;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaClient;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaManager;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaStatusCode;
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::StorageType;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::UsageAndQuota;
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::UsageInfo;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::UsageInfoEntries;
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace content {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For shorter names.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StorageType kTemp = kStorageTypeTemporary;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StorageType kPerm = kStorageTypePersistent;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StorageType kSync = kStorageTypeSyncable;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kAllClients = QuotaClient::kAllClientsMask;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int64 kAvailableSpaceForApp = 13377331U;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int64 kMinimumPreserveForSystem = QuotaManager::kMinimumPreserveForSystem;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kPerHostTemporaryPortion = QuotaManager::kPerHostTemporaryPortion;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a deterministic value for the amount of available disk space.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 GetAvailableDiskSpaceForTest(const base::FilePath&) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return kAvailableSpaceForApp + kMinimumPreserveForSystem;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaManagerTest : public testing::Test {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaManager::QuotaTableEntry QuotaTableEntry;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaManager::QuotaTableEntries QuotaTableEntries;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaManager::OriginInfoTableEntries OriginInfoTableEntries;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaManagerTest()
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : mock_time_counter_(0),
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        weak_factory_(this) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_special_storage_policy_ = new MockSpecialStoragePolicy;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ResetQuotaManager(false /* is_incognito */);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TearDown() {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure the quota manager cleans up correctly.
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_manager_ = NULL;
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetQuotaManager(bool is_incognito) {
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    quota_manager_ = new QuotaManager(is_incognito,
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      data_dir_.path(),
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      MessageLoopProxy::current().get(),
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      MessageLoopProxy::current().get(),
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      mock_special_storage_policy_.get());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't (automatically) start the eviction for testing.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->eviction_disabled_ = true;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't query the hard disk for remaining capacity.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->get_disk_space_fn_ = &GetAvailableDiskSpaceForTest;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    additional_callback_count_ = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* CreateClient(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MockOriginData* mock_data,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t mock_data_size,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::ID id) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new MockStorageClient(quota_manager_->proxy(),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 mock_data, id, mock_data_size);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterClient(MockStorageClient* client) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->proxy()->RegisterClient(client);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetUsageInfo() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_info_.clear();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetUsageInfo(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetUsageInfo,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetUsageAndQuotaForWebApps(const GURL& origin,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StorageType type) {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    usage_ = -1;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_ = -1;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_manager_->GetUsageAndQuotaForWebApps(
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 weak_factory_.GetWeakPtr()));
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetUsageAndQuotaForStorageClient(const GURL& origin,
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        StorageType type) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = -1;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetUsageAndQuota(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 weak_factory_.GetWeakPtr()));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTemporaryGlobalQuota() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetTemporaryGlobalQuota(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetQuota,
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTemporaryGlobalQuota(int64 new_quota) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->SetTemporaryGlobalOverrideQuota(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_quota,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetQuota,
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPersistentHostQuota(const std::string& host) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetPersistentHostQuota(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetHostQuota,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPersistentHostQuota(const std::string& host, int64 new_quota) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->SetPersistentHostQuota(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, new_quota,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetHostQuota,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetGlobalUsage(StorageType type) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = -1;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlimited_usage_ = -1;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetGlobalUsage(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetGlobalUsage,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetHostUsage(const std::string& host, StorageType type) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = -1;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetHostUsage(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, type,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetHostUsage,
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAdditionalUsageAndQuotaTask(const GURL& origin, StorageType type) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetUsageAndQuota(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaAdditional,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteClientOriginData(QuotaClient* client,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const GURL& origin,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              StorageType type) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(client);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->DeleteOriginData(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::StatusCallback,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EvictOriginData(const GURL& origin,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       StorageType type) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->EvictOriginData(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::StatusCallback,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteOriginData(const GURL& origin,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        StorageType type,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int quota_client_mask) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DeleteOriginData(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type, quota_client_mask,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::StatusCallback,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteHostData(const std::string& host,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      StorageType type,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int quota_client_mask) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DeleteHostData(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, type, quota_client_mask,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::StatusCallback,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAvailableSpace() {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    available_space_ = -1;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetAvailableSpace(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetAvailableSpace,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetUsageAndQuotaForEviction() {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = kQuotaStatusUnknown;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = -1;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlimited_usage_ = -1;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    available_space_ = -1;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetUsageAndQuotaForEviction(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaForEviction,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetCachedOrigins(StorageType type, std::set<GURL>* origins) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(origins != NULL);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins->clear();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetCachedOrigins(type, origins);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStorageAccessed(QuotaClient* client,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& origin,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             StorageType type) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(client);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->NotifyStorageAccessedInternal(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        client->id(), origin, type, IncrementMockTime());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteOriginFromDatabase(const GURL& origin, StorageType type) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DeleteOriginFromDatabase(origin, type);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetLRUOrigin(StorageType type) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lru_origin_ = GURL();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetLRUOrigin(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetLRUOrigin,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOriginInUse(const GURL& origin) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->NotifyOriginInUse(origin);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOriginNoLongerInUse(const GURL& origin) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->NotifyOriginNoLongerInUse(origin);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetOriginsModifiedSince(StorageType type, base::Time modified_since) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modified_origins_.clear();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modified_origins_type_ = kStorageTypeUnknown;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetOriginsModifiedSince(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, modified_since,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidGetModifiedOrigins,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DumpQuotaTable() {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_entries_.clear();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DumpQuotaTable(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidDumpQuotaTable,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DumpOriginInfoTable() {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_info_entries_.clear();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DumpOriginInfoTable(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QuotaManagerTest::DidDumpOriginInfoTable,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetUsageInfo(const UsageInfoEntries& entries) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_info_.insert(usage_info_.begin(), entries.begin(), entries.end());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetUsageAndQuota(QuotaStatusCode status, int64 usage, int64 quota) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = usage;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetQuota(QuotaStatusCode status,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int64 quota) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetAvailableSpace(QuotaStatusCode status, int64 available_space) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    available_space_ = available_space;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetHostQuota(QuotaStatusCode status,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int64 quota) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetGlobalUsage(int64 usage,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int64 unlimited_usage) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = usage;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unlimited_usage_ = unlimited_usage;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DidGetHostUsage(int64 usage) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = usage;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StatusCallback(QuotaStatusCode status) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++status_callback_count_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetUsageAndQuotaForEviction(QuotaStatusCode status,
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      const UsageAndQuota& usage_and_quota) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_status_ = status;
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    limited_usage_ = usage_and_quota.global_limited_usage;
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    quota_ = usage_and_quota.quota;
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    available_space_ = usage_and_quota.available_disk_space;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetLRUOrigin(const GURL& origin) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lru_origin_ = origin;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetModifiedOrigins(const std::set<GURL>& origins, StorageType type) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modified_origins_ = origins;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    modified_origins_type_ = type;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidDumpQuotaTable(const QuotaTableEntries& entries) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_entries_ = entries;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidDumpOriginInfoTable(const OriginInfoTableEntries& entries) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_info_entries_ = entries;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetUsage_WithModifyTestBody(const StorageType type);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_additional_callback_count(int c) { additional_callback_count_ = c; }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int additional_callback_count() const { return additional_callback_count_; }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetUsageAndQuotaAdditional(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaStatusCode status, int64 usage, int64 quota) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++additional_callback_count_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaManager* quota_manager() const { return quota_manager_.get(); }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_quota_manager(QuotaManager* quota_manager) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = quota_manager;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSpecialStoragePolicy* mock_special_storage_policy() const {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mock_special_storage_policy_.get();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaStatusCode status() const { return quota_status_; }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const UsageInfoEntries& usage_info() const { return usage_info_; }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage() const { return usage_; }
40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int64 limited_usage() const { return limited_usage_; }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 unlimited_usage() const { return unlimited_usage_; }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota() const { return quota_; }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 available_space() const { return available_space_; }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& lru_origin() const { return lru_origin_; }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<GURL>& modified_origins() const { return modified_origins_; }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType modified_origins_type() const { return modified_origins_type_; }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuotaTableEntries& quota_entries() const { return quota_entries_; }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const OriginInfoTableEntries& origin_info_entries() const {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return origin_info_entries_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_path() const { return data_dir_.path(); }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status_callback_count() const { return status_callback_count_; }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset_status_callback_count() { status_callback_count_ = 0; }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time IncrementMockTime() {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++mock_time_counter_;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::Time::FromDoubleT(mock_time_counter_ * 10.0);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop message_loop_;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir data_dir_;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<QuotaManager> quota_manager_;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockSpecialStoragePolicy> mock_special_storage_policy_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaStatusCode quota_status_;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UsageInfoEntries usage_info_;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage_;
43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int64 limited_usage_;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 unlimited_usage_;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 available_space_;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL lru_origin_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> modified_origins_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StorageType modified_origins_type_;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaTableEntries quota_entries_;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OriginInfoTableEntries origin_info_entries_;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status_callback_count_;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int additional_callback_count_;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mock_time_counter_;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WeakPtrFactory<QuotaManagerTest> weak_factory_;
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuotaManagerTest);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsageInfo) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",       kTemp,  10 },
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",  kTemp,  15 },
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",       kTemp,  20 },
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",       kPerm,  50 },
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com/",      kTemp,  30 },
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com:8081/", kTemp,  35 },
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",       kPerm,  40 },
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://example.com/",   kPerm,  40 },
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUsageInfo();
478d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, usage_info().size());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < usage_info().size(); ++i) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UsageInfo& info = usage_info()[i];
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (info.host == "foo.com" && info.type == kTemp) {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(10 + 15 + 30 + 35, info.usage);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (info.host == "bar.com" && info.type == kTemp) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(20, info.usage);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (info.host == "bar.com" && info.type == kPerm) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(50 + 40, info.usage);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (info.host == "example.com" && info.type == kPerm) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(40, info.usage);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE()
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "Unexpected host, type: " << info.host << ", " << info.type;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsageAndQuota_Simple) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/", kTemp, 10 },
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/", kPerm, 80 },
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(80, usage());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, quota());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_returned_for_foo = quota();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kTemp);
520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(quota_returned_for_foo, quota());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_NoClient) {
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_EmptyClient) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
564d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
569d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_MultiOrigins) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp,  10 },
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kTemp,  20 },
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kTemp,   5 },
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://bar.com/",       kTemp,   7 },
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://baz.com/",        kTemp,  30 },
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm,  40 },
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This time explicitly sets a temporary global quota.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(100);
601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, quota());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int kPerHostQuota = 100 / kPerHostTemporaryPortion;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The host's quota should be its full portion of the global quota
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since global usage is under the global quota.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuota, quota());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kTemp);
617d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5 + 7, usage());
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuota, quota());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_MultipleClients) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://foo.com/",              kTemp, 1 },
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://bar.com/",              kTemp, 2 },
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://bar.com/",              kPerm, 4 },
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://unlimited/",            kPerm, 8 },
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://installed/",            kPerm, 16 },
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "https://foo.com/",             kTemp, 128 },
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://example.com/",          kPerm, 256 },
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://unlimited/",            kTemp, 512 },
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://installed/",            kTemp, 1024 },
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int64 kTempQuotaBase =
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetAvailableDiskSpaceForTest(base::FilePath()) / kPerHostTemporaryPortion;
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1 + 128, usage());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), kPerm);
653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4, usage());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(512, usage());
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::min(kAvailableSpaceForApp, kTempQuotaBase) + usage(), quota());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kPerm);
664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(8, usage());
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAvailableSpace();
670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, available_space());
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://installed/"), kTemp);
675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1024, usage());
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::min(kAvailableSpaceForApp, kTempQuotaBase) + usage(), quota());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://installed/"), kPerm);
681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(16, usage());
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(usage(), quota());  // Over-budget case.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
687d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1 + 2 + 128 + 512 + 1024, usage());
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(512, unlimited_usage());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4 + 8 + 16 + 256, usage());
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(8, unlimited_usage());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaManagerTest::GetUsage_WithModifyTestBody(const StorageType type) {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MockOriginData data[] = {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   type,  10 },
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", type,  20 },
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(data, ARRAYSIZE_UNSAFE(data),
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), type);
709d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://foo.com/"), type, 30);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://foo.com:1/"), type, -5);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->AddOriginAndNotify(GURL("https://foo.com/"), type, 1);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), type);
718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20 + 30 - 5 + 1, usage());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int foo_usage = usage();
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->AddOriginAndNotify(GURL("http://bar.com/"), type, 40);
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://bar.com/"), type);
725d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(40, usage());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(type);
730d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(foo_usage + 40, usage());
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsage_WithModify) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUsage_WithModifyTestBody(kTemp);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_WithAdditionalTasks) {
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp, 10 },
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kTemp, 20 },
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kTemp, 13 },
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm, 40 },
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(100);
749d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPerHostQuota = 100 / QuotaManager::kPerHostTemporaryPortion;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
756d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuota, quota());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_additional_callback_count(0);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 kTemp);
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kTemp);
766d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuota, quota());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, additional_callback_count());
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_NukeManager) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp, 10 },
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kTemp, 20 },
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kTemp, 13 },
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm, 40 },
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(100);
783d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_additional_callback_count(0);
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 kTemp);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"),
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 kTemp);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://bar.com/"), kTemp, kAllClients);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nuke before waiting for callbacks.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_quota_manager(NULL);
797d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaErrorAbort, status());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_Overbudget) {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://usage1/",    kTemp,   1 },
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://usage10/",   kTemp,  10 },
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://usage200/",  kTemp, 200 },
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(100);
810d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPerHostQuota = 100 / QuotaManager::kPerHostTemporaryPortion;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage1/"), kTemp);
815d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, usage());
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, quota());  // should be clamped to our current usage
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
821d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage());
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, quota());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage200/"), kTemp);
827d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, usage());
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuota, quota());  // should be clamped to the nominal quota
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetTemporaryUsageAndQuota_Unlimited) {
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://usage10/",   kTemp,    10 },
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://usage50/",   kTemp,    50 },
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://unlimited/", kTemp,  4000 },
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test when not overbugdet.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(1000);
846d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
849d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 50 + 4000, usage());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4000, unlimited_usage());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPerHostQuotaFor1000 =
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1000 / QuotaManager::kPerHostTemporaryPortion;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
857d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage());
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor1000, quota());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
863d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(50, usage());
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor1000, quota());
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
869d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4000, usage());
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(QuotaManager::kNoLimit, quota());
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test when overbugdet.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(100);
882d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPerHostQuotaFor100 =
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100 / QuotaManager::kPerHostTemporaryPortion;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
888d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage());
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor100, quota());
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
894d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(50, usage());
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor100, quota());
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
900d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4000, usage());
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp + usage(), quota());
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
906d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(QuotaManager::kNoLimit, quota());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Revoke the unlimited rights and make sure the change is noticed.
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_special_storage_policy()->Reset();
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->NotifyCleared();
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
916d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 50 + 4000, usage());
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage10/"), kTemp);
921d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage());
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, quota());  // should be clamped to our current usage
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://usage50/"), kTemp);
927d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(50, usage());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor100, quota());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kTemp);
933d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4000, usage());
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor100, quota());
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kTemp);
939d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4000, usage());
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kPerHostQuotaFor100, quota());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, OriginInUse) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kFooOrigin("http://foo.com/");
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kBarOrigin("http://bar.com/");
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(quota_manager()->IsOriginInUse(kFooOrigin));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginInUse(kFooOrigin);  // count of 1
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginInUse(kFooOrigin);  // count of 2
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginNoLongerInUse(kFooOrigin);  // count of 1
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_manager()->IsOriginInUse(kFooOrigin));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(quota_manager()->IsOriginInUse(kBarOrigin));
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginInUse(kBarOrigin);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_manager()->IsOriginInUse(kBarOrigin));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginNoLongerInUse(kBarOrigin);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(quota_manager()->IsOriginInUse(kBarOrigin));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyOriginNoLongerInUse(kFooOrigin);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(quota_manager()->IsOriginInUse(kFooOrigin));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetAndSetPerststentHostQuota) {
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota("foo.com");
971d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 100);
975d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, quota());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota("foo.com");
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 200);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota("foo.com");
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetPersistentHostQuota("foo.com", QuotaManager::kPerHostPersistentQuotaLimit);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota("foo.com");
983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(QuotaManager::kPerHostPersistentQuotaLimit, quota());
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Persistent quota should be capped at the per-host quota limit.
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetPersistentHostQuota("foo.com",
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         QuotaManager::kPerHostPersistentQuotaLimit + 100);
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetPersistentHostQuota("foo.com");
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(QuotaManager::kPerHostPersistentQuotaLimit, quota());
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetAndSetPersistentUsageAndQuota) {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
998d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 100);
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1005d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage());
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, quota());
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For installed app GetUsageAndQuotaForWebApps returns the capped quota.
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetPersistentHostQuota("installed", kAvailableSpaceForApp + 100);
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://installed/"), kPerm);
1014d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp, quota());
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Ditto for unlimited apps.
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://unlimited/"), kPerm);
1020d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp, quota());
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetUsageAndQuotaForStorageClient should just return 0 usage and
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // kNoLimit quota.
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForStorageClient(GURL("http://unlimited/"), kPerm);
1026d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage());
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(QuotaManager::kNoLimit, quota());
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(QuotaManagerTest, GetSyncableQuota) {
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RegisterClient(CreateClient(NULL, 0, QuotaClient::kFileSystem));
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pre-condition check: available disk space (for testing) is less than
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the default quota for syncable storage.
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(kAvailableSpaceForApp,
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            QuotaManager::kSyncableStorageDefaultHostQuota);
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For installed apps the quota manager should return
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // kAvailableSpaceForApp as syncable quota (because of the pre-condition).
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->GrantQueryDiskSize(GURL("http://installed/"));
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://installed/"), kSync);
1043d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage());
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kAvailableSpaceForApp, quota());
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If it's not installed (which shouldn't happen in real case) it
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // should just return the default host quota for syncable.
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo/"), kSync);
1051d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, usage());
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(QuotaManager::kSyncableStorageDefaultHostQuota, quota());
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_MultiOrigins) {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm, 10 },
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kPerm, 20 },
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com/",       kPerm, 13 },
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com:8081/",  kPerm, 19 },
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kPerm,  5 },
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://bar.com/",       kPerm,  7 },
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://baz.com/",        kPerm, 30 },
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp, 40 },
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 100);
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1073d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20 + 13 + 19, usage());
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, quota());
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetPersistentUsage_WithModify) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUsage_WithModifyTestBody(kPerm);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_WithAdditionalTasks) {
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm,  10 },
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kPerm,  20 },
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kPerm,  13 },
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp,  40 },
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 100);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
1097d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, quota());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_additional_callback_count(0);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"),
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 kPerm);
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kPerm);
1107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10 + 20, usage());
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, additional_callback_count());
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_NukeManager) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kPerm,  10 },
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:8080/",   kPerm,  20 },
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",        kPerm,  13 },
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",        kTemp,  40 },
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("foo.com", 100);
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_additional_callback_count(0);
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://foo.com/"), kPerm);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAdditionalUsageAndQuotaTask(GURL("http://bar.com/"), kPerm);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nuke before waiting for callbacks.
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_quota_manager(NULL);
1131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaErrorAbort, status());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_Simple) {
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,       1 },
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kPerm,      20 },
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,     300 },
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://buz.com/",  kTemp,    4000 },
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://buz.com/",   kTemp,   50000 },
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com:1/", kPerm,  600000 },
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 7000000 },
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
1149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 1 + 20 + 600000);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 1 + 20);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("buz.com", kTemp);
1163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 4000 + 50000);
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_WithModification) {
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,       1 },
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kPerm,      20 },
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,     300 },
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://buz.com/",  kTemp,    4000 },
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://buz.com/",   kTemp,   50000 },
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com:1/", kPerm,  600000 },
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 7000000 },
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
1183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 1 + 20 + 600000);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://foo.com/"), kPerm, 80000000);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kPerm);
1191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 1 + 20 + 600000 + 80000000);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://foo.com/"), kTemp, 1);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 300 + 4000 + 50000 + 7000000 + 1);
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, unlimited_usage());
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("buz.com", kTemp);
1209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 4000 + 50000);
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://buz.com/"), kTemp, 900000000);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("buz.com", kTemp);
1216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(usage(), 4000 + 50000 + 900000000);
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsage_WithDeleteOrigin) {
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,     1 },
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,    20 },
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   300 },
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,  4000 },
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_global_tmp = usage();
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_tmp = usage();
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_pers = usage();
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteClientOriginData(client, GURL("http://foo.com/"),
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         kTemp);
1245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp - 1, usage());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_tmp - 1, usage());
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1257d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_pers, usage());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetAvailableSpaceTest) {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAvailableSpace();
1263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, available_space());
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, EvictOriginData) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,     1 },
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,    20 },
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   300 },
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,  4000 },
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 50000 },
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,  6000 },
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   700 },
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com/",  kTemp,    80 },
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,     9 },
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_global_tmp = usage();
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_tmp = usage();
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_pers = usage();
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData1); ++i)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(kData1[i].origin), kData1[i].type);
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData2); ++i)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(kData2[i].origin), kData2[i].type);
1307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EvictOriginData(GURL("http://foo.com/"), kTemp);
1310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpOriginInfoTable();
1313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(origin_info_entries().begin()),
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                end(origin_info_entries().end());
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr->type == kTemp)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp - (1 + 50000), usage());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_tmp - (1 + 50000), usage());
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_pers, usage());
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, EvictOriginDataWithDeletionError) {
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,       1 },
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,      20 },
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,     300 },
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,    4000 },
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kNumberOfTemporaryOrigins = 3;
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_global_tmp = usage();
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_tmp = usage();
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_pers = usage();
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyStorageAccessed(client, GURL(kData[i].origin), kData[i].type);
1362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->AddOriginToErrorSet(GURL("http://foo.com/"), kTemp);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i < QuotaManager::kThresholdOfErrorsToBeBlacklisted + 1;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EvictOriginData(GURL("http://foo.com/"), kTemp);
1370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kQuotaErrorInvalidModification, status());
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpOriginInfoTable();
1375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool found_origin_in_database = false;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(origin_info_entries().begin()),
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                end(origin_info_entries().end());
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr->type == kTemp &&
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL("http://foo.com/") == itr->origin) {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_origin_in_database = true;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The origin "http://foo.com/" should be in the database.
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found_origin_in_database);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kNumberOfTemporaryOrigins - 1; ++i) {
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetLRUOrigin(kTemp);
1393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(lru_origin().is_empty());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The origin "http://foo.com/" should not be in the LRU list.
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(std::string("http://foo.com/"), lru_origin().spec());
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteOriginFromDatabase(lru_origin(), kTemp);
1398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now the LRU list must be empty.
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lru_origin().is_empty());
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting origins from the database should not affect the results of the
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // following checks.
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp, usage());
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_tmp, usage());
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_pers, usage());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetUsageAndQuotaForEviction) {
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,       1 },
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,      20 },
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,     300 },
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://unlimited/", kTemp,    4000 },
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTemporaryGlobalQuota(10000000);
1435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUsageAndQuotaForEviction();
1438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
144090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(21, limited_usage());
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10000000, quota());
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, available_space());
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteHostDataSimple) {
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,     1 },
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1454d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_global_tmp = usage();
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1458d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_tmp = usage();
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1462d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 predelete_host_pers = usage();
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DeleteHostData(std::string(), kTemp, kAllClients);
1466d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1470d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp, usage());
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1474d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_tmp, usage());
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1478d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_pers, usage());
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, kAllClients);
1482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp - 1, usage());
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_tmp - 1, usage());
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1494d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_host_pers, usage());
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteHostDataMultiple) {
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,     1 },
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,    20 },
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   300 },
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,  4000 },
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 50000 },
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,  6000 },
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   700 },
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com/",  kTemp,    80 },
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,     9 },
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_global_tmp = usage();
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1524d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kTemp);
1528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_bar_tmp = usage();
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1532d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_pers = usage();
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kPerm);
1536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_bar_pers = usage();
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reset_status_callback_count();
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, kAllClients);
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("bar.com", kTemp, kAllClients);
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, kAllClients);
1543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, status_callback_count());
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpOriginInfoTable();
1548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(origin_info_entries().begin()),
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                end(origin_info_entries().end());
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr->type == kTemp) {
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://foo.com:1/"), itr->origin.spec());
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("https://foo.com/"), itr->origin.spec());
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://bar.com/"), itr->origin.spec());
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1564b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(predelete_global_tmp - (1 + 20 + 4000 + 50000 + 6000 + 80 + 9),
1565b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            usage());
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - (1 + 20 + 50000 + 6000 + 80), usage());
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kTemp);
1572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_pers, usage());
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kPerm);
1580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_bar_pers, usage());
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Single-run DeleteOriginData cases must be well covered by
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EvictOriginData tests.
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteOriginDataMultiple) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp,     1 },
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,    20 },
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   300 },
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,  4000 },
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 50000 },
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1/", kTemp,  6000 },
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kPerm,   700 },
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://foo.com/",  kTemp,    80 },
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://bar.com/",   kTemp,     9 },
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1608d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_global_tmp = usage();
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1612d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kTemp);
1616d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_bar_tmp = usage();
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_pers = usage();
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kPerm);
1624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_bar_pers = usage();
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData1); ++i)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(kData1[i].origin), kData1[i].type);
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData2); ++i)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GURL(kData2[i].origin), kData2[i].type);
1633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reset_status_callback_count();
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://bar.com/"), kTemp, kAllClients);
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, kAllClients);
1639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, status_callback_count());
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpOriginInfoTable();
1644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(origin_info_entries().begin()),
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                end(origin_info_entries().end());
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr->type == kTemp) {
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://foo.com/"), itr->origin.spec());
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string("http://bar.com/"), itr->origin.spec());
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_global_tmp - (1 + 4000 + 50000 + 9), usage());
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - (1 + 50000), usage());
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kTemp);
1665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage());
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kPerm);
1669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_pers, usage());
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("bar.com", kPerm);
1673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_bar_pers, usage());
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetCachedOrigins) {
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com/",   kTemp,       1 },
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com:1/", kTemp,      20 },
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://b.com/",   kPerm,     300 },
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://c.com/",   kTemp,    4000 },
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko): Be careful when we add cache pruner.
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins;
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCachedOrigins(kTemp, &origins);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.empty());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No matter how we make queries the quota manager tries to cache all
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the origins at startup.
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("a.com", kTemp);
1697d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCachedOrigins(kTemp, &origins);
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, origins.size());
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("b.com", kTemp);
1702d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCachedOrigins(kTemp, &origins);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, origins.size());
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCachedOrigins(kPerm, &origins);
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.empty());
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetGlobalUsage(kTemp);
1710d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCachedOrigins(kTemp, &origins);
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, origins.size());
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i) {
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kData[i].type == kTemp)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(origins.find(GURL(kData[i].origin)) != origins.end());
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, NotifyAndLRUOrigin) {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com/",   kTemp,  0 },
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com:1/", kTemp,  0 },
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://a.com/",  kTemp,  0 },
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://b.com/",   kPerm,  0 },  // persistent
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://c.com/",   kTemp,  0 },
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin;
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1734d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lru_origin().is_empty());
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://a.com/"), kTemp);
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1739d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://a.com/", lru_origin().spec());
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://b.com/"), kPerm);
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("https://a.com/"), kTemp);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1746d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://a.com/", lru_origin().spec());
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginFromDatabase(lru_origin(), kTemp);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1751d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("https://a.com/", lru_origin().spec());
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginFromDatabase(lru_origin(), kTemp);
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1756d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://c.com/", lru_origin().spec());
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetLRUOriginWithOriginInUse) {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com/",   kTemp,  0 },
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com:1/", kTemp,  0 },
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://a.com/",  kTemp,  0 },
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://b.com/",   kPerm,  0 },  // persistent
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://c.com/",   kTemp,  0 },
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1774d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lru_origin().is_empty());
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://a.com/"), kTemp);
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://b.com/"), kPerm);
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("https://a.com/"), kTemp);
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1783d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://a.com/", lru_origin().spec());
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify origin http://a.com is in use.
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyOriginInUse(GURL("http://a.com/"));
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1789d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("https://a.com/", lru_origin().spec());
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify origin https://a.com is in use while GetLRUOrigin is running.
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyOriginInUse(GURL("https://a.com/"));
1795d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post-filtering must have excluded the returned origin, so we will
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // see empty result here.
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lru_origin().is_empty());
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify access for http://c.com while GetLRUOrigin is running.
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyStorageAccessed(client, GURL("http://c.com/"), kTemp);
1803d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post-filtering must have excluded the returned origin, so we will
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // see empty result here.
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lru_origin().is_empty());
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyOriginNoLongerInUse(GURL("http://a.com/"));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyOriginNoLongerInUse(GURL("https://a.com/"));
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetLRUOrigin(kTemp);
1811d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://a.com/", lru_origin().spec());
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, GetOriginsModifiedSince) {
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData[] = {
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com/",   kTemp,  0 },
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://a.com:1/", kTemp,  0 },
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://a.com/",  kTemp,  0 },
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://b.com/",   kPerm,  0 },  // persistent
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://c.com/",   kTemp,  0 },
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client);
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsModifiedSince(kTemp, base::Time());
1828d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(modified_origins().empty());
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(modified_origins_type(), kTemp);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time1 = client->IncrementMockTime();
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://a.com/"), kTemp, 10);
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://a.com:1/"), kTemp, 10);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://b.com/"), kPerm, 10);
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time2 = client->IncrementMockTime();
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("https://a.com/"), kTemp, 10);
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://c.com/"), kTemp, 10);
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time3 = client->IncrementMockTime();
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsModifiedSince(kTemp, time1);
1842d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, modified_origins().size());
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(modified_origins_type(), kTemp);
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kData); ++i) {
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kData[i].type == kTemp)
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1U, modified_origins().count(GURL(kData[i].origin)));
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsModifiedSince(kTemp, time2);
1851d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, modified_origins().size());
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsModifiedSince(kTemp, time3);
1855d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(modified_origins().empty());
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(modified_origins_type(), kTemp);
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->ModifyOriginAndNotify(GURL("http://a.com/"), kTemp, 10);
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsModifiedSince(kTemp, time3);
1862d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, modified_origins().size());
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, modified_origins().count(GURL("http://a.com/")));
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(modified_origins_type(), kTemp);
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DumpQuotaTable) {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("example1.com", 1);
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("example2.com", 20);
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota("example3.com", 300);
1872d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpQuotaTable();
1875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuotaTableEntry kEntries[] = {
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaTableEntry("example1.com", kPerm, 1),
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaTableEntry("example2.com", kPerm, 20),
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaTableEntry("example3.com", kPerm, 300),
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaTableEntry> entries
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (kEntries, kEntries + ARRAYSIZE_UNSAFE(kEntries));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef QuotaTableEntries::const_iterator iterator;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(quota_entries().begin()), end(quota_entries().end());
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message()
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "host = " << itr->host << ", "
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "quota = " << itr->quota);
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, entries.erase(*itr));
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entries.empty());
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DumpOriginInfoTable) {
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using std::make_pair;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyStorageAccessed(
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kUnknown,
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.com/"),
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTemp);
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyStorageAccessed(
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kUnknown,
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.com/"),
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPerm);
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager()->NotifyStorageAccessed(
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kUnknown,
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.com/"),
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPerm);
1911d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpOriginInfoTable();
1914d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<GURL, StorageType> TypedOrigin;
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<TypedOrigin, int> Entry;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Entry kEntries[] = {
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    make_pair(make_pair(GURL("http://example.com/"), kTemp), 1),
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    make_pair(make_pair(GURL("http://example.com/"), kPerm), 2),
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<Entry> entries
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (kEntries, kEntries + ARRAYSIZE_UNSAFE(kEntries));
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef OriginInfoTableEntries::const_iterator iterator;
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iterator itr(origin_info_entries().begin()),
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                end(origin_info_entries().end());
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != end; ++itr) {
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message()
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "host = " << itr->origin << ", "
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "type = " << itr->type << ", "
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "used_count = " << itr->used_count);
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, entries.erase(
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair(make_pair(itr->origin, itr->type),
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  itr->used_count)));
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entries.empty());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, QuotaForEmptyHost) {
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(std::string());
1942d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(std::string(), 10);
1947d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kQuotaErrorNotSupported, status());
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteSpecificClientTypeSingleOrigin) {
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 1 },
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 2 },
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData3[] = {
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 4 },
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData4[] = {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 8 },
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kAppcache);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kIndexedDatabase);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client3);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client4);
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1978d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kFileSystem);
1982d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1984d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 1, usage());
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kAppcache);
1988d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1990d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp, QuotaClient::kDatabase);
1994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
1996d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 4 - 2 - 1, usage());
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp,
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kIndexedDatabase);
2001d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2003d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteSpecificClientTypeSingleHost) {
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1111/",   kTemp, 1 },
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:2222/",   kTemp, 2 },
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData3[] = {
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:3333/",   kTemp, 4 },
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData4[] = {
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:4444/",   kTemp, 8 },
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kAppcache);
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kIndexedDatabase);
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client3);
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client4);
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2034d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, QuotaClient::kFileSystem);
2038d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2040d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 1, usage());
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, QuotaClient::kAppcache);
2044d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2046d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, QuotaClient::kDatabase);
2050d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2052d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 4 - 2 - 1, usage());
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp, QuotaClient::kIndexedDatabase);
2056d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2058d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteMultipleClientTypesSingleOrigin) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 1 },
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 2 },
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData3[] = {
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 4 },
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData4[] = {
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com/",   kTemp, 8 },
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kAppcache);
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kIndexedDatabase);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client3);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client4);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2089d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp,
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem | QuotaClient::kDatabase);
2094d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2096d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 4 - 1, usage());
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteOriginData(GURL("http://foo.com/"), kTemp,
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kAppcache | QuotaClient::kIndexedDatabase);
2101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuotaManagerTest, DeleteMultipleClientTypesSingleHost) {
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData1[] = {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:1111/",   kTemp, 1 },
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData2[] = {
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:2222/",   kTemp, 2 },
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData3[] = {
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:3333/",   kTemp, 4 },
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MockOriginData kData4[] = {
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://foo.com:4444/",   kTemp, 8 },
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1),
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem);
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2),
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kAppcache);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client3 = CreateClient(kData3, ARRAYSIZE_UNSAFE(kData3),
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase);
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageClient* client4 = CreateClient(kData4, ARRAYSIZE_UNSAFE(kData4),
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kIndexedDatabase);
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client1);
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client2);
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client3);
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(client4);
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 predelete_foo_tmp = usage();
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp,
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kFileSystem | QuotaClient::kAppcache);
2139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage());
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteHostData("foo.com", kTemp,
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaClient::kDatabase | QuotaClient::kIndexedDatabase);
2146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetHostUsage("foo.com", kTemp);
2148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage());
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(QuotaManagerTest, GetUsageAndQuota_Incognito) {
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResetQuotaManager(true);
2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const MockOriginData kData[] = {
2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://foo.com/", kTemp, 10 },
2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "http://foo.com/", kPerm, 80 },
2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RegisterClient(CreateClient(kData, ARRAYSIZE_UNSAFE(kData),
2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      QuotaClient::kFileSystem));
2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
2163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(80, usage());
2166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, quota());
2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetTemporaryGlobalQuota(100);
2169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
2170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(10, usage());
2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(std::min(static_cast<int64>(100 / kPerHostTemporaryPortion),
2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     QuotaManager::kIncognitoDefaultQuotaLimit), quota());
2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_special_storage_policy()->AddUnlimited(GURL("http://foo.com/"));
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
2178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(80, usage());
2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(QuotaManager::kIncognitoDefaultQuotaLimit, quota());
2182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kTemp);
2184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kQuotaStatusOk, status());
2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(10, usage());
2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(QuotaManager::kIncognitoDefaultQuotaLimit, quota());
2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace content
2191