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"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_quota_helper_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_browser_thread_bundle.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()
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : fetching_completed_(true),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota_(-1),
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        weak_factory_(this) {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowsingDataQuotaHelperTest() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dir_.CreateUniqueTempDir());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = new quota::QuotaManager(
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        false,
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        dir_.path(),
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = new BrowsingDataQuotaHelperImpl(
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(),
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        quota_manager_.get());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_ = NULL;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_.clear();
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuotaInfoArray& quota_info() const {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_info_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed() const {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fetching_completed_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFetching() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = false;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->StartFetching(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::FetchCompleted,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterClient(const quota::MockOriginData* data, std::size_t data_len) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::MockStorageClient* client =
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new quota::MockStorageClient(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            quota_manager_->proxy(), data, quota::QuotaClient::kFileSystem,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            data_len);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->proxy()->RegisterClient(client);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->TouchAllOriginsAndNotify();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPersistentHostQuota(const std::string& host, int64 quota) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->SetPersistentHostQuota(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host, quota,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPersistentHostQuota(const std::string& host) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = -1;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetPersistentHostQuota(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataQuotaHelperTest::GotPersistentHostQuota,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GotPersistentHostQuota(quota::QuotaStatusCode status,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int64 quota) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(quota::kQuotaStatusOk, status);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_ = quota;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeHostQuota(const std::string& host) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->RevokeHostQuota(host);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FetchCompleted(const QuotaInfoArray& quota_info) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_info_ = quota_info;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetching_completed_ = true;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<quota::QuotaManager> quota_manager_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir dir_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BrowsingDataQuotaHelper> helper_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fetching_completed_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaInfoArray quota_info_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BrowsingDataQuotaHelperTest> weak_factory_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowsingDataQuotaHelperTest);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, Empty) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(quota_info().empty());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, FetchData) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, IgnoreExtensionsAndDevTools) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const quota::MockOriginData kOrigins[] = {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypeTemporary, 1},
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"https://example.com/", quota::kStorageTypeTemporary, 10},
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example.com/", quota::kStorageTypePersistent, 100},
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {"https://example.com/", quota::kStorageTypeSyncable, 1},
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://example2.com/", quota::kStorageTypeTemporary, 1000},
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-extension://abcdefghijklmnopqrstuvwxyz/",
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypeTemporary, 10000},
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"chrome-devtools://abcdefghijklmnopqrstuvwxyz/",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, 100000},
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterClient(kOrigins, arraysize(kOrigins));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartFetching();
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fetching_completed());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<QuotaInfo> expected, actual;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual.insert(quota_info().begin(), quota_info().end());
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example.com", 11, 100, 1));
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.insert(QuotaInfo("example2.com", 1000, 0, 0));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected == actual);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BrowsingDataQuotaHelperTest, RevokeHostQuota) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost1("example1.com");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kHost2("example2.com");
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost1, 1);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPersistentHostQuota(kHost2, 10);
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RevokeHostQuota(kHost1);
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost1);
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, quota());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPersistentHostQuota(kHost2);
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, quota());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
204