1a02191e04bc25c4935f804f2c080ae28663d096dBen 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_quota_client.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/appcache/mock_appcache_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declared to shorten the line lengths.
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const storage::StorageType kTemp = storage::kStorageTypeTemporary;
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const storage::StorageType kPerm = storage::kStorageTypePersistent;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for our test fixtures.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppCacheQuotaClientTest : public testing::Test {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kOriginA;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kOriginB;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kOriginOther;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClientTest()
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : kOriginA("http://host"),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kOriginB("http://host:8000"),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kOriginOther("http://other"),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        usage_(0),
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        delete_status_(storage::kQuotaStatusUnknown),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_get_origin_usage_completions_(0),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_get_origins_completions_(0),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_delete_origins_completions_(0),
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        weak_factory_(this) {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 GetOriginUsage(storage::QuotaClient* client,
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       const GURL& origin,
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       storage::StorageType type) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = -1;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AsyncGetOriginUsage(client, origin, type);
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return usage_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::set<GURL>& GetOriginsForType(storage::QuotaClient* client,
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          storage::StorageType type) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_.clear();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AsyncGetOriginsForType(client, type);
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return origins_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::set<GURL>& GetOriginsForHost(storage::QuotaClient* client,
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          storage::StorageType type,
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          const std::string& host) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_.clear();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AsyncGetOriginsForHost(client, type, host);
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return origins_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::QuotaStatusCode DeleteOriginData(storage::QuotaClient* client,
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            storage::StorageType type,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            const GURL& origin) {
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    delete_status_ = storage::kQuotaStatusUnknown;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AsyncDeleteOriginData(client, type, origin);
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delete_status_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AsyncGetOriginUsage(storage::QuotaClient* client,
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           const GURL& origin,
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           storage::StorageType type) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->GetOriginUsage(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClientTest::OnGetOriginUsageComplete,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AsyncGetOriginsForType(storage::QuotaClient* client,
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              storage::StorageType type) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->GetOriginsForType(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClientTest::OnGetOriginsComplete,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AsyncGetOriginsForHost(storage::QuotaClient* client,
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              storage::StorageType type,
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              const std::string& host) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->GetOriginsForHost(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, host,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClientTest::OnGetOriginsComplete,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void AsyncDeleteOriginData(storage::QuotaClient* client,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                             storage::StorageType type,
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                             const GURL& origin) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->DeleteOriginData(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClientTest::OnDeleteOriginDataComplete,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUsageMapEntry(const GURL& origin, int64 usage) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_service_.storage()->usage_map_[origin] = usage;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* CreateClient() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AppCacheQuotaClient(&mock_service_);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Call_NotifyAppCacheReady(AppCacheQuotaClient* client) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->NotifyAppCacheReady();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Call_NotifyAppCacheDestroyed(AppCacheQuotaClient* client) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->NotifyAppCacheDestroyed();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Call_OnQuotaManagerDestroyed(AppCacheQuotaClient* client) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client->OnQuotaManagerDestroyed();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetOriginUsageComplete(int64 usage) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++num_get_origin_usage_completions_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ = usage;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnGetOriginsComplete(const std::set<GURL>& origins) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++num_get_origins_completions_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_ = origins;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnDeleteOriginDataComplete(storage::QuotaStatusCode status) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++num_delete_origins_completions_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_status_ = status;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop message_loop_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins_;
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::QuotaStatusCode delete_status_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_get_origin_usage_completions_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_get_origins_completions_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_delete_origins_completions_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAppCacheService mock_service_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<AppCacheQuotaClientTest> weak_factory_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, BasicCreateDestroy) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, EmptyService) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kTemp).empty());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kPerm).empty());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty());
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaStatusOk, DeleteOriginData(client, kTemp, kOriginA));
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaStatusOk, DeleteOriginData(client, kPerm, kOriginA));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, NoService) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kTemp).empty());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kPerm).empty());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty());
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DeleteOriginData(client, kTemp, kOriginA));
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DeleteOriginData(client, kPerm, kOriginA));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, GetOriginUsage) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1000, GetOriginUsage(client, kOriginA, kTemp));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, GetOriginsForHost) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kOriginA.host(), kOriginB.host());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(kOriginA.host(), kOriginOther.host());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins = GetOriginsForHost(client, kTemp, kOriginA.host());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.empty());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginB, 10);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginOther, 500);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins = GetOriginsForHost(client, kTemp, kOriginA.host());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2ul, origins.size());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.find(kOriginA) != origins.end());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.find(kOriginB) != origins.end());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins = GetOriginsForHost(client, kTemp, kOriginOther.host());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1ul, origins.size());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.find(kOriginOther) != origins.end());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins = GetOriginsForHost(client, kPerm, kOriginA.host());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.empty());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, GetOriginsForType) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kTemp).empty());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kPerm).empty());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginB, 10);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins = GetOriginsForType(client, kTemp);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2ul, origins.size());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.find(kOriginA) != origins.end());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins.find(kOriginB) != origins.end());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetOriginsForType(client, kPerm).empty());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, DeleteOriginData) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perm deletions are short circuited in the Client and
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // should not reach the AppCacheServiceImpl.
27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaStatusOk, DeleteOriginData(client, kPerm, kOriginA));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, mock_service_.delete_called_count());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaStatusOk, DeleteOriginData(client, kTemp, kOriginA));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, mock_service_.delete_called_count());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_service_.set_mock_delete_appcaches_for_origin_result(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::ERR_ABORTED);
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DeleteOriginData(client, kTemp, kOriginA));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, mock_service_.delete_called_count());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, PendingRequests) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginB, 10);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginOther, 500);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue up some reqeusts.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginA, kPerm);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginB, kTemp);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kPerm);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kTemp);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginA.host());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginOther.host());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginA);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kPerm, kOriginA);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginB);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origin_usage_completions_);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origins_completions_);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origin_usage_completions_);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origins_completions_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pending requests should get serviced when the appcache is ready.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, num_get_origin_usage_completions_);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, num_get_origins_completions_);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, num_delete_origins_completions_);  // deletes are really async
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // They should be serviced in order requested.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, usage_);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1ul, origins_.size());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins_.find(kOriginOther) != origins_.end());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, DestroyServiceWithPending) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginB, 10);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginOther, 500);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue up some reqeusts prior to being ready.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginA, kPerm);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginB, kTemp);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kPerm);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kTemp);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginA.host());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginOther.host());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginA);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kPerm, kOriginA);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginB);
346d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origin_usage_completions_);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origins_completions_);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the service.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All should have been aborted and called completion.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, num_get_origin_usage_completions_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, num_get_origins_completions_);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, num_delete_origins_completions_);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, usage_);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(origins_.empty());
36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort, delete_status_);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, DestroyQuotaManagerWithPending) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginA, 1000);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginB, 10);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUsageMapEntry(kOriginOther, 500);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue up some reqeusts prior to being ready.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginA, kPerm);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginUsage(client, kOriginB, kTemp);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kPerm);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForType(client, kTemp);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginA.host());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncGetOriginsForHost(client, kTemp, kOriginOther.host());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginA);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kPerm, kOriginA);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginB);
382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origin_usage_completions_);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origins_completions_);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the quota manager.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks should be deleted and not called.
392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origin_usage_completions_);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_get_origins_completions_);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheQuotaClientTest, DestroyWithDeleteInProgress) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheQuotaClient* client = CreateClient();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheReady(client);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start an async delete.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncDeleteOriginData(client, kTemp, kOriginB);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, num_delete_origins_completions_);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the service.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_NotifyAppCacheDestroyed(client);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have been aborted.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, num_delete_origins_completions_);
41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort, delete_status_);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A real completion callback from the service should
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be dropped if it comes in after NotifyAppCacheDestroyed.
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, num_delete_origins_completions_);
41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(storage::kQuotaErrorAbort, delete_status_);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Call_OnQuotaManagerDestroyed(client);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
425