browsing_data_quota_helper_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_quota_helper_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/mock_storage_client.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowsingDataQuotaHelperTest : public testing::Test {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef BrowsingDataQuotaHelper::QuotaInfo QuotaInfo;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef BrowsingDataQuotaHelper::QuotaInfoArray QuotaInfoArray;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataQuotaHelperTest()
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB, &message_loop_),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO, &message_loop_),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fetching_completed_(true),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota_(-1),
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        weak_factory_(this) {}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowsingDataQuotaHelperTest() {}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dir_.CreateUniqueTempDir());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = new quota::QuotaManager(
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        false,
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        dir_.path(),
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = new BrowsingDataQuotaHelperImpl(
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(),
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        quota_manager_.get());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = NULL;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = NULL;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_.clear();
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuotaInfoArray& quota_info() const {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_info_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed() const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fetching_completed_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFetching() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->StartFetching(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::FetchCompleted,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterClient(const quota::MockOriginData* data, std::size_t data_len) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::MockStorageClient* client =
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new quota::MockStorageClient(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            quota_manager_->proxy(), data, quota::QuotaClient::kFileSystem,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            data_len);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->proxy()->RegisterClient(client);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->TouchAllOriginsAndNotify();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPersistentHostQuota(const std::string& host, int64 quota) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->SetPersistentHostQuota(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, quota,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPersistentHostQuota(const std::string& host) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetPersistentHostQuota(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GotPersistentHostQuota(quota::QuotaStatusCode status,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 quota) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::kQuotaStatusOk, status);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeHostQuota(const std::string& host) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->RevokeHostQuota(host);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota() {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FetchCompleted(const QuotaInfoArray& quota_info) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_ = quota_info;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<quota::QuotaManager> quota_manager_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir dir_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BrowsingDataQuotaHelper> helper_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaInfoArray quota_info_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BrowsingDataQuotaHelperTest> weak_factory_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowsingDataQuotaHelperTest);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, Empty) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_info().empty());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, FetchData) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, IgnoreExtensionsAndDevTools) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, RevokeHostQuota) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost1("example1.com");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost2("example2.com");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost1, 1);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost2, 10);
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RevokeHostQuota(kHost1);
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost1);
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost2);
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, quota());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
210