browsing_data_quota_helper_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/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"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/quota/mock_storage_client.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/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(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false, dir_.path(),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = new BrowsingDataQuotaHelperImpl(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota_manager_);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = NULL;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = NULL;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_.clear();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MessageLoop::current()->RunUntilIdle();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuotaInfoArray& quota_info() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_info_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed() const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fetching_completed_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFetching() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = false;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->StartFetching(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::FetchCompleted,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterClient(const quota::MockOriginData* data, std::size_t data_len) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::MockStorageClient* client =
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new quota::MockStorageClient(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            quota_manager_->proxy(), data, quota::QuotaClient::kFileSystem,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            data_len);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->proxy()->RegisterClient(client);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->TouchAllOriginsAndNotify();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPersistentHostQuota(const std::string& host, int64 quota) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->SetPersistentHostQuota(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, quota,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPersistentHostQuota(const std::string& host) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetPersistentHostQuota(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GotPersistentHostQuota(quota::QuotaStatusCode status,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 quota) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::kQuotaStatusOk, status);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeHostQuota(const std::string& host) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->RevokeHostQuota(host);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FetchCompleted(const QuotaInfoArray& quota_info) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_ = quota_info;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = true;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<quota::QuotaManager> quota_manager_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir dir_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BrowsingDataQuotaHelper> helper_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaInfoArray quota_info_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BrowsingDataQuotaHelperTest> weak_factory_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowsingDataQuotaHelperTest);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, Empty) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_info().empty());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, FetchData) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, IgnoreExtensionsAndDevTools) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, RevokeHostQuota) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost1("example1.com");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost2("example2.com");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost1, 1);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost2, 10);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RevokeHostQuota(kHost1);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost1);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost2);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, quota());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
209