1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen 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 <stack>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/threading/thread.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_backend_impl.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_database.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_entry.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_group.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_host.h"
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/appcache/appcache_interceptor.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_request_handler.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_service_impl.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_storage_impl.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/http/http_response_headers.h"
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/url_request/url_request_error_job.h"
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h"
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/url_request/url_request_test_job.h"
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sql/test/test_helpers.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace content {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::Time kZeroTime;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kManifestUrl("http://blah/manifest");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kManifestUrl2("http://blah/manifest2");
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kManifestUrl3("http://blah/manifest3");
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kEntryUrl("http://blah/entry");
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kEntryUrl2("http://blah/entry2");
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kFallbackNamespace("http://blah/fallback_namespace/");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kFallbackNamespace2("http://blah/fallback_namespace/longer");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kFallbackTestUrl("http://blah/fallback_namespace/longer/test");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kOnlineNamespace("http://blah/online_namespace");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kOnlineNamespaceWithinFallback(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://blah/fallback_namespace/online/");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kInterceptNamespace("http://blah/intercept_namespace/");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kInterceptNamespace2("http://blah/intercept_namespace/longer/");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kInterceptTestUrl("http://blah/intercept_namespace/longer/test");
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kInterceptPatternNamespace("http://blah/intercept_pattern/*/bar");
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kInterceptPatternTestPositiveUrl(
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://blah/intercept_pattern/foo/bar");
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kInterceptPatternTestNegativeUrl(
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://blah/intercept_pattern/foo/not_bar");
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kFallbackPatternNamespace("http://blah/fallback_pattern/*/bar");
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kFallbackPatternTestPositiveUrl(
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://blah/fallback_pattern/foo/bar");
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GURL kFallbackPatternTestNegativeUrl(
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://blah/fallback_pattern/foo/not_bar");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kOrigin(kManifestUrl.GetOrigin());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kManifestEntryIdOffset = 100;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFallbackEntryIdOffset = 1000;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL kDefaultEntryUrl("http://blah/makecacheandgroup_default_entry");
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultEntrySize = 10;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultEntryIdOffset = 12345;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMockQuota = 5000;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// The Reinitialize test needs some http accessible resources to run,
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// we mock stuff inprocess for that.
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class MockHttpServer {
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static GURL GetMockUrl(const std::string& path) {
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return GURL("http://mockhost/" + path);
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static net::URLRequestJob* CreateJob(
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      net::URLRequest* request, net::NetworkDelegate* network_delegate) {
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (request->url().host() != "mockhost")
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return new net::URLRequestErrorJob(request, network_delegate, -100);
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string headers, body;
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GetMockResponse(request->url().path(), &headers, &body);
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return new net::URLRequestTestJob(
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        request, network_delegate, headers, body, true);
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static void GetMockResponse(const std::string& path,
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              std::string* headers,
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              std::string* body) {
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const char manifest_headers[] =
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "HTTP/1.1 200 OK\0"
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "Content-type: text/cache-manifest\0"
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "\0";
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const char page_headers[] =
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "HTTP/1.1 200 OK\0"
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "Content-type: text/html\0"
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "\0";
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const char not_found_headers[] =
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "HTTP/1.1 404 NOT FOUND\0"
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "\0";
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (path == "/manifest") {
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*headers) = std::string(manifest_headers, arraysize(manifest_headers));
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*body) = "CACHE MANIFEST\n";
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else if (path == "/empty.html") {
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*headers) = std::string(page_headers, arraysize(page_headers));
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*body) = "";
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else {
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*headers) = std::string(not_found_headers,
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               arraysize(not_found_headers));
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (*body) = "";
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class MockHttpServerJobFactory
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : public net::URLRequestJobFactory::ProtocolHandler {
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual net::URLRequestJob* MaybeCreateJob(
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      net::URLRequest* request,
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      net::NetworkDelegate* network_delegate) const OVERRIDE {
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return MockHttpServer::CreateJob(request, network_delegate);
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class IOThread : public base::Thread {
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit IOThread(const char* name)
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : base::Thread(name) {
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~IOThread() {
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    Stop();
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  net::URLRequestContext* request_context() {
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return request_context_.get();
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Init() OVERRIDE {
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<net::URLRequestJobFactoryImpl> factory(
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new net::URLRequestJobFactoryImpl());
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    factory->SetProtocolHandler("http", new MockHttpServerJobFactory);
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    job_factory_ = factory.Pass();
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    request_context_.reset(new net::TestURLRequestContext());
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    request_context_->set_job_factory(job_factory_.get());
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AppCacheInterceptor::EnsureRegistered();
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void CleanUp() OVERRIDE {
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    request_context_.reset();
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    job_factory_.reset();
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<net::URLRequestJobFactory> job_factory_;
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<net::URLRequestContext> request_context_;
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_ptr<IOThread> io_thread;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<base::Thread> db_thread;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppCacheStorageImplTest : public testing::Test {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MockStorageDelegate : public AppCacheStorage::Delegate {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit MockStorageDelegate(AppCacheStorageImplTest* test)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : loaded_cache_id_(0), stored_group_success_(false),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          would_exceed_quota_(false), obsoleted_success_(false),
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          found_cache_id_(kAppCacheNoCacheId), test_(test) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnCacheLoaded(AppCache* cache, int64 cache_id) OVERRIDE {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_cache_ = cache;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_cache_id_ = cache_id;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_->ScheduleNextTask();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnGroupLoaded(AppCacheGroup* group,
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const GURL& manifest_url) OVERRIDE {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_group_ = group;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_manifest_url_ = manifest_url;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_groups_newest_cache_ = group ? group->newest_complete_cache()
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          : NULL;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_->ScheduleNextTask();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnGroupAndNewestCacheStored(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheGroup* group, AppCache* newest_cache, bool success,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool would_exceed_quota) OVERRIDE {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stored_group_ = group;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stored_group_success_ = success;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      would_exceed_quota_ = would_exceed_quota;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_->ScheduleNextTask();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnGroupMadeObsolete(AppCacheGroup* group,
210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     bool success,
211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     int response_code) OVERRIDE {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      obsoleted_group_ = group;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      obsoleted_success_ = success;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_->ScheduleNextTask();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnMainResponseFound(const GURL& url,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const AppCacheEntry& entry,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const GURL& namespace_entry_url,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const AppCacheEntry& fallback_entry,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int64 cache_id,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int64 group_id,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const GURL& manifest_url) OVERRIDE {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_url_ = url;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_entry_ = entry;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_namespace_entry_url_ = namespace_entry_url;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_fallback_entry_ = fallback_entry;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_cache_id_ = cache_id;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_group_id_ = group_id;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_manifest_url_ = manifest_url;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_->ScheduleNextTask();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AppCache> loaded_cache_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 loaded_cache_id_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AppCacheGroup> loaded_group_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL loaded_manifest_url_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AppCache> loaded_groups_newest_cache_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AppCacheGroup> stored_group_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool stored_group_success_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool would_exceed_quota_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AppCacheGroup> obsoleted_group_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool obsoleted_success_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL found_url_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheEntry found_entry_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL found_namespace_entry_url_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheEntry found_fallback_entry_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 found_cache_id_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 found_group_id_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL found_manifest_url_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheStorageImplTest* test_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  class MockQuotaManager : public storage::QuotaManager {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockQuotaManager()
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        : QuotaManager(true /* is_incognito */,
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       base::FilePath(),
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       io_thread->message_loop_proxy().get(),
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       db_thread->message_loop_proxy().get(),
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       NULL),
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          async_(false) {}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void GetUsageAndQuota(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const GURL& origin,
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        storage::StorageType type,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GetUsageAndQuotaCallback& callback) OVERRIDE {
26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(storage::kStorageTypeTemporary, type);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (async_) {
270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        base::MessageLoop::current()->PostTask(
271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            FROM_HERE,
272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            base::Bind(&MockQuotaManager::CallCallback,
273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                       base::Unretained(this),
274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                       callback));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CallCallback(callback);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void CallCallback(const GetUsageAndQuotaCallback& callback) {
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      callback.Run(storage::kQuotaStatusOk, 0, kMockQuota);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool async_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MockQuotaManager() {}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  class MockQuotaManagerProxy : public storage::QuotaManagerProxy {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockQuotaManagerProxy()
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : QuotaManagerProxy(NULL, NULL),
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          notify_storage_accessed_count_(0),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          notify_storage_modified_count_(0),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          last_delta_(0),
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mock_manager_(new MockQuotaManager) {
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      manager_ = mock_manager_.get();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    virtual void NotifyStorageAccessed(storage::QuotaClient::ID client_id,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const GURL& origin,
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       storage::StorageType type) OVERRIDE {
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(storage::QuotaClient::kAppcache, client_id);
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(storage::kStorageTypeTemporary, type);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++notify_storage_accessed_count_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_origin_ = origin;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    virtual void NotifyStorageModified(storage::QuotaClient::ID client_id,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const GURL& origin,
31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       storage::StorageType type,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int64 delta) OVERRIDE {
31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(storage::QuotaClient::kAppcache, client_id);
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(storage::kStorageTypeTemporary, type);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++notify_storage_modified_count_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_origin_ = origin;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_delta_ = delta;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Not needed for our tests.
32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    virtual void RegisterClient(storage::QuotaClient* client) OVERRIDE {}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void NotifyOriginInUse(const GURL& origin) OVERRIDE {}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void NotifyOriginNoLongerInUse(const GURL& origin) OVERRIDE {}
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    virtual void SetUsageCacheEnabled(storage::QuotaClient::ID client_id,
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      const GURL& origin,
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                      storage::StorageType type,
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      bool enabled) OVERRIDE {}
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void GetUsageAndQuota(
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::SequencedTaskRunner* original_task_runner,
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        const GURL& origin,
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        storage::StorageType type,
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        const GetUsageAndQuotaCallback& callback) OVERRIDE {}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int notify_storage_accessed_count_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int notify_storage_modified_count_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL last_origin_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int last_delta_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<MockQuotaManager> mock_manager_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MockQuotaManagerProxy() {}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Method>
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunMethod(Method method) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (this->*method)();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper callback to run a test on our io_thread. The io_thread is spun up
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once and reused for all tests.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Method>
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MethodWrapper(Method method) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetUpTest();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure InitTask execution prior to conducting a test.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FlushDbThreadTasks();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We also have to wait for InitTask completion call to be performed
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on the IO thread prior to running the test. Its guaranteed to be
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // queued by this time.
362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE,
364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        base::Bind(&AppCacheStorageImplTest::RunMethod<Method>,
365b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                   base::Unretained(this),
366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                   method));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetUpTestCase() {
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // We start both threads as TYPE_IO because we also use the db_thead
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // for the disk_cache which needs to be of TYPE_IO.
372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::Thread::Options options(base::MessageLoop::TYPE_IO, 0);
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    io_thread.reset(new IOThread("AppCacheTest.IOThread"));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(io_thread->StartWithOptions(options));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread.reset(new base::Thread("AppCacheTest::DBThread"));
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(db_thread->StartWithOptions(options));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TearDownTestCase() {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread.reset(NULL);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread.reset(NULL);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test harness --------------------------------------------------
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheStorageImplTest() {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Method>
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTestOnIOThread(Method method) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_finished_event_ .reset(new base::WaitableEvent(false, false));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread->message_loop()->PostTask(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE, base::Bind(&AppCacheStorageImplTest::MethodWrapper<Method>,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              base::Unretained(this), method));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_finished_event_->Wait();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpTest() {
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(base::MessageLoop::current() == io_thread->message_loop());
40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    service_.reset(new AppCacheServiceImpl(NULL));
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    service_->Initialize(base::FilePath(), db_thread->task_runner(), NULL);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_quota_manager_proxy_ = new MockQuotaManagerProxy();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_->quota_manager_proxy_ = mock_quota_manager_proxy_;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDownTest() {
408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(base::MessageLoop::current() == io_thread->message_loop());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->CancelDelegateCallbacks(delegate());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_ = NULL;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_ = NULL;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache2_ = NULL;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_quota_manager_proxy_ = NULL;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_.reset();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FlushDbThreadTasks();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestFinished() {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We unwind the stack prior to finishing up to let stack
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // based objects get deleted.
422b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(base::MessageLoop::current() == io_thread->message_loop());
423b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
424b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE,
425b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        base::Bind(&AppCacheStorageImplTest::TestFinishedUnwound,
426b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                   base::Unretained(this)));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestFinishedUnwound() {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TearDownTest();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_finished_event_->Signal();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PushNextTask(const base::Closure& task) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_stack_.push(task);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleNextTask() {
439b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(base::MessageLoop::current() == io_thread->message_loop());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (task_stack_.empty()) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
443b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE, task_stack_.top());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_stack_.pop();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SignalEvent(base::WaitableEvent* event) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->Signal();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FlushDbThreadTasks() {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We pump a task thru the db thread to ensure any tasks previously
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scheduled on that thread have been performed prior to return.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent event(false, false);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread->message_loop()->PostTask(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE, base::Bind(&AppCacheStorageImplTest::SignalEvent, &event));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.Wait();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadCache_Miss ----------------------------------------------------
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadCache_Miss() {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to load a cache that doesn't exist. Should
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // complete asynchronously.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_LoadCache_Miss,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadCache(111, delegate());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(111, delegate()->loaded_cache_id_);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_LoadCache_Miss() {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(111, delegate()->loaded_cache_id_);
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_FALSE(delegate()->loaded_cache_.get());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_accessed_count_);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadCache_NearHit -------------------------------------------------
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadCache_NearHit() {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to load a cache that is currently in use
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and does not require loading from storage. This
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // load should complete syncly.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Make an 'unstored' cache for
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // us to load. The ctor should put it in the working set.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 cache_id = storage()->NewCacheId();
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<AppCache> cache(new AppCache(storage(), cache_id));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadCache(cache_id, delegate());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cache_id, delegate()->loaded_cache_id_);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cache.get(), delegate()->loaded_cache_.get());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_accessed_count_);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CreateGroup  --------------------------------------------
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateGroupInEmptyOrigin() {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to load a group that doesn't exist, one should
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be created for us, but not stored.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since the origin has no groups, the storage class will respond
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // syncly.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadOrCreateGroup(kManifestUrl, delegate());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Verify_CreateGroup();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateGroupInPopulatedOrigin() {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to load a group that doesn't exist, one should
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be created for us, but not stored.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_CreateGroup,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since the origin has groups, storage class will have to
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // consult the database and completion will be async.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->usage_map_[kOrigin] = kDefaultEntrySize;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadOrCreateGroup(kManifestUrl, delegate());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->loaded_group_.get());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_CreateGroup() {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->loaded_manifest_url_);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_group_.get());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_group_->HasOneRef());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->loaded_group_->newest_complete_cache());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should not have been stored in the database.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::GroupRecord record;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindGroup(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate()->loaded_group_->group_id(), &record));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_accessed_count_);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadGroupAndCache_FarHit  --------------------------------------
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadGroupAndCache_FarHit() {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to load a cache that is not currently in use
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and does require loading from disk. This
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // load should complete asynchronously.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_LoadCache_Far_Hit,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and newest cache that
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // appear to be "stored" and "not currently in use".
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_ = NULL;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_ = NULL;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the cache load test, completes async
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadCache(1, delegate());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_LoadCache_Far_Hit() {
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_.get());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_->HasOneRef());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->loaded_cache_id_);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The group should also have been loaded.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_->owning_group());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_->owning_group()->HasOneRef());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->loaded_cache_->owning_group()->group_id());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, mock_quota_manager_proxy_->notify_storage_accessed_count_);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop things from the working set.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate()->loaded_cache_ = NULL;
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_FALSE(delegate()->loaded_group_.get());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the group load test, also complete asynchronously.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_LoadGroup_Far_Hit,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadOrCreateGroup(kManifestUrl, delegate());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_LoadGroup_Far_Hit() {
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_group_.get());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->loaded_manifest_url_);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_group_->newest_complete_cache());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate()->loaded_groups_newest_cache_ = NULL;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_group_->HasOneRef());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, mock_quota_manager_proxy_->notify_storage_accessed_count_);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StoreNewGroup  --------------------------------------
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StoreNewGroup() {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store a group and its newest cache. Should complete asynchronously.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_StoreNewGroup,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and newest cache that
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // appear to be "unstored".
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_ = new AppCacheGroup(
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        storage(), kManifestUrl, storage()->NewGroupId());
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cache_ = new AppCache(storage(), storage()->NewCacheId());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT, 1,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              kDefaultEntrySize));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hold a ref to the cache simulate the UpdateJob holding that ref,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and hold a ref to the group to simulate the CacheHost holding that ref.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have the quota manager retrun asynchronously for this test.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_quota_manager_proxy_->mock_manager_->async_ = true;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the store test.
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    storage()->StoreGroupAndNewestCache(group_.get(), cache_.get(), delegate());
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->stored_group_success_);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_StoreNewGroup() {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->stored_group_success_);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(group_.get(), delegate()->stored_group_.get());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cache_.get(), group_->newest_complete_cache());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_->is_complete());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should have been stored in the database.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::GroupRecord group_record;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindGroup(group_->group_id(), &group_record));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindCache(cache_->cache_id(), &cache_record));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify quota bookkeeping
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize, storage()->usage_map_[kOrigin]);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, mock_quota_manager_proxy_->notify_storage_modified_count_);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kOrigin, mock_quota_manager_proxy_->last_origin_);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize, mock_quota_manager_proxy_->last_delta_);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StoreExistingGroup  --------------------------------------
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StoreExistingGroup() {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store a group and its newest cache. Should complete asynchronously.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_StoreExistingGroup,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and old complete cache
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that appear to be "stored"
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize, storage()->usage_map_[kOrigin]);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And a newest unstored complete cache.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cache2_ = new AppCache(storage(), 2);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache2_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::MASTER, 1,
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               kDefaultEntrySize + 100));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    storage()->StoreGroupAndNewestCache(
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        group_.get(), cache2_.get(), delegate());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->stored_group_success_);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_StoreExistingGroup() {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->stored_group_success_);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(group_.get(), delegate()->stored_group_.get());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cache2_.get(), group_->newest_complete_cache());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache2_->is_complete());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The new cache should have been stored in the database.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::GroupRecord group_record;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindGroup(1, &group_record));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindCache(2, &cache_record));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The old cache should have been deleted
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindCache(1, &cache_record));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify quota bookkeeping
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize + 100, storage()->usage_map_[kOrigin]);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, mock_quota_manager_proxy_->notify_storage_modified_count_);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kOrigin, mock_quota_manager_proxy_->last_origin_);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(100, mock_quota_manager_proxy_->last_delta_);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StoreExistingGroupExistingCache  -------------------------------
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StoreExistingGroupExistingCache() {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store a group with updates to its existing newest complete cache.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and a complete cache that
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // appear to be "stored".
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and old complete cache
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that appear to be "stored"
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize, storage()->usage_map_[kOrigin]);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Change the cache.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time now = base::Time::Now();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::MASTER, 1, 100));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->set_update_time(now);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_StoreExistingGroupExistingCache,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this), now));
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(cache_.get(), group_->newest_complete_cache());
714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    storage()->StoreGroupAndNewestCache(group_.get(), cache_.get(), delegate());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->stored_group_success_);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_StoreExistingGroupExistingCache(
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time expected_update_time) {
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->stored_group_success_);
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(cache_.get(), group_->newest_complete_cache());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindCache(1, &cache_record));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_record.cache_id);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_record.group_id);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(cache_record.online_wildcard);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(expected_update_time == cache_record.update_time);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(100 + kDefaultEntrySize, cache_record.cache_size);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entry_records;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindEntriesForCache(1, &entry_records));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, entry_records.size());
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry_records[0].url == kDefaultEntryUrl)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_records.erase(entry_records.begin());
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1 , entry_records[0].cache_id);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, entry_records[0].url);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(AppCacheEntry::MASTER, entry_records[0].flags);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, entry_records[0].response_id);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(100, entry_records[0].response_size);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify quota bookkeeping
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(100 + kDefaultEntrySize, storage()->usage_map_[kOrigin]);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, mock_quota_manager_proxy_->notify_storage_modified_count_);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kOrigin, mock_quota_manager_proxy_->last_origin_);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(100, mock_quota_manager_proxy_->last_delta_);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FailStoreGroup  --------------------------------------
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FailStoreGroup() {
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Store a group and its newest cache. Should complete asynchronously.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_FailStoreGroup,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and newest cache that
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // appear to be "unstored" and big enough to exceed the 5M limit.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int64 kTooBig = 10 * 1024 * 1024;  // 10M
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_ = new AppCacheGroup(
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        storage(), kManifestUrl, storage()->NewGroupId());
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cache_ = new AppCache(storage(), storage()->NewCacheId());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kManifestUrl,
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     AppCacheEntry(AppCacheEntry::MANIFEST, 1, kTooBig));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hold a ref to the cache simulate the UpdateJob holding that ref,
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and hold a ref to the group to simulate the CacheHost holding that ref.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the store test.
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    storage()->StoreGroupAndNewestCache(group_.get(), cache_.get(), delegate());
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->stored_group_success_);  // Expected to be async.
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FailStoreGroup() {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->stored_group_success_);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->would_exceed_quota_);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should not have been stored in the database.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::GroupRecord group_record;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindGroup(group_->group_id(), &group_record));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindCache(cache_->cache_id(), &cache_record));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_accessed_count_);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, mock_quota_manager_proxy_->notify_storage_modified_count_);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MakeGroupObsolete  -------------------------------
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakeGroupObsolete() {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make a group obsolete, should complete asynchronously.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_MakeGroupObsolete,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a group and newest cache that
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // appears to be "stored" and "currently in use".
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDefaultEntrySize, storage()->usage_map_[kOrigin]);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Also insert some related records.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = 1;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::FALLBACK;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = 1;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::NamespaceRecord fallback_namespace_record;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.cache_id = 1;
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.target_url = kEntryUrl;
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.namespace_url = kFallbackNamespace;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.origin = kManifestUrl.GetOrigin();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespace(&fallback_namespace_record));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::OnlineWhiteListRecord online_whitelist_record;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    online_whitelist_record.cache_id = 1;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    online_whitelist_record.namespace_url = kOnlineNamespace;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertOnlineWhiteList(&online_whitelist_record));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
823e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    storage()->MakeGroupObsolete(group_.get(), delegate(), 0);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(group_->is_obsolete());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_MakeGroupObsolete() {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->obsoleted_success_);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(group_.get(), delegate()->obsoleted_group_.get());
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(group_->is_obsolete());
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage()->usage_map_.empty());
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The cache and group have been deleted from the database.
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::GroupRecord group_record;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindGroup(1, &group_record));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(database()->FindCache(1, &cache_record));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The related records should have been deleted too.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entry_records;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database()->FindEntriesForCache(1, &entry_records);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(entry_records.empty());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> intercept_records;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> fallback_records;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database()->FindNamespacesForCache(
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, &intercept_records, &fallback_records);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fallback_records.empty());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::OnlineWhiteListRecord> whitelist_records;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    database()->FindOnlineWhiteListForCache(1, &whitelist_records);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(whitelist_records.empty());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify quota bookkeeping
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(storage()->usage_map_.empty());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, mock_quota_manager_proxy_->notify_storage_modified_count_);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kOrigin, mock_quota_manager_proxy_->last_origin_);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(-kDefaultEntrySize, mock_quota_manager_proxy_->last_delta_);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MarkEntryAsForeign  -------------------------------
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkEntryAsForeign() {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a cache with an entry
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in storage and in the working set.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = 1;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::EXPLICIT;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = 0;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(cache_->GetEntry(kEntryUrl)->IsForeign());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->MarkEntryAsForeign(kEntryUrl, 1);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The entry in the working set should have been updated syncly.
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_->GetEntry(kEntryUrl)->IsForeign());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_->GetEntry(kEntryUrl)->IsExplicit());
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the entry in storage should also be updated, but that
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // happens asynchronously on the db thread.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FlushDbThreadTasks();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record2;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindEntry(1, kEntryUrl, &entry_record2));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(AppCacheEntry::EXPLICIT | AppCacheEntry::FOREIGN,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry_record2.flags);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MarkEntryAsForeignWithLoadInProgress  -------------------------------
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkEntryAsForeignWithLoadInProgress() {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &AppCacheStorageImplTest::Verify_MarkEntryAsForeignWithLoadInProgress,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Unretained(this)));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a cache with an entry
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in storage, but not in the working set.
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = 1;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::EXPLICIT;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = 0;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(cache_->GetEntry(kEntryUrl)->IsForeign());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_->HasOneRef());
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_ = NULL;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group_ = NULL;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test, start a cache load, and prior to completion
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of that load, mark the entry as foreign.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->LoadCache(1, delegate());
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->MarkEntryAsForeign(kEntryUrl, 1);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_MarkEntryAsForeignWithLoadInProgress() {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->loaded_cache_id_);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_.get());
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The entry in the working set should have been updated upon load.
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_->GetEntry(kEntryUrl)->IsForeign());
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->loaded_cache_->GetEntry(kEntryUrl)->IsExplicit());
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the entry in storage should also be updated.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FlushDbThreadTasks();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->FindEntry(1, kEntryUrl, &entry_record));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(AppCacheEntry::EXPLICIT | AppCacheEntry::FOREIGN,
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              entry_record.flags);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FindNoMainResponse  -------------------------------
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindNoMainResponse() {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_FindNoMainResponse,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate());
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kEntryUrl, delegate()->found_url_);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindNoMainResponse() {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_url_);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_manifest_url_.is_empty());
952f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoCacheId, delegate()->found_cache_id_);
953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId, delegate()->found_entry_.response_id());
954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId,
955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        delegate()->found_fallback_entry_.response_id());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_namespace_entry_url_.is_empty());
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate()->found_entry_.types());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate()->found_fallback_entry_.types());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BasicFindMainResponse  -------------------------------
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainResponseInDatabase() {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainResponse(true);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainResponseInWorkingSet() {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainResponse(false);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainResponse(bool drop_from_working_set) {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_BasicFindMainResponse,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a complete cache with an entry
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in storage.
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 2, 1, true);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::EXPLICIT, 1));
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = 1;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::EXPLICIT;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = 1;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Optionally drop the cache/group pair from the working set.
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drop_from_working_set) {
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(cache_->HasOneRef());
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_ = NULL;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(group_->HasOneRef());
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_ = NULL;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test.
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate());
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kEntryUrl,  delegate()->found_url_);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_BasicFindMainResponse() {
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_url_);
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_entry_.response_id());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsExplicit());
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BasicFindMainFallbackResponse  -------------------------------
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainFallbackResponseInDatabase() {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainFallbackResponse(true);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainFallbackResponseInWorkingSet() {
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainFallbackResponse(false);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainFallbackResponse(bool drop_from_working_set) {
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_BasicFindMainFallbackResponse,
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a complete cache with a
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fallback namespace and entry.
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 2, 1, true);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::FALLBACK, 1));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl2, AppCacheEntry(AppCacheEntry::FALLBACK, 2));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->fallback_namespaces_.push_back(
1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE,
1034f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kFallbackNamespace2,
1035f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kEntryUrl2,
1036f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  false));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->fallback_namespaces_.push_back(
1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE,
1039f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kFallbackNamespace,
1040f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kEntryUrl,
1041f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  false));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entries;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> intercepts;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> fallbacks;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::OnlineWhiteListRecord> whitelists;
1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    cache_->ToDatabaseRecords(group_.get(),
1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &cache_record,
1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &entries,
1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &intercepts,
1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &fallbacks,
1052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &whitelists);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord>::const_iterator iter =
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries.begin();
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (iter != entries.end()) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // MakeCacheAndGroup has inserted the default entry record already.
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (iter->url != kDefaultEntryUrl)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_TRUE(database()->InsertEntry(&(*iter)));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++iter;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespaceRecords(fallbacks));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertOnlineWhiteListRecords(whitelists));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drop_from_working_set) {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(cache_->HasOneRef());
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_ = NULL;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(group_->HasOneRef());
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_ = NULL;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test. The test url is in both fallback namespace urls,
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // but should match the longer of the two.
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kFallbackTestUrl, GURL(), delegate());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kFallbackTestUrl, delegate()->found_url_);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_BasicFindMainFallbackResponse() {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kFallbackTestUrl, delegate()->found_url_);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_entry_.has_response_id());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_fallback_entry_.response_id());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl2, delegate()->found_namespace_entry_url_);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback());
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BasicFindMainInterceptResponse  -------------------------------
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainInterceptResponseInDatabase() {
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainInterceptResponse(true);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainInterceptResponseInWorkingSet() {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasicFindMainInterceptResponse(false);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BasicFindMainInterceptResponse(bool drop_from_working_set) {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_BasicFindMainInterceptResponse,
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a complete cache with an
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // intercept namespace and entry.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 2, 1, true);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::INTERCEPT, 1));
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl2, AppCacheEntry(AppCacheEntry::INTERCEPT, 2));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->intercept_namespaces_.push_back(
1111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_INTERCEPT_NAMESPACE, kInterceptNamespace2,
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kEntryUrl2, false));
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->intercept_namespaces_.push_back(
1114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_INTERCEPT_NAMESPACE, kInterceptNamespace,
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kEntryUrl, false));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entries;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> intercepts;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> fallbacks;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::OnlineWhiteListRecord> whitelists;
1121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    cache_->ToDatabaseRecords(group_.get(),
1122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &cache_record,
1123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &entries,
1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &intercepts,
1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &fallbacks,
1126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &whitelists);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord>::const_iterator iter =
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries.begin();
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (iter != entries.end()) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // MakeCacheAndGroup has inserted  the default entry record already
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (iter->url != kDefaultEntryUrl)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_TRUE(database()->InsertEntry(&(*iter)));
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++iter;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespaceRecords(intercepts));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertOnlineWhiteListRecords(whitelists));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drop_from_working_set) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(cache_->HasOneRef());
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_ = NULL;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(group_->HasOneRef());
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_ = NULL;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test. The test url is in both intercept namespaces,
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // but should match the longer of the two.
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kInterceptTestUrl, GURL(), delegate());
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kInterceptTestUrl, delegate()->found_url_);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_BasicFindMainInterceptResponse() {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kInterceptTestUrl, delegate()->found_url_);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_entry_.response_id());
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsIntercept());
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl2, delegate()->found_namespace_entry_url_);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // FindInterceptPatternMatch ----------------------------------------
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindInterceptPatternMatchInDatabase() {
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FindInterceptPatternMatch(true);
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindInterceptPatternMatchInWorkingSet() {
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FindInterceptPatternMatch(false);
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindInterceptPatternMatch(bool drop_from_working_set) {
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Setup some preconditions. Create a complete cache with an
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // pattern matching intercept namespace and entry.
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 2, 1, true);
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::INTERCEPT, 1));
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_->intercept_namespaces_.push_back(
1181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_INTERCEPT_NAMESPACE,
1182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            kInterceptPatternNamespace, kEntryUrl, true));
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entries;
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> intercepts;
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> fallbacks;
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::OnlineWhiteListRecord> whitelists;
1188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    cache_->ToDatabaseRecords(group_.get(),
1189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &cache_record,
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &entries,
1191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &intercepts,
1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &fallbacks,
1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &whitelists);
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord>::const_iterator iter =
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entries.begin();
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    while (iter != entries.end()) {
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // MakeCacheAndGroup has inserted  the default entry record already
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (iter->url != kDefaultEntryUrl)
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(database()->InsertEntry(&(*iter)));
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++iter;
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespaceRecords(intercepts));
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (drop_from_working_set) {
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(cache_->HasOneRef());
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cache_ = NULL;
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(group_->HasOneRef());
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      group_ = NULL;
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // First test something that does not match the pattern.
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PushNextTask(base::Bind(
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindInterceptPatternMatchNegative,
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Unretained(this)));
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    storage()->FindResponseForMainRequest(
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kInterceptPatternTestNegativeUrl, GURL(), delegate());
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(GURL(), delegate()->found_url_);  // Is always async.
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Verify_FindInterceptPatternMatchNegative() {
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kInterceptPatternTestNegativeUrl, delegate()->found_url_);
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(delegate()->found_manifest_url_.is_empty());
1224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoCacheId, delegate()->found_cache_id_);
1225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId, delegate()->found_entry_.response_id());
1226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId,
1227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        delegate()->found_fallback_entry_.response_id());
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(delegate()->found_namespace_entry_url_.is_empty());
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, delegate()->found_entry_.types());
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, delegate()->found_fallback_entry_.types());
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Then test something that matches.
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PushNextTask(base::Bind(
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindInterceptPatternMatchPositive,
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Unretained(this)));
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    storage()->FindResponseForMainRequest(
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kInterceptPatternTestPositiveUrl, GURL(), delegate());
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Verify_FindInterceptPatternMatchPositive() {
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kInterceptPatternTestPositiveUrl, delegate()->found_url_);
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, delegate()->found_entry_.response_id());
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsIntercept());
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_namespace_entry_url_);
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestFinished();
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // FindFallbackPatternMatch  -------------------------------
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindFallbackPatternMatchInDatabase() {
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FindFallbackPatternMatch(true);
1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindFallbackPatternMatchInWorkingSet() {
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FindFallbackPatternMatch(false);
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FindFallbackPatternMatch(bool drop_from_working_set) {
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Setup some preconditions. Create a complete cache with a
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // pattern matching fallback namespace and entry.
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 2, 1, true);
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_->AddEntry(kEntryUrl, AppCacheEntry(AppCacheEntry::FALLBACK, 1));
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_->fallback_namespaces_.push_back(
1268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE,
1269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            kFallbackPatternNamespace, kEntryUrl, true));
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AppCacheDatabase::CacheRecord cache_record;
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord> entries;
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> intercepts;
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::NamespaceRecord> fallbacks;
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::OnlineWhiteListRecord> whitelists;
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    cache_->ToDatabaseRecords(group_.get(),
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &cache_record,
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &entries,
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &intercepts,
1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &fallbacks,
1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              &whitelists);
1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<AppCacheDatabase::EntryRecord>::const_iterator iter =
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entries.begin();
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    while (iter != entries.end()) {
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // MakeCacheAndGroup has inserted the default entry record already.
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (iter->url != kDefaultEntryUrl)
1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(database()->InsertEntry(&(*iter)));
1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++iter;
1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespaceRecords(fallbacks));
1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (drop_from_working_set) {
1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(cache_->HasOneRef());
1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cache_ = NULL;
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(group_->HasOneRef());
1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      group_ = NULL;
1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // First test something that does not match the pattern.
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PushNextTask(base::Bind(
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindFallbackPatternMatchNegative,
1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Unretained(this)));
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    storage()->FindResponseForMainRequest(
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kFallbackPatternTestNegativeUrl, GURL(), delegate());
1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(GURL(), delegate()->found_url_);  // Is always async.
1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Verify_FindFallbackPatternMatchNegative() {
1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kFallbackPatternTestNegativeUrl, delegate()->found_url_);
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(delegate()->found_manifest_url_.is_empty());
1311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      EXPECT_EQ(kAppCacheNoCacheId, delegate()->found_cache_id_);
1312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      EXPECT_EQ(kAppCacheNoResponseId, delegate()->found_entry_.response_id());
1313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      EXPECT_EQ(kAppCacheNoResponseId,
1314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          delegate()->found_fallback_entry_.response_id());
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(delegate()->found_namespace_entry_url_.is_empty());
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(0, delegate()->found_entry_.types());
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(0, delegate()->found_fallback_entry_.types());
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Then test something that matches.
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PushNextTask(base::Bind(
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &AppCacheStorageImplTest::Verify_FindFallbackPatternMatchPositive,
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::Unretained(this)));
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      storage()->FindResponseForMainRequest(
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          kFallbackPatternTestPositiveUrl, GURL(), delegate());
1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Verify_FindFallbackPatternMatchPositive() {
1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kFallbackPatternTestPositiveUrl, delegate()->found_url_);
1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, delegate()->found_fallback_entry_.response_id());
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback());
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_namespace_entry_url_);
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(delegate()->found_entry_.has_response_id());
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestFinished();
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FindMainResponseWithMultipleHits  -------------------------------
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindMainResponseWithMultipleHits() {
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits,
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions, create a few caches with an identical set
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of entries and fallback namespaces. Only the last one remains in
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the working set to simulate appearing as "in use".
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeMultipleHitCacheAndGroup(kManifestUrl, 1);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeMultipleHitCacheAndGroup(kManifestUrl2, 2);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeMultipleHitCacheAndGroup(kManifestUrl3, 3);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct the test, we should find the response from the last cache
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // since it's "in use".
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate());
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kEntryUrl, delegate()->found_url_);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakeMultipleHitCacheAndGroup(const GURL& manifest_url, int id) {
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(manifest_url, id, id, true);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add an entry for kEntryUrl
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = id;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::EXPLICIT;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = id;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry_record.url,
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheEntry(entry_record.flags, entry_record.response_id));
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add an entry for the manifestUrl
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = id;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = manifest_url;
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::MANIFEST;
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = id + kManifestEntryIdOffset;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry_record.url,
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheEntry(entry_record.flags, entry_record.response_id));
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a fallback entry and namespace
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = id;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl2;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::FALLBACK;
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = id + kFallbackEntryIdOffset;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry_record.url,
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheEntry(entry_record.flags, entry_record.response_id));
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::NamespaceRecord fallback_namespace_record;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.cache_id = id;
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.target_url = entry_record.url;
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.namespace_url = kFallbackNamespace;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.origin = manifest_url.GetOrigin();
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespace(&fallback_namespace_record));
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->fallback_namespaces_.push_back(
1399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE,
1400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kFallbackNamespace,
1401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kEntryUrl2,
1402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  false));
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindMainResponseWithMultipleHits() {
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_url_);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl3, delegate()->found_manifest_url_);
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate()->found_cache_id_);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate()->found_group_id_);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate()->found_entry_.response_id());
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsExplicit());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Conduct another test preferring kManifestUrl
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits2,
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, kManifestUrl, delegate());
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kEntryUrl, delegate()->found_url_);
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindMainResponseWithMultipleHits2() {
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_url_);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl, delegate()->found_manifest_url_);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_cache_id_);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_group_id_);
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate()->found_entry_.response_id());
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsExplicit());
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Conduct the another test preferring kManifestUrl2
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits3,
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, kManifestUrl2, delegate());
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kEntryUrl, delegate()->found_url_);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindMainResponseWithMultipleHits3() {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl, delegate()->found_url_);
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl2, delegate()->found_manifest_url_);
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_cache_id_);
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_entry_.response_id());
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_entry_.IsExplicit());
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_fallback_entry_.has_response_id());
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct another test with no preferred manifest that hits the fallback.
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits4,
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kFallbackTestUrl, GURL(), delegate());
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kFallbackTestUrl, delegate()->found_url_);
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindMainResponseWithMultipleHits4() {
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kFallbackTestUrl, delegate()->found_url_);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl3, delegate()->found_manifest_url_);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate()->found_cache_id_);
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate()->found_group_id_);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_entry_.has_response_id());
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3 + kFallbackEntryIdOffset,
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              delegate()->found_fallback_entry_.response_id());
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback());
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl2, delegate()->found_namespace_entry_url_);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Conduct another test preferring kManifestUrl2 that hits the fallback.
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_FindMainResponseWithMultipleHits5,
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Unretained(this)));
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kFallbackTestUrl, kManifestUrl2, delegate());
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(kFallbackTestUrl, delegate()->found_url_);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_FindMainResponseWithMultipleHits5() {
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kFallbackTestUrl, delegate()->found_url_);
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kManifestUrl2, delegate()->found_manifest_url_);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_cache_id_);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate()->found_group_id_);
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate()->found_entry_.has_response_id());
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2 + kFallbackEntryIdOffset,
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              delegate()->found_fallback_entry_.response_id());
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_fallback_entry_.IsFallback());
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kEntryUrl2, delegate()->found_namespace_entry_url_);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FindMainResponseExclusions  -------------------------------
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindMainResponseExclusionsInDatabase() {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FindMainResponseExclusions(true);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindMainResponseExclusionsInWorkingSet() {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FindMainResponseExclusions(false);
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindMainResponseExclusions(bool drop_from_working_set) {
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup some preconditions. Create a complete cache with a
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // foreign entry, an online namespace, and a second online
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // namespace nested within a fallback namespace.
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeCacheAndGroup(kManifestUrl, 1, 1, true);
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl,
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheEntry(AppCacheEntry::EXPLICIT | AppCacheEntry::FOREIGN, 1));
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kEntryUrl2, AppCacheEntry(AppCacheEntry::FALLBACK, 2));
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->fallback_namespaces_.push_back(
1514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE,
1515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kFallbackNamespace,
1516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  kEntryUrl2,
1517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  false));
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->online_whitelist_namespaces_.push_back(
1519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_NETWORK_NAMESPACE, kOnlineNamespace,
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  GURL(), false));
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_->online_whitelist_namespaces_.push_back(
1522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        AppCacheNamespace(APPCACHE_NETWORK_NAMESPACE,
1523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            kOnlineNamespaceWithinFallback, GURL(), false));
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::EntryRecord entry_record;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.cache_id = 1;
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.url = kEntryUrl;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.flags = AppCacheEntry::EXPLICIT | AppCacheEntry::FOREIGN;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_record.response_id = 1;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertEntry(&entry_record));
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::OnlineWhiteListRecord whitelist_record;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_record.cache_id = 1;
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_record.namespace_url = kOnlineNamespace;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertOnlineWhiteList(&whitelist_record));
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheDatabase::NamespaceRecord fallback_namespace_record;
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.cache_id = 1;
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.target_url = kEntryUrl2;
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fallback_namespace_record.namespace_.namespace_url = kFallbackNamespace;
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fallback_namespace_record.origin = kManifestUrl.GetOrigin();
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertNamespace(&fallback_namespace_record));
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_record.cache_id = 1;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_record.namespace_url = kOnlineNamespaceWithinFallback;
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(database()->InsertOnlineWhiteList(&whitelist_record));
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (drop_from_working_set) {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_ = NULL;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_ = NULL;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not find anything for the foreign entry.
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushNextTask(base::Bind(&AppCacheStorageImplTest::Verify_ExclusionNotFound,
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this), kEntryUrl, 1));
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage()->FindResponseForMainRequest(kEntryUrl, GURL(), delegate());
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify_ExclusionNotFound(GURL expected_url, int phase) {
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_url, delegate()->found_url_);
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_manifest_url_.is_empty());
1558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoCacheId, delegate()->found_cache_id_);
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate()->found_group_id_);
1560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId, delegate()->found_entry_.response_id());
1561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAppCacheNoResponseId,
1562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        delegate()->found_fallback_entry_.response_id());
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate()->found_namespace_entry_url_.is_empty());
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate()->found_entry_.types());
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate()->found_fallback_entry_.types());
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (phase == 1) {
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We should not find anything for the online namespace.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PushNextTask(
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&AppCacheStorageImplTest::Verify_ExclusionNotFound,
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this), kOnlineNamespace, 2));
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      storage()->FindResponseForMainRequest(
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kOnlineNamespace, GURL(), delegate());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (phase == 2) {
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We should not find anything for the online namespace nested within
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the fallback namespace.
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PushNextTask(base::Bind(
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &AppCacheStorageImplTest::Verify_ExclusionNotFound,
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(this), kOnlineNamespaceWithinFallback, 3));
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      storage()->FindResponseForMainRequest(
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kOnlineNamespaceWithinFallback, GURL(), delegate());
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestFinished();
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Reinitialize -------------------------------
15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // These tests are somewhat of a system integration test.
15925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // They rely on running a mock http server on our IO thread,
15931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // and involves other appcache classes to get some code
15941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // coverage thruout when Reinitialize happens.
15951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
159646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class MockServiceObserver : public AppCacheServiceImpl::Observer {
15971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   public:
15981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    explicit MockServiceObserver(AppCacheStorageImplTest* test)
15991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        : test_(test) {}
16001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnServiceReinitialized(
16021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        AppCacheStorageReference* old_storage_ref) OVERRIDE {
16031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      observed_old_storage_ = old_storage_ref;
16041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      test_->ScheduleNextTask();
16051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
16061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_refptr<AppCacheStorageReference> observed_old_storage_;
16081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AppCacheStorageImplTest* test_;
16091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
16101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  class MockAppCacheFrontend : public AppCacheFrontend {
16121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   public:
16131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    MockAppCacheFrontend() : error_event_was_raised_(false) {}
16141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnCacheSelected(
1616e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        int host_id, const AppCacheInfo& info) OVERRIDE {}
16171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnStatusChanged(const std::vector<int>& host_ids,
1618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 AppCacheStatus status) OVERRIDE {}
16191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnEventRaised(const std::vector<int>& host_ids,
1620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               AppCacheEventID event_id) OVERRIDE {}
16211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnProgressEventRaised(
16221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        const std::vector<int>& host_ids,
16231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        const GURL& url,
16241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        int num_total, int num_complete) OVERRIDE {}
16251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnErrorEventRaised(const std::vector<int>& host_ids,
1626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    const AppCacheErrorDetails& details)
1627e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        OVERRIDE {
16281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      error_event_was_raised_ = true;
16291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual void OnLogMessage(int host_id, AppCacheLogLevel log_level,
16311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              const std::string& message) OVERRIDE {}
16321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void OnContentBlocked(
16331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        int host_id, const GURL& manifest_url) OVERRIDE {}
16341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool error_event_was_raised_;
16361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
16371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum ReinitTestCase {
16395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     CORRUPT_CACHE_ON_INSTALL,
16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     CORRUPT_CACHE_ON_LOAD_EXISTING,
16415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     CORRUPT_SQL_ON_INSTALL
16425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
16435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void Reinitialize1() {
16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Recover from a corrupt disk cache discovered while
16465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // installing a new appcache.
16475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Reinitialize(CORRUPT_CACHE_ON_INSTALL);
16481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
16491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void Reinitialize2() {
16515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Recover from a corrupt disk cache discovered while
16525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // trying to load a resource from an existing appcache.
16535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Reinitialize(CORRUPT_CACHE_ON_LOAD_EXISTING);
16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Reinitialize3() {
16575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Recover from a corrupt sql database discovered while
16585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // installing a new appcache.
16595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Reinitialize(CORRUPT_SQL_ON_INSTALL);
16601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
16611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Reinitialize(ReinitTestCase test_case) {
16631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Unlike all of the other tests, this one actually read/write files.
16641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(temp_directory_.CreateUniqueTempDir());
16651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AppCacheDatabase db(temp_directory_.path().AppendASCII("Index"));
16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(db.LazyOpen(true));
16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_CACHE_ON_INSTALL ||
16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_case == CORRUPT_CACHE_ON_LOAD_EXISTING) {
16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Create a corrupt/unopenable disk_cache index file.
16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string kCorruptData("deadbeef");
16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath disk_cache_directory =
16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          temp_directory_.path().AppendASCII("Cache");
16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(base::CreateDirectory(disk_cache_directory));
16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath index_file = disk_cache_directory.AppendASCII("index");
16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(static_cast<int>(kCorruptData.length()),
1678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::WriteFile(
16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    index_file, kCorruptData.data(), kCorruptData.length()));
16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
16811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Create records for a degenerate cached manifest that only contains
16831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // one entry for the manifest file resource.
16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_CACHE_ON_LOAD_EXISTING) {
16851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheDatabase db(temp_directory_.path().AppendASCII("Index"));
16861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GURL manifest_url = MockHttpServer::GetMockUrl("manifest");
16871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheDatabase::GroupRecord group_record;
16891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      group_record.group_id = 1;
16901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      group_record.manifest_url = manifest_url;
16911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      group_record.origin = manifest_url.GetOrigin();
16921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(db.InsertGroup(&group_record));
16931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheDatabase::CacheRecord cache_record;
16941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cache_record.cache_id = 1;
16951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cache_record.group_id = 1;
16961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cache_record.online_wildcard = false;
16971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cache_record.update_time = kZeroTime;
16981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cache_record.cache_size = kDefaultEntrySize;
16991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(db.InsertCache(&cache_record));
17001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheDatabase::EntryRecord entry_record;
17011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      entry_record.cache_id = 1;
17021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      entry_record.url = manifest_url;
17031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      entry_record.flags = AppCacheEntry::MANIFEST;
17041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      entry_record.response_id = 1;
17051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      entry_record.response_size = kDefaultEntrySize;
17061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(db.InsertEntry(&entry_record));
17071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
17081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Recreate the service to point at the db and corruption on disk.
171046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    service_.reset(new AppCacheServiceImpl(NULL));
17111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    service_->set_request_context(io_thread->request_context());
171203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    service_->Initialize(temp_directory_.path(),
171303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         db_thread->task_runner(),
171403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         db_thread->task_runner());
17151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    mock_quota_manager_proxy_ = new MockQuotaManagerProxy();
17161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    service_->quota_manager_proxy_ = mock_quota_manager_proxy_;
17171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate_.reset(new MockStorageDelegate(this));
17181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Additional setup to observe reinitailize happens.
17201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observer_.reset(new MockServiceObserver(this));
17211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    service_->AddObserver(observer_.get());
17221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // We continue after the init task is complete including the callback
17241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // on the current thread.
17251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    FlushDbThreadTasks();
17261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
17271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        FROM_HERE,
17281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&AppCacheStorageImplTest::Continue_Reinitialize,
17291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   base::Unretained(this),
17301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   test_case));
17311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
17321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Continue_Reinitialize(ReinitTestCase test_case) {
17341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const int kMockProcessId = 1;
17351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    backend_.reset(new AppCacheBackendImpl);
17361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    backend_->Initialize(service_.get(), &frontend_, kMockProcessId);
17371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_SQL_ON_INSTALL) {
17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Break the db file
17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(database()->was_corruption_detected());
17415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(sql::test::CorruptSizeInHeader(
17425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          temp_directory_.path().AppendASCII("Index")));
17435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
17445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
17455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_CACHE_ON_INSTALL  ||
17465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_case == CORRUPT_SQL_ON_INSTALL) {
17471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // Try to create a new appcache, the resulting update job will
17481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // eventually fail when it gets to disk cache initialization.
17491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      backend_->RegisterHost(1);
17501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheHost* host1 = backend_->GetHost(1);
17511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const GURL kEmptyPageUrl(MockHttpServer::GetMockUrl("empty.html"));
17521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      host1->first_party_url_ = kEmptyPageUrl;
17531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      host1->SelectCache(kEmptyPageUrl,
1754f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         kAppCacheNoCacheId,
17551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         MockHttpServer::GetMockUrl("manifest"));
17561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else {
17575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(CORRUPT_CACHE_ON_LOAD_EXISTING, test_case);
17581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // Try to access the existing cache manifest.
17591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // The URLRequestJob  will eventually fail when it gets to disk
17601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // cache initialization.
17611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      backend_->RegisterHost(2);
17621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheHost* host2 = backend_->GetHost(2);
17631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GURL manifest_url = MockHttpServer::GetMockUrl("manifest");
17640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      request_ = service()->request_context()->CreateRequest(
1765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          manifest_url, net::DEFAULT_PRIORITY, NULL, NULL);
17661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheInterceptor::SetExtraRequestInfo(
17671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          request_.get(), service_.get(),
17681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          backend_->process_id(), host2->host_id(),
17695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          RESOURCE_TYPE_MAIN_FRAME);
17701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      request_->Start();
17711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
17721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PushNextTask(base::Bind(
17741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        &AppCacheStorageImplTest::Verify_Reinitialized,
17751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Unretained(this),
17761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_case));
17771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
17781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Verify_Reinitialized(ReinitTestCase test_case) {
17801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Verify we got notified of reinit and a new storage instance is created,
17811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // and that the old data has been deleted.
17821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_TRUE(observer_->observed_old_storage_.get());
17831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_TRUE(observer_->observed_old_storage_->storage() != storage());
17841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_FALSE(PathExists(
17851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        temp_directory_.path().AppendASCII("Cache").AppendASCII("index")));
17861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_FALSE(PathExists(
17871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        temp_directory_.path().AppendASCII("Index")));
17881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_SQL_ON_INSTALL) {
17905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AppCacheStorageImpl* storage = static_cast<AppCacheStorageImpl*>(
17915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          observer_->observed_old_storage_->storage());
17925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(storage->database_->was_corruption_detected());
17935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
17951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Verify that the hosts saw appropriate events.
17965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (test_case == CORRUPT_CACHE_ON_INSTALL ||
17975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_case == CORRUPT_SQL_ON_INSTALL) {
17981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(frontend_.error_event_was_raised_);
17991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheHost* host1 = backend_->GetHost(1);
18001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_FALSE(host1->associated_cache());
18011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FALSE(host1->group_being_updated_.get());
18021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(host1->disabled_storage_reference_.get());
18031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else {
18045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(CORRUPT_CACHE_ON_LOAD_EXISTING, test_case);
18051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AppCacheHost* host2 = backend_->GetHost(2);
18061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(1, host2->main_resource_cache_->cache_id());
18071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRUE(host2->disabled_storage_reference_.get());
18081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
18091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
18101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Cleanup and claim victory.
18111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    service_->RemoveObserver(observer_.get());
18121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    request_.reset();
18131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    backend_.reset();
18141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observer_.reset();
18151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TestFinished();
18161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
18171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test case helpers --------------------------------------------------
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AppCacheServiceImpl* service() {
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return service_.get();
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheStorageImpl* storage() {
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<AppCacheStorageImpl*>(service()->storage());
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheDatabase* database() {
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return storage()->database_;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStorageDelegate* delegate() {
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_.get();
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakeCacheAndGroup(
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& manifest_url, int64 group_id, int64 cache_id,
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool add_to_database) {
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppCacheEntry default_entry(
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AppCacheEntry::EXPLICIT, cache_id + kDefaultEntryIdOffset,
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kDefaultEntrySize);
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    group_ = new AppCacheGroup(storage(), manifest_url, group_id);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cache_ = new AppCache(storage(), cache_id);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->AddEntry(kDefaultEntryUrl, default_entry);
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_->set_complete(true);
1846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    group_->AddCache(cache_.get());
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (add_to_database) {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppCacheDatabase::GroupRecord group_record;
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_record.group_id = group_id;
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_record.manifest_url = manifest_url;
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_record.origin = manifest_url.GetOrigin();
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(database()->InsertGroup(&group_record));
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppCacheDatabase::CacheRecord cache_record;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_record.cache_id = cache_id;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_record.group_id = group_id;
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_record.online_wildcard = false;
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_record.update_time = kZeroTime;
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_record.cache_size = kDefaultEntrySize;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(database()->InsertCache(&cache_record));
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppCacheDatabase::EntryRecord entry_record;
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_record.cache_id = cache_id;
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_record.url = kDefaultEntryUrl;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_record.flags = default_entry.types();
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_record.response_id = default_entry.response_id();
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_record.response_size = default_entry.response_size();
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(database()->InsertEntry(&entry_record));
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      storage()->usage_map_[manifest_url.GetOrigin()] =
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default_entry.response_size();
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data members --------------------------------------------------
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::WaitableEvent> test_finished_event_;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::stack<base::Closure> task_stack_;
187746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<AppCacheServiceImpl> service_;
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockStorageDelegate> delegate_;
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockQuotaManagerProxy> mock_quota_manager_proxy_;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AppCacheGroup> group_;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AppCache> cache_;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AppCache> cache2_;
18831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
18841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Specifically for the Reinitalize test.
18851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ScopedTempDir temp_directory_;
18861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<MockServiceObserver> observer_;
18871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MockAppCacheFrontend frontend_;
18881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<AppCacheBackendImpl> backend_;
18891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<net::URLRequest> request_;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, LoadCache_Miss) {
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::LoadCache_Miss);
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, LoadCache_NearHit) {
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::LoadCache_NearHit);
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, CreateGroupInEmptyOrigin) {
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::CreateGroupInEmptyOrigin);
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, CreateGroupInPopulatedOrigin) {
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::CreateGroupInPopulatedOrigin);
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, LoadGroupAndCache_FarHit) {
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::LoadGroupAndCache_FarHit);
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, StoreNewGroup) {
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::StoreNewGroup);
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, StoreExistingGroup) {
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::StoreExistingGroup);
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, StoreExistingGroupExistingCache) {
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::StoreExistingGroupExistingCache);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, FailStoreGroup) {
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::FailStoreGroup);
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, MakeGroupObsolete) {
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::MakeGroupObsolete);
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, MarkEntryAsForeign) {
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::MarkEntryAsForeign);
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, MarkEntryAsForeignWithLoadInProgress) {
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::MarkEntryAsForeignWithLoadInProgress);
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindNoMainResponse) {
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::FindNoMainResponse);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainResponseInDatabase) {
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainResponseInDatabase);
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainResponseInWorkingSet) {
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainResponseInWorkingSet);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainFallbackResponseInDatabase) {
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainFallbackResponseInDatabase);
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainFallbackResponseInWorkingSet) {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainFallbackResponseInWorkingSet);
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainInterceptResponseInDatabase) {
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainInterceptResponseInDatabase);
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, BasicFindMainInterceptResponseInWorkingSet) {
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::BasicFindMainInterceptResponseInWorkingSet);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindMainResponseWithMultipleHits) {
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::FindMainResponseWithMultipleHits);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindMainResponseExclusionsInDatabase) {
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::FindMainResponseExclusionsInDatabase);
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindMainResponseExclusionsInWorkingSet) {
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnIOThread(
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &AppCacheStorageImplTest::FindMainResponseExclusionsInWorkingSet);
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindInterceptPatternMatchInWorkingSet) {
1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestOnIOThread(
1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &AppCacheStorageImplTest::FindInterceptPatternMatchInWorkingSet);
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindInterceptPatternMatchInDatabase) {
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestOnIOThread(
1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &AppCacheStorageImplTest::FindInterceptPatternMatchInDatabase);
1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindFallbackPatternMatchInWorkingSet) {
2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestOnIOThread(
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &AppCacheStorageImplTest::FindFallbackPatternMatchInWorkingSet);
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AppCacheStorageImplTest, FindFallbackPatternMatchInDatabase) {
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestOnIOThread(
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &AppCacheStorageImplTest::FindFallbackPatternMatchInDatabase);
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, Reinitialize1) {
20121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::Reinitialize1);
20131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
20141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
20151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, Reinitialize2) {
20161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::Reinitialize2);
20171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
20181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
20195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AppCacheStorageImplTest, Reinitialize3) {
20205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunTestOnIOThread(&AppCacheStorageImplTest::Reinitialize3);
20215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// That's all folks!
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
2026