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