diff options
Diffstat (limited to 'chromium/webkit/browser/appcache/appcache_update_job_unittest.cc')
-rw-r--r-- | chromium/webkit/browser/appcache/appcache_update_job_unittest.cc | 3692 |
1 files changed, 0 insertions, 3692 deletions
diff --git a/chromium/webkit/browser/appcache/appcache_update_job_unittest.cc b/chromium/webkit/browser/appcache/appcache_update_job_unittest.cc deleted file mode 100644 index 3468758944f..00000000000 --- a/chromium/webkit/browser/appcache/appcache_update_job_unittest.cc +++ /dev/null @@ -1,3692 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/stl_util.h" -#include "base/synchronization/waitable_event.h" -#include "base/threading/thread.h" -#include "net/base/net_errors.h" -#include "net/http/http_response_headers.h" -#include "net/url_request/url_request_error_job.h" -#include "net/url_request/url_request_job_factory_impl.h" -#include "net/url_request/url_request_test_job.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "webkit/browser/appcache/appcache_group.h" -#include "webkit/browser/appcache/appcache_host.h" -#include "webkit/browser/appcache/appcache_response.h" -#include "webkit/browser/appcache/appcache_update_job.h" -#include "webkit/browser/appcache/mock_appcache_service.h" - -namespace appcache { -class AppCacheUpdateJobTest; - -namespace { - -const char kManifest1Contents[] = - "CACHE MANIFEST\n" - "explicit1\n" - "FALLBACK:\n" - "fallback1 fallback1a\n" - "NETWORK:\n" - "*\n"; - -// There are a handful of http accessible resources that we need to conduct -// these tests. Instead of running a seperate server to host these resources, -// we mock them up. -class MockHttpServer { - public: - static GURL GetMockUrl(const std::string& path) { - return GURL("http://mockhost/" + path); - } - - static GURL GetMockHttpsUrl(const std::string& path) { - return GURL("https://mockhost/" + path); - } - - static GURL GetMockCrossOriginHttpsUrl(const std::string& path) { - return GURL("https://cross_origin_host/" + path); - } - - static net::URLRequestJob* JobFactory( - net::URLRequest* request, net::NetworkDelegate* network_delegate) { - if (request->url().host() != "mockhost" && - request->url().host() != "cross_origin_host") - return new net::URLRequestErrorJob(request, network_delegate, -100); - - std::string headers, body; - GetMockResponse(request->url().path(), &headers, &body); - return new net::URLRequestTestJob( - request, network_delegate, headers, body, true); - } - - private: - static void GetMockResponse(const std::string& path, - std::string* headers, - std::string* body) { - const char ok_headers[] = - "HTTP/1.1 200 OK\0" - "\0"; - const char error_headers[] = - "HTTP/1.1 500 BOO HOO\0" - "\0"; - const char manifest_headers[] = - "HTTP/1.1 200 OK\0" - "Content-type: text/cache-manifest\0" - "\0"; - const char not_modified_headers[] = - "HTTP/1.1 304 NOT MODIFIED\0" - "\0"; - const char gone_headers[] = - "HTTP/1.1 410 GONE\0" - "\0"; - const char not_found_headers[] = - "HTTP/1.1 404 NOT FOUND\0" - "\0"; - const char no_store_headers[] = - "HTTP/1.1 200 OK\0" - "Cache-Control: no-store\0" - "\0"; - - if (path == "/files/missing-mime-manifest") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = "CACHE MANIFEST\n"; - } else if (path == "/files/bad-manifest") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "BAD CACHE MANIFEST"; - } else if (path == "/files/empty1") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = ""; - } else if (path == "/files/empty-file-manifest") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "empty1\n"; - } else if (path == "/files/empty-manifest") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n"; - } else if (path == "/files/explicit1") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = "explicit1"; - } else if (path == "/files/explicit2") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = "explicit2"; - } else if (path == "/files/fallback1a") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = "fallback1a"; - } else if (path == "/files/intercept1a") { - (*headers) = std::string(ok_headers, arraysize(ok_headers)); - (*body) = "intercept1a"; - } else if (path == "/files/gone") { - (*headers) = std::string(gone_headers, arraysize(gone_headers)); - (*body) = ""; - } else if (path == "/files/manifest1") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = kManifest1Contents; - } else if (path == "/files/manifest1-with-notmodified") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = kManifest1Contents; - (*body).append("CACHE:\n" - "notmodified\n"); - } else if (path == "/files/manifest-fb-404") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "explicit1\n" - "FALLBACK:\n" - "fallback1 fallback1a\n" - "fallback404 fallback-404\n" - "NETWORK:\n" - "online1\n"; - } else if (path == "/files/manifest-merged-types") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "explicit1\n" - "# manifest is also an explicit entry\n" - "manifest-merged-types\n" - "FALLBACK:\n" - "# fallback is also explicit entry\n" - "fallback1 explicit1\n" - "NETWORK:\n" - "online1\n"; - } else if (path == "/files/manifest-with-404") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "explicit-404\n" - "explicit1\n" - "explicit2\n" - "explicit3\n" - "FALLBACK:\n" - "fallback1 fallback1a\n" - "NETWORK:\n" - "online1\n"; - } else if (path == "/files/manifest-with-intercept") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "CHROMIUM-INTERCEPT:\n" - "intercept1 return intercept1a\n"; - } else if (path == "/files/notmodified") { - (*headers) = std::string(not_modified_headers, - arraysize(not_modified_headers)); - (*body) = ""; - } else if (path == "/files/servererror") { - (*headers) = std::string(error_headers, - arraysize(error_headers)); - (*body) = "error"; - } else if (path == "/files/valid_cross_origin_https_manifest") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "https://cross_origin_host/files/explicit1\n"; - } else if (path == "/files/invalid_cross_origin_https_manifest") { - (*headers) = std::string(manifest_headers, arraysize(manifest_headers)); - (*body) = "CACHE MANIFEST\n" - "https://cross_origin_host/files/no-store-headers\n"; - } else if (path == "/files/no-store-headers") { - (*headers) = std::string(no_store_headers, arraysize(no_store_headers)); - (*body) = "no-store"; - } else { - (*headers) = std::string(not_found_headers, - arraysize(not_found_headers)); - (*body) = ""; - } - } -}; - -class MockHttpServerJobFactory - : public net::URLRequestJobFactory::ProtocolHandler { - public: - virtual net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const OVERRIDE { - return MockHttpServer::JobFactory(request, network_delegate); - } -}; - -inline bool operator==(const Namespace& lhs, const Namespace& rhs) { - return lhs.type == rhs.type && - lhs.namespace_url == rhs.namespace_url && - lhs.target_url == rhs.target_url; -} - -} // namespace - -class MockFrontend : public AppCacheFrontend { - public: - MockFrontend() - : ignore_progress_events_(false), verify_progress_events_(false), - last_progress_total_(-1), last_progress_complete_(-1), - start_update_trigger_(CHECKING_EVENT), update_(NULL) { - } - - virtual void OnCacheSelected( - int host_id, const appcache::AppCacheInfo& info) OVERRIDE { - } - - virtual void OnStatusChanged(const std::vector<int>& host_ids, - Status status) OVERRIDE { - } - - virtual void OnEventRaised(const std::vector<int>& host_ids, - EventID event_id) OVERRIDE { - raised_events_.push_back(RaisedEvent(host_ids, event_id)); - - // Trigger additional updates if requested. - if (event_id == start_update_trigger_ && update_) { - for (std::vector<AppCacheHost*>::iterator it = update_hosts_.begin(); - it != update_hosts_.end(); ++it) { - AppCacheHost* host = *it; - update_->StartUpdate(host, - (host ? host->pending_master_entry_url() : GURL())); - } - update_hosts_.clear(); // only trigger once - } - } - - virtual void OnErrorEventRaised(const std::vector<int>& host_ids, - const std::string& message) OVERRIDE { - error_message_ = message; - OnEventRaised(host_ids, ERROR_EVENT); - } - - virtual void OnProgressEventRaised(const std::vector<int>& host_ids, - const GURL& url, - int num_total, - int num_complete) OVERRIDE { - if (!ignore_progress_events_) - OnEventRaised(host_ids, PROGRESS_EVENT); - - if (verify_progress_events_) { - EXPECT_GE(num_total, num_complete); - EXPECT_GE(num_complete, 0); - - if (last_progress_total_ == -1) { - // Should start at zero. - EXPECT_EQ(0, num_complete); - } else { - // Total should be stable and complete should bump up by one at a time. - EXPECT_EQ(last_progress_total_, num_total); - EXPECT_EQ(last_progress_complete_ + 1, num_complete); - } - - // Url should be valid for all except the 'final' event. - if (num_total == num_complete) - EXPECT_TRUE(url.is_empty()); - else - EXPECT_TRUE(url.is_valid()); - - last_progress_total_ = num_total; - last_progress_complete_ = num_complete; - } - } - - virtual void OnLogMessage(int host_id, - appcache::LogLevel log_level, - const std::string& message) OVERRIDE { - } - - virtual void OnContentBlocked(int host_id, - const GURL& manifest_url) OVERRIDE { - } - - void AddExpectedEvent(const std::vector<int>& host_ids, EventID event_id) { - DCHECK(!ignore_progress_events_ || event_id != PROGRESS_EVENT); - expected_events_.push_back(RaisedEvent(host_ids, event_id)); - } - - void SetIgnoreProgressEvents(bool ignore) { - // Some tests involve joining new hosts to an already running update job - // or intentionally failing. The timing and sequencing of the progress - // events generated by an update job are dependent on the behavior of - // an external HTTP server. For jobs that do not run fully till completion, - // due to either joining late or early exit, we skip monitoring the - // progress events to avoid flakiness. - ignore_progress_events_ = ignore; - } - - void SetVerifyProgressEvents(bool verify) { - verify_progress_events_ = verify; - } - - void TriggerAdditionalUpdates(EventID trigger_event, - AppCacheUpdateJob* update) { - start_update_trigger_ = trigger_event; - update_ = update; - } - - void AdditionalUpdateHost(AppCacheHost* host) { - update_hosts_.push_back(host); - } - - typedef std::vector<int> HostIds; - typedef std::pair<HostIds, EventID> RaisedEvent; - typedef std::vector<RaisedEvent> RaisedEvents; - RaisedEvents raised_events_; - std::string error_message_; - - // Set the expected events if verification needs to happen asynchronously. - RaisedEvents expected_events_; - std::string expected_error_message_; - - bool ignore_progress_events_; - - bool verify_progress_events_; - int last_progress_total_; - int last_progress_complete_; - - // Add ability for frontend to add master entries to an inprogress update. - EventID start_update_trigger_; - AppCacheUpdateJob* update_; - std::vector<AppCacheHost*> update_hosts_; -}; - -// Helper factories to simulate redirected URL responses for tests. -class RedirectFactory : public net::URLRequestJobFactory::ProtocolHandler { - public: - virtual net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const OVERRIDE { - return new net::URLRequestTestJob( - request, - network_delegate, - net::URLRequestTestJob::test_redirect_headers(), - net::URLRequestTestJob::test_data_1(), - true); - } -}; - -// Helper class to simulate a URL that returns retry or success. -class RetryRequestTestJob : public net::URLRequestTestJob { - public: - enum RetryHeader { - NO_RETRY_AFTER, - NONZERO_RETRY_AFTER, - RETRY_AFTER_0, - }; - - static const GURL kRetryUrl; - - // Call this at the start of each retry test. - static void Initialize(int num_retry_responses, RetryHeader header, - int expected_requests) { - num_requests_ = 0; - num_retries_ = num_retry_responses; - retry_after_ = header; - expected_requests_ = expected_requests; - } - - // Verifies results at end of test and resets counters. - static void Verify() { - EXPECT_EQ(expected_requests_, num_requests_); - num_requests_ = 0; - expected_requests_ = 0; - } - - static net::URLRequestJob* RetryFactory( - net::URLRequest* request, net::NetworkDelegate* network_delegate) { - ++num_requests_; - if (num_retries_ > 0 && request->original_url() == kRetryUrl) { - --num_retries_; - return new RetryRequestTestJob( - request, network_delegate, RetryRequestTestJob::retry_headers(), 503); - } else { - return new RetryRequestTestJob( - request, - network_delegate, - RetryRequestTestJob::manifest_headers(), 200); - } - } - - virtual int GetResponseCode() const OVERRIDE { return response_code_; } - - private: - virtual ~RetryRequestTestJob() {} - - static std::string retry_headers() { - const char no_retry_after[] = - "HTTP/1.1 503 BOO HOO\0" - "\0"; - const char nonzero[] = - "HTTP/1.1 503 BOO HOO\0" - "Retry-After: 60\0" - "\0"; - const char retry_after_0[] = - "HTTP/1.1 503 BOO HOO\0" - "Retry-After: 0\0" - "\0"; - - switch (retry_after_) { - case NO_RETRY_AFTER: - return std::string(no_retry_after, arraysize(no_retry_after)); - case NONZERO_RETRY_AFTER: - return std::string(nonzero, arraysize(nonzero)); - case RETRY_AFTER_0: - default: - return std::string(retry_after_0, arraysize(retry_after_0)); - } - } - - static std::string manifest_headers() { - const char headers[] = - "HTTP/1.1 200 OK\0" - "Content-type: text/cache-manifest\0" - "\0"; - return std::string(headers, arraysize(headers)); - } - - static std::string data() { - return std::string("CACHE MANIFEST\r" - "http://retry\r"); // must be same as kRetryUrl - } - - RetryRequestTestJob(net::URLRequest* request, - net::NetworkDelegate* network_delegate, - const std::string& headers, - int response_code) - : net::URLRequestTestJob( - request, network_delegate, headers, data(), true), - response_code_(response_code) { - } - - int response_code_; - - static int num_requests_; - static int num_retries_; - static RetryHeader retry_after_; - static int expected_requests_; -}; - -class RetryRequestTestJobFactory - : public net::URLRequestJobFactory::ProtocolHandler { - public: - virtual net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const OVERRIDE { - return RetryRequestTestJob::RetryFactory(request, network_delegate); - } -}; - -// static -const GURL RetryRequestTestJob::kRetryUrl("http://retry"); -int RetryRequestTestJob::num_requests_ = 0; -int RetryRequestTestJob::num_retries_; -RetryRequestTestJob::RetryHeader RetryRequestTestJob::retry_after_; -int RetryRequestTestJob::expected_requests_ = 0; - -// Helper class to check for certain HTTP headers. -class HttpHeadersRequestTestJob : public net::URLRequestTestJob { - public: - // Call this at the start of each HTTP header-related test. - static void Initialize(const std::string& expect_if_modified_since, - const std::string& expect_if_none_match) { - expect_if_modified_since_ = expect_if_modified_since; - expect_if_none_match_ = expect_if_none_match; - } - - // Verifies results at end of test and resets class. - static void Verify() { - if (!expect_if_modified_since_.empty()) - EXPECT_TRUE(saw_if_modified_since_); - if (!expect_if_none_match_.empty()) - EXPECT_TRUE(saw_if_none_match_); - - // Reset. - expect_if_modified_since_.clear(); - saw_if_modified_since_ = false; - expect_if_none_match_.clear(); - saw_if_none_match_ = false; - already_checked_ = false; - } - - static net::URLRequestJob* IfModifiedSinceFactory( - net::URLRequest* request, net::NetworkDelegate* network_delegate) { - if (!already_checked_) { - already_checked_ = true; // only check once for a test - const net::HttpRequestHeaders& extra_headers = - request->extra_request_headers(); - std::string header_value; - saw_if_modified_since_ = - extra_headers.GetHeader( - net::HttpRequestHeaders::kIfModifiedSince, &header_value) && - header_value == expect_if_modified_since_; - - saw_if_none_match_ = - extra_headers.GetHeader( - net::HttpRequestHeaders::kIfNoneMatch, &header_value) && - header_value == expect_if_none_match_; - } - return MockHttpServer::JobFactory(request, network_delegate); - } - - protected: - virtual ~HttpHeadersRequestTestJob() {} - - private: - static std::string expect_if_modified_since_; - static bool saw_if_modified_since_; - static std::string expect_if_none_match_; - static bool saw_if_none_match_; - static bool already_checked_; -}; - -// static -std::string HttpHeadersRequestTestJob::expect_if_modified_since_; -bool HttpHeadersRequestTestJob::saw_if_modified_since_ = false; -std::string HttpHeadersRequestTestJob::expect_if_none_match_; -bool HttpHeadersRequestTestJob::saw_if_none_match_ = false; -bool HttpHeadersRequestTestJob::already_checked_ = false; - -class IfModifiedSinceJobFactory - : public net::URLRequestJobFactory::ProtocolHandler { - public: - virtual net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const OVERRIDE { - return HttpHeadersRequestTestJob::IfModifiedSinceFactory( - request, network_delegate); - } -}; - -class IOThread : public base::Thread { - public: - explicit IOThread(const char* name) - : base::Thread(name) { - } - - virtual ~IOThread() { - Stop(); - } - - net::URLRequestContext* request_context() { - return request_context_.get(); - } - - void SetNewJobFactory(net::URLRequestJobFactory* job_factory) { - DCHECK(job_factory); - job_factory_.reset(job_factory); - request_context_->set_job_factory(job_factory_.get()); - } - - virtual void Init() OVERRIDE { - scoped_ptr<net::URLRequestJobFactoryImpl> factory( - new net::URLRequestJobFactoryImpl()); - factory->SetProtocolHandler("http", new MockHttpServerJobFactory); - factory->SetProtocolHandler("https", new MockHttpServerJobFactory); - job_factory_ = factory.Pass(); - request_context_.reset(new net::TestURLRequestContext()); - request_context_->set_job_factory(job_factory_.get()); - } - - virtual void CleanUp() OVERRIDE { - request_context_.reset(); - job_factory_.reset(); - } - - private: - scoped_ptr<net::URLRequestJobFactory> job_factory_; - scoped_ptr<net::URLRequestContext> request_context_; -}; - -class AppCacheUpdateJobTest : public testing::Test, - public AppCacheGroup::UpdateObserver { - public: - AppCacheUpdateJobTest() - : do_checks_after_update_finished_(false), - expect_group_obsolete_(false), - expect_group_has_cache_(false), - expect_group_is_being_deleted_(false), - expect_old_cache_(NULL), - expect_newest_cache_(NULL), - expect_non_null_update_time_(false), - tested_manifest_(NONE), - tested_manifest_path_override_(NULL) { - io_thread_.reset(new IOThread("AppCacheUpdateJob IO test thread")); - base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); - io_thread_->StartWithOptions(options); - } - - // Use a separate IO thread to run a test. Thread will be destroyed - // when it goes out of scope. - template <class Method> - void RunTestOnIOThread(Method method) { - event_.reset(new base::WaitableEvent(false, false)); - io_thread_->message_loop()->PostTask( - FROM_HERE, base::Bind(method, base::Unretained(this))); - - // Wait until task is done before exiting the test. - event_->Wait(); - } - - void StartCacheAttemptTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://failme"), - service_->storage()->NewGroupId()); - - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend mock_frontend; - AppCacheHost host(1, &mock_frontend, service_.get()); - - update->StartUpdate(&host, GURL()); - - // Verify state. - EXPECT_EQ(AppCacheUpdateJob::CACHE_ATTEMPT, update->update_type_); - EXPECT_EQ(AppCacheUpdateJob::FETCH_MANIFEST, update->internal_state_); - EXPECT_EQ(AppCacheGroup::CHECKING, group_->update_status()); - - // Verify notifications. - MockFrontend::RaisedEvents& events = mock_frontend.raised_events_; - size_t expected = 1; - EXPECT_EQ(expected, events.size()); - EXPECT_EQ(expected, events[0].first.size()); - EXPECT_EQ(host.host_id(), events[0].first[0]); - EXPECT_EQ(CHECKING_EVENT, events[0].second); - - // Abort as we're not testing actual URL fetches in this test. - delete update; - UpdateFinished(); - } - - void StartUpgradeAttemptTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - { - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://failme"), - service_->storage()->NewGroupId()); - - // Give the group some existing caches. - AppCache* cache1 = MakeCacheForGroup(1, 111); - AppCache* cache2 = MakeCacheForGroup(2, 222); - - // Associate some hosts with caches in the group. - MockFrontend mock_frontend1; - MockFrontend mock_frontend2; - MockFrontend mock_frontend3; - - AppCacheHost host1(1, &mock_frontend1, service_.get()); - host1.AssociateCompleteCache(cache1); - - AppCacheHost host2(2, &mock_frontend2, service_.get()); - host2.AssociateCompleteCache(cache2); - - AppCacheHost host3(3, &mock_frontend1, service_.get()); - host3.AssociateCompleteCache(cache1); - - AppCacheHost host4(4, &mock_frontend3, service_.get()); - - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - update->StartUpdate(&host4, GURL()); - - // Verify state after starting an update. - EXPECT_EQ(AppCacheUpdateJob::UPGRADE_ATTEMPT, update->update_type_); - EXPECT_EQ(AppCacheUpdateJob::FETCH_MANIFEST, update->internal_state_); - EXPECT_EQ(AppCacheGroup::CHECKING, group_->update_status()); - - // Verify notifications. - MockFrontend::RaisedEvents& events = mock_frontend1.raised_events_; - size_t expected = 1; - EXPECT_EQ(expected, events.size()); - expected = 2; // 2 hosts using frontend1 - EXPECT_EQ(expected, events[0].first.size()); - MockFrontend::HostIds& host_ids = events[0].first; - EXPECT_TRUE(std::find(host_ids.begin(), host_ids.end(), host1.host_id()) - != host_ids.end()); - EXPECT_TRUE(std::find(host_ids.begin(), host_ids.end(), host3.host_id()) - != host_ids.end()); - EXPECT_EQ(CHECKING_EVENT, events[0].second); - - events = mock_frontend2.raised_events_; - expected = 1; - EXPECT_EQ(expected, events.size()); - EXPECT_EQ(expected, events[0].first.size()); // 1 host using frontend2 - EXPECT_EQ(host2.host_id(), events[0].first[0]); - EXPECT_EQ(CHECKING_EVENT, events[0].second); - - events = mock_frontend3.raised_events_; - EXPECT_TRUE(events.empty()); - - // Abort as we're not testing actual URL fetches in this test. - delete update; - } - UpdateFinished(); - } - - void CacheAttemptFetchManifestFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://failme"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - update->manifest_fetcher_->request()->CancelWithError(-100); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeFetchManifestFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://failme"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - update->manifest_fetcher_->request()->CancelWithError(-100); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void ManifestRedirectTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RedirectFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://testme"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // redirect is like a failed request - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void ManifestMissingMimeTypeTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/missing-mime-manifest"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 33); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - frontend->SetVerifyProgressEvents(true); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = EMPTY_MANIFEST; - tested_manifest_path_override_ = "files/missing-mime-manifest"; - MockFrontend::HostIds ids(1, host->host_id()); - frontend->AddExpectedEvent(ids, CHECKING_EVENT); - frontend->AddExpectedEvent(ids, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void ManifestNotFoundTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/nosuchfile"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = true; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, OBSOLETE_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, OBSOLETE_EVENT); - - WaitForUpdateToFinish(); - } - - void ManifestGoneTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/gone"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void CacheAttemptNotModifiedTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/notmodified"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // treated like cache failure - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeNotModifiedTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/notmodified"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, NO_UPDATE_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, NO_UPDATE_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeManifestDataUnchangedTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Create response writer to get a response id. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - - AppCache* cache = MakeCacheForGroup(1, response_writer_->response_id()); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, NO_UPDATE_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, NO_UPDATE_EVENT); - - // Seed storage with expected manifest data. - const std::string seed_data(kManifest1Contents); - scoped_refptr<net::StringIOBuffer> io_buffer( - new net::StringIOBuffer(seed_data)); - response_writer_->WriteData( - io_buffer.get(), - seed_data.length(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - // See http://code.google.com/p/chromium/issues/detail?id=95101 - void Bug95101Test() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/empty-manifest"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Create a malformed cache with a missing manifest entry. - GURL wrong_manifest_url = - MockHttpServer::GetMockUrl("files/missing-mime-manifest"); - AppCache* cache = MakeCacheForGroup(1, wrong_manifest_url, 111); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_is_being_deleted_ = true; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds id(1, host->host_id()); - frontend->AddExpectedEvent(id, CHECKING_EVENT); - frontend->AddExpectedEvent(id, ERROR_EVENT); - frontend->expected_error_message_ = - "Manifest entry not found in existing cache"; - WaitForUpdateToFinish(); - } - - void StartUpdateAfterSeedingStorageData(int result) { - ASSERT_GT(result, 0); - response_writer_.reset(); - - AppCacheUpdateJob* update = group_->update_job_; - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - WaitForUpdateToFinish(); - } - - void BasicCacheAttemptSuccessTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - GURL manifest_url = MockHttpServer::GetMockUrl("files/manifest1"); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), manifest_url, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = MANIFEST1; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void DownloadInterceptEntriesTest() { - // Ensures we download intercept entries too. - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - GURL manifest_url = - MockHttpServer::GetMockUrl("files/manifest-with-intercept"); - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), manifest_url, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = MANIFEST_WITH_INTERCEPT; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void BasicUpgradeSuccessTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Create a response writer to get a response id. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), - response_writer_->response_id()); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - frontend1->SetVerifyProgressEvents(true); - frontend2->SetVerifyProgressEvents(true); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, UPDATE_READY_EVENT); - - // Seed storage with expected manifest data different from manifest1. - const std::string seed_data("different"); - scoped_refptr<net::StringIOBuffer> io_buffer( - new net::StringIOBuffer(seed_data)); - response_writer_->WriteData( - io_buffer.get(), - seed_data.length(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void UpgradeLoadFromNewestCacheTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - // Give the newest cache an entry that is in storage. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit1"), - AppCacheEntry(AppCacheEntry::EXPLICIT, - response_writer_->response_id())); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - expect_response_ids_.insert( - std::map<GURL, int64>::value_type( - MockHttpServer::GetMockUrl("files/explicit1"), - response_writer_->response_id())); - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids(1, host->host_id()); - frontend->AddExpectedEvent(ids, CHECKING_EVENT); - frontend->AddExpectedEvent(ids, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids, UPDATE_READY_EVENT); - - // Seed storage with expected http response info for entry. Allow reuse. - const char data[] = - "HTTP/1.1 200 OK\0" - "Cache-Control: max-age=8675309\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->request_time = base::Time::Now(); - response_info->response_time = base::Time::Now(); - response_info->headers = headers; // adds ref to headers - scoped_refptr<HttpResponseInfoIOBuffer> io_buffer( - new HttpResponseInfoIOBuffer(response_info)); // adds ref to info - response_writer_->WriteInfo( - io_buffer.get(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void UpgradeNoLoadFromNewestCacheTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - // Give the newest cache an entry that is in storage. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit1"), - AppCacheEntry(AppCacheEntry::EXPLICIT, - response_writer_->response_id())); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids(1, host->host_id()); - frontend->AddExpectedEvent(ids, CHECKING_EVENT); - frontend->AddExpectedEvent(ids, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids, UPDATE_READY_EVENT); - - // Seed storage with expected http response info for entry. Do NOT - // allow reuse by setting an expires header in the past. - const char data[] = - "HTTP/1.1 200 OK\0" - "Expires: Thu, 01 Dec 1994 16:00:00 GMT\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->request_time = base::Time::Now(); - response_info->response_time = base::Time::Now(); - response_info->headers = headers; // adds ref to headers - scoped_refptr<HttpResponseInfoIOBuffer> io_buffer( - new HttpResponseInfoIOBuffer(response_info)); // adds ref to info - response_writer_->WriteInfo( - io_buffer.get(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void UpgradeLoadFromNewestCacheVaryHeaderTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - // Give the newest cache an entry that is in storage. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit1"), - AppCacheEntry(AppCacheEntry::EXPLICIT, - response_writer_->response_id())); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids(1, host->host_id()); - frontend->AddExpectedEvent(ids, CHECKING_EVENT); - frontend->AddExpectedEvent(ids, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids, UPDATE_READY_EVENT); - - // Seed storage with expected http response info for entry: a vary header. - const char data[] = - "HTTP/1.1 200 OK\0" - "Cache-Control: max-age=8675309\0" - "Vary: blah\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->request_time = base::Time::Now(); - response_info->response_time = base::Time::Now(); - response_info->headers = headers; // adds ref to headers - scoped_refptr<HttpResponseInfoIOBuffer> io_buffer( - new HttpResponseInfoIOBuffer(response_info)); // adds ref to info - response_writer_->WriteInfo( - io_buffer.get(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void UpgradeSuccessMergedTypesTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/manifest-merged-types"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - // Give the newest cache a master entry that is also one of the explicit - // entries in the manifest. - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit1"), - AppCacheEntry(AppCacheEntry::MASTER, 111)); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST_MERGED_TYPES; - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // explicit1 - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // manifest - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void CacheAttemptFailUrlFetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/manifest-with-404"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // 404 explicit url is cache failure - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeFailUrlFetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/manifest-fb-404"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 99); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - frontend1->SetIgnoreProgressEvents(true); - frontend2->SetIgnoreProgressEvents(true); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffectd by failed update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeFailMasterUrlFetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - tested_manifest_path_override_ = "files/manifest1-with-notmodified"; - - MakeService(); - const GURL kManifestUrl = - MockHttpServer::GetMockUrl(tested_manifest_path_override_); - group_ = new AppCacheGroup( - service_->storage(), kManifestUrl, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 25); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - // Give the newest cache some existing entries; one will fail with a 404. - cache->AddEntry( - MockHttpServer::GetMockUrl("files/notfound"), - AppCacheEntry(AppCacheEntry::MASTER, 222)); - cache->AddEntry( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER | AppCacheEntry::FOREIGN, 333)); - cache->AddEntry( - MockHttpServer::GetMockUrl("files/servererror"), - AppCacheEntry(AppCacheEntry::MASTER, 444)); - cache->AddEntry( - MockHttpServer::GetMockUrl("files/notmodified"), - AppCacheEntry(AppCacheEntry::EXPLICIT, 555)); - - // Seed the response_info working set with canned data for - // files/servererror and for files/notmodified to test that the - // existing entries for those resource are reused by the update job. - const char kData[] = - "HTTP/1.1 200 OK\0" - "Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT\0" - "\0"; - const std::string kRawHeaders(kData, arraysize(kData)); - MakeAppCacheResponseInfo(kManifestUrl, 444, kRawHeaders); - MakeAppCacheResponseInfo(kManifestUrl, 555, kRawHeaders); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER))); // foreign flag is dropped - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/servererror"), - AppCacheEntry(AppCacheEntry::MASTER))); - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/notmodified"), - AppCacheEntry(AppCacheEntry::EXPLICIT))); - expect_response_ids_.insert(std::map<GURL, int64>::value_type( - MockHttpServer::GetMockUrl("files/servererror"), 444)); // copied - expect_response_ids_.insert(std::map<GURL, int64>::value_type( - MockHttpServer::GetMockUrl("files/notmodified"), 555)); // copied - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // explicit1 - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // fallback1a - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // notfound - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // explicit2 - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // servererror - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // notmodified - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // explicit1 - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // fallback1a - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // notfound - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // explicit2 - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // servererror - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // notmodified - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void EmptyManifestTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/empty-manifest"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 33); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - frontend1->SetVerifyProgressEvents(true); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = EMPTY_MANIFEST; - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void EmptyFileTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/empty-file-manifest"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 22); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - frontend->SetVerifyProgressEvents(true); - - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = EMPTY_FILE_MANIFEST; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void RetryRequestTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Set some large number of times to return retry. - // Expect 1 manifest fetch and 3 retries. - RetryRequestTestJob::Initialize(5, RetryRequestTestJob::RETRY_AFTER_0, 4); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - RetryRequestTestJob::kRetryUrl, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void RetryNoRetryAfterTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Set some large number of times to return retry. - // Expect 1 manifest fetch and 0 retries. - RetryRequestTestJob::Initialize(5, RetryRequestTestJob::NO_RETRY_AFTER, 1); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - RetryRequestTestJob::kRetryUrl, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void RetryNonzeroRetryAfterTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Set some large number of times to return retry. - // Expect 1 request and 0 retry attempts. - RetryRequestTestJob::Initialize( - 5, RetryRequestTestJob::NONZERO_RETRY_AFTER, 1); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - RetryRequestTestJob::kRetryUrl, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void RetrySuccessTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Set 2 as the retry limit (does not exceed the max). - // Expect 1 manifest fetch, 2 retries, 1 url fetch, 1 manifest refetch. - RetryRequestTestJob::Initialize(2, RetryRequestTestJob::RETRY_AFTER_0, 5); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - RetryRequestTestJob::kRetryUrl, - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void RetryUrlTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Set 1 as the retry limit (does not exceed the max). - // Expect 1 manifest fetch, 1 url fetch, 1 url retry, 1 manifest refetch. - RetryRequestTestJob::Initialize(1, RetryRequestTestJob::RETRY_AFTER_0, 4); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://retryurl"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void FailStoreNewestCacheTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - MockAppCacheStorage* storage = - reinterpret_cast<MockAppCacheStorage*>(service_->storage()); - storage->SimulateStoreGroupAndNewestCacheFailure(); - - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // storage failed - frontend->AddExpectedEvent(MockFrontend::HostIds(1, host->host_id()), - CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeFailStoreNewestCacheTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - MockAppCacheStorage* storage = - reinterpret_cast<MockAppCacheStorage*>(service_->storage()); - storage->SimulateStoreGroupAndNewestCacheFailure(); - - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 11); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // unchanged - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryFailStoreNewestCacheTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - MockAppCacheStorage* storage = - reinterpret_cast<MockAppCacheStorage*>(service_->storage()); - storage->SimulateStoreGroupAndNewestCacheFailure(); - - const GURL kManifestUrl = MockHttpServer::GetMockUrl("files/notmodified"); - const int64 kManifestResponseId = 11; - - // Seed the response_info working set with canned data for - // files/servererror and for files/notmodified to test that the - // existing entries for those resource are reused by the update job. - const char kData[] = - "HTTP/1.1 200 OK\0" - "Content-type: text/cache-manifest\0" - "Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT\0" - "\0"; - const std::string kRawHeaders(kData, arraysize(kData)); - MakeAppCacheResponseInfo(kManifestUrl, kManifestResponseId, kRawHeaders); - - group_ = new AppCacheGroup( - service_->storage(), kManifestUrl, - service_->storage()->NewGroupId()); - scoped_refptr<AppCache> cache( - MakeCacheForGroup(service_->storage()->NewCacheId(), - kManifestResponseId)); - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->first_party_url_ = kManifestUrl; - host->SelectCache(MockHttpServer::GetMockUrl("files/empty1"), - kNoCacheId, kManifestUrl); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - tested_manifest_ = EMPTY_MANIFEST; - tested_manifest_path_override_ = "files/notmodified"; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache.get(); // unchanged - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, ERROR_EVENT); - frontend->expected_error_message_ = - "Failed to commit new cache to storage"; - - WaitForUpdateToFinish(); - } - - void UpgradeFailMakeGroupObsoleteTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - MockAppCacheStorage* storage = - reinterpret_cast<MockAppCacheStorage*>(service_->storage()); - storage->SimulateMakeGroupObsoleteFailure(); - - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/nosuchfile"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - AppCacheHost* host2 = MakeHost(2, frontend2); - host1->AssociateCompleteCache(cache); - host2->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryFetchManifestFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), GURL("http://failme"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->new_master_entry_url_ = GURL("http://failme/blah"); - update->StartUpdate(host, host->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - update->manifest_fetcher_->request()->CancelWithError(-100); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryBadManifestTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/bad-manifest"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->new_master_entry_url_ = MockHttpServer::GetMockUrl("files/blah"); - update->StartUpdate(host, host->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryManifestNotFoundTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/nosuchfile"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->new_master_entry_url_ = MockHttpServer::GetMockUrl("files/blah"); - - update->StartUpdate(host, host->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryFailUrlFetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/manifest-fb-404"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - frontend->SetIgnoreProgressEvents(true); - AppCacheHost* host = MakeHost(1, frontend); - host->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - - update->StartUpdate(host, host->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // 404 fallback url is cache failure - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids1, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryAllFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend1 = MakeMockFrontend(); - frontend1->SetIgnoreProgressEvents(true); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - update->StartUpdate(host1, host1->new_master_entry_url_); - - MockFrontend* frontend2 = MakeMockFrontend(); - frontend2->SetIgnoreProgressEvents(true); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/servererror"); - update->StartUpdate(host2, host2->new_master_entry_url_); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; // all pending masters failed - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeMasterEntryAllFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->AssociateCompleteCache(cache); - - MockFrontend* frontend2 = MakeMockFrontend(); - frontend2->SetIgnoreProgressEvents(true); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - update->StartUpdate(host2, host2->new_master_entry_url_); - - MockFrontend* frontend3 = MakeMockFrontend(); - frontend3->SetIgnoreProgressEvents(true); - AppCacheHost* host3 = MakeHost(3, frontend3); - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/servererror"); - update->StartUpdate(host3, host3->new_master_entry_url_); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend3->AddExpectedEvent(ids3, CHECKING_EVENT); - frontend3->AddExpectedEvent(ids3, DOWNLOADING_EVENT); - frontend3->AddExpectedEvent(ids3, ERROR_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntrySomeFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend1 = MakeMockFrontend(); - frontend1->SetIgnoreProgressEvents(true); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - update->StartUpdate(host1, host1->new_master_entry_url_); - - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - update->StartUpdate(host2, host2->new_master_entry_url_); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; // as long as one pending master succeeds - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER))); - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, ERROR_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, CACHED_EVENT); - - WaitForUpdateToFinish(); - } - - void UpgradeMasterEntrySomeFailTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->AssociateCompleteCache(cache); - - MockFrontend* frontend2 = MakeMockFrontend(); - frontend2->SetIgnoreProgressEvents(true); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - update->StartUpdate(host2, host2->new_master_entry_url_); - - MockFrontend* frontend3 = MakeMockFrontend(); - AppCacheHost* host3 = MakeHost(3, frontend3); - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - update->StartUpdate(host3, host3->new_master_entry_url_); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER))); - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend3->AddExpectedEvent(ids3, CHECKING_EVENT); - frontend3->AddExpectedEvent(ids3, DOWNLOADING_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); // final - frontend3->AddExpectedEvent(ids3, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void MasterEntryNoUpdateTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup(service_->storage(), - MockHttpServer::GetMockUrl("files/notmodified"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->AssociateCompleteCache(cache); - - // Give cache an existing entry that can also be fetched. - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::EXPLICIT, 222)); - - // Reset the update time to null so we can verify it gets - // modified in this test case by the UpdateJob. - cache->set_update_time(base::Time()); - - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - update->StartUpdate(host2, host2->new_master_entry_url_); - - AppCacheHost* host3 = MakeHost(3, frontend2); // same frontend as host2 - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - update->StartUpdate(host3, host3->new_master_entry_url_); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache still the same cache - expect_non_null_update_time_ = true; - tested_manifest_ = PENDING_MASTER_NO_UPDATE; - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, NO_UPDATE_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend2->AddExpectedEvent(ids3, CHECKING_EVENT); - MockFrontend::HostIds ids2and3; - ids2and3.push_back(host2->host_id()); - ids2and3.push_back(host3->host_id()); - frontend2->AddExpectedEvent(ids2and3, NO_UPDATE_EVENT); - - WaitForUpdateToFinish(); - } - - void StartUpdateMidCacheAttemptTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/manifest1"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - update->StartUpdate(host1, host1->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up additional updates to be started while update is in progress. - MockFrontend* frontend2 = MakeMockFrontend(); - frontend2->SetIgnoreProgressEvents(true); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - - MockFrontend* frontend3 = MakeMockFrontend(); - AppCacheHost* host3 = MakeHost(3, frontend3); - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - - MockFrontend* frontend4 = MakeMockFrontend(); - AppCacheHost* host4 = MakeHost(4, frontend4); - host4->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - - MockFrontend* frontend5 = MakeMockFrontend(); - AppCacheHost* host5 = MakeHost(5, frontend5); // no master entry url - - frontend1->TriggerAdditionalUpdates(DOWNLOADING_EVENT, update); - frontend1->AdditionalUpdateHost(host2); // fetch will fail - frontend1->AdditionalUpdateHost(host3); // same as an explicit entry - frontend1->AdditionalUpdateHost(host4); // same as another master entry - frontend1->AdditionalUpdateHost(NULL); // no host - frontend1->AdditionalUpdateHost(host5); // no master entry url - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER))); - MockFrontend::HostIds ids1(1, host1->host_id()); - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, CACHED_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend3->AddExpectedEvent(ids3, CHECKING_EVENT); - frontend3->AddExpectedEvent(ids3, DOWNLOADING_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); // final - frontend3->AddExpectedEvent(ids3, CACHED_EVENT); - MockFrontend::HostIds ids4(1, host4->host_id()); - frontend4->AddExpectedEvent(ids4, CHECKING_EVENT); - frontend4->AddExpectedEvent(ids4, DOWNLOADING_EVENT); - frontend4->AddExpectedEvent(ids4, PROGRESS_EVENT); - frontend4->AddExpectedEvent(ids4, PROGRESS_EVENT); - frontend4->AddExpectedEvent(ids4, PROGRESS_EVENT); // final - frontend4->AddExpectedEvent(ids4, CACHED_EVENT); - - // Host 5 is not associated with cache so no progress/cached events. - MockFrontend::HostIds ids5(1, host5->host_id()); - frontend5->AddExpectedEvent(ids5, CHECKING_EVENT); - frontend5->AddExpectedEvent(ids5, DOWNLOADING_EVENT); - - WaitForUpdateToFinish(); - } - - void StartUpdateMidNoUpdateTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), MockHttpServer::GetMockUrl("files/notmodified"), - service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(1, 111); - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->AssociateCompleteCache(cache); - - // Give cache an existing entry. - cache->AddEntry(MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::EXPLICIT, 222)); - - // Start update with a pending master entry that will fail to give us an - // event to trigger other updates. - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/nosuchfile"); - update->StartUpdate(host2, host2->new_master_entry_url_); - EXPECT_TRUE(update->manifest_fetcher_ != NULL); - - // Set up additional updates to be started while update is in progress. - MockFrontend* frontend3 = MakeMockFrontend(); - AppCacheHost* host3 = MakeHost(3, frontend3); - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - - MockFrontend* frontend4 = MakeMockFrontend(); - AppCacheHost* host4 = MakeHost(4, frontend4); // no master entry url - - MockFrontend* frontend5 = MakeMockFrontend(); - AppCacheHost* host5 = MakeHost(5, frontend5); - host5->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); // existing entry - - MockFrontend* frontend6 = MakeMockFrontend(); - AppCacheHost* host6 = MakeHost(6, frontend6); - host6->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - - frontend2->TriggerAdditionalUpdates(ERROR_EVENT, update); - frontend2->AdditionalUpdateHost(host3); - frontend2->AdditionalUpdateHost(NULL); // no host - frontend2->AdditionalUpdateHost(host4); // no master entry url - frontend2->AdditionalUpdateHost(host5); // same as existing cache entry - frontend2->AdditionalUpdateHost(host6); // same as another master entry - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_newest_cache_ = cache; // newest cache unaffected by update - tested_manifest_ = PENDING_MASTER_NO_UPDATE; - MockFrontend::HostIds ids1(1, host1->host_id()); // prior associated host - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, NO_UPDATE_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, ERROR_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend3->AddExpectedEvent(ids3, CHECKING_EVENT); - frontend3->AddExpectedEvent(ids3, NO_UPDATE_EVENT); - MockFrontend::HostIds ids4(1, host4->host_id()); // unassociated w/cache - frontend4->AddExpectedEvent(ids4, CHECKING_EVENT); - MockFrontend::HostIds ids5(1, host5->host_id()); - frontend5->AddExpectedEvent(ids5, CHECKING_EVENT); - frontend5->AddExpectedEvent(ids5, NO_UPDATE_EVENT); - MockFrontend::HostIds ids6(1, host6->host_id()); - frontend6->AddExpectedEvent(ids6, CHECKING_EVENT); - frontend6->AddExpectedEvent(ids6, NO_UPDATE_EVENT); - - WaitForUpdateToFinish(); - } - - void StartUpdateMidDownloadTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), 42); - MockFrontend* frontend1 = MakeMockFrontend(); - AppCacheHost* host1 = MakeHost(1, frontend1); - host1->AssociateCompleteCache(cache); - - update->StartUpdate(NULL, GURL()); - - // Set up additional updates to be started while update is in progress. - MockFrontend* frontend2 = MakeMockFrontend(); - AppCacheHost* host2 = MakeHost(2, frontend2); - host2->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit1"); - - MockFrontend* frontend3 = MakeMockFrontend(); - AppCacheHost* host3 = MakeHost(3, frontend3); - host3->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - - MockFrontend* frontend4 = MakeMockFrontend(); - AppCacheHost* host4 = MakeHost(4, frontend4); // no master entry url - - MockFrontend* frontend5 = MakeMockFrontend(); - AppCacheHost* host5 = MakeHost(5, frontend5); - host5->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - - frontend1->TriggerAdditionalUpdates(PROGRESS_EVENT, update); - frontend1->AdditionalUpdateHost(host2); // same as entry in manifest - frontend1->AdditionalUpdateHost(NULL); // no host - frontend1->AdditionalUpdateHost(host3); // new master entry - frontend1->AdditionalUpdateHost(host4); // no master entry url - frontend1->AdditionalUpdateHost(host5); // same as another master entry - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - MockHttpServer::GetMockUrl("files/explicit2"), - AppCacheEntry(AppCacheEntry::MASTER))); - MockFrontend::HostIds ids1(1, host1->host_id()); // prior associated host - frontend1->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend1->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend1->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend1->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - MockFrontend::HostIds ids2(1, host2->host_id()); - frontend2->AddExpectedEvent(ids2, CHECKING_EVENT); - frontend2->AddExpectedEvent(ids2, DOWNLOADING_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); - frontend2->AddExpectedEvent(ids2, PROGRESS_EVENT); // final - frontend2->AddExpectedEvent(ids2, UPDATE_READY_EVENT); - MockFrontend::HostIds ids3(1, host3->host_id()); - frontend3->AddExpectedEvent(ids3, CHECKING_EVENT); - frontend3->AddExpectedEvent(ids3, DOWNLOADING_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); - frontend3->AddExpectedEvent(ids3, PROGRESS_EVENT); // final - frontend3->AddExpectedEvent(ids3, UPDATE_READY_EVENT); - MockFrontend::HostIds ids4(1, host4->host_id()); // unassociated w/cache - frontend4->AddExpectedEvent(ids4, CHECKING_EVENT); - frontend4->AddExpectedEvent(ids4, DOWNLOADING_EVENT); - MockFrontend::HostIds ids5(1, host5->host_id()); - frontend5->AddExpectedEvent(ids5, CHECKING_EVENT); - frontend5->AddExpectedEvent(ids5, DOWNLOADING_EVENT); - frontend5->AddExpectedEvent(ids5, PROGRESS_EVENT); - frontend5->AddExpectedEvent(ids5, PROGRESS_EVENT); // final - frontend5->AddExpectedEvent(ids5, UPDATE_READY_EVENT); - - WaitForUpdateToFinish(); - } - - void QueueMasterEntryTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Pretend update job has been running and is about to terminate. - group_->update_status_ = AppCacheGroup::DOWNLOADING; - update->internal_state_ = AppCacheUpdateJob::REFETCH_MANIFEST; - EXPECT_TRUE(update->IsTerminating()); - - // Start an update. Should be queued. - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->new_master_entry_url_ = - MockHttpServer::GetMockUrl("files/explicit2"); - update->StartUpdate(host, host->new_master_entry_url_); - EXPECT_TRUE(update->pending_master_entries_.empty()); - EXPECT_FALSE(group_->queued_updates_.empty()); - - // Delete update, causing it to finish, which should trigger a new update - // for the queued host and master entry after a delay. - delete update; - EXPECT_FALSE(group_->restart_update_task_.IsCancelled()); - - // Set up checks for when queued update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = MANIFEST1; - expect_extra_entries_.insert(AppCache::EntryMap::value_type( - host->new_master_entry_url_, AppCacheEntry(AppCacheEntry::MASTER))); - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids1, CACHED_EVENT); - - // Group status will be IDLE so cannot call WaitForUpdateToFinish. - group_->AddUpdateObserver(this); - } - - void IfModifiedSinceTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), GURL("http://headertest"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // First test against a cache attempt. Will start manifest fetch - // synchronously. - HttpHeadersRequestTestJob::Initialize(std::string(), std::string()); - MockFrontend mock_frontend; - AppCacheHost host(1, &mock_frontend, service_.get()); - update->StartUpdate(&host, GURL()); - HttpHeadersRequestTestJob::Verify(); - delete update; - - // Now simulate a refetch manifest request. Will start fetch request - // synchronously. - const char data[] = - "HTTP/1.1 200 OK\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->headers = headers; // adds ref to headers - - HttpHeadersRequestTestJob::Initialize(std::string(), std::string()); - update = new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - group_->update_status_ = AppCacheGroup::DOWNLOADING; - update->manifest_response_info_.reset(response_info); - update->internal_state_ = AppCacheUpdateJob::REFETCH_MANIFEST; - update->FetchManifest(false); // not first request - HttpHeadersRequestTestJob::Verify(); - delete update; - - // Change the headers to include a Last-Modified header. Manifest refetch - // should include If-Modified-Since header. - const char data2[] = - "HTTP/1.1 200 OK\0" - "Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT\0" - "\0"; - net::HttpResponseHeaders* headers2 = - new net::HttpResponseHeaders(std::string(data2, arraysize(data2))); - response_info = new net::HttpResponseInfo(); - response_info->headers = headers2; - - HttpHeadersRequestTestJob::Initialize("Sat, 29 Oct 1994 19:43:31 GMT", - std::string()); - update = new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - group_->update_status_ = AppCacheGroup::DOWNLOADING; - update->manifest_response_info_.reset(response_info); - update->internal_state_ = AppCacheUpdateJob::REFETCH_MANIFEST; - update->FetchManifest(false); // not first request - HttpHeadersRequestTestJob::Verify(); - delete update; - - UpdateFinished(); - } - - void IfModifiedSinceUpgradeTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - HttpHeadersRequestTestJob::Initialize("Sat, 29 Oct 1994 19:43:31 GMT", - std::string()); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ =new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Give the newest cache a manifest enry that is in storage. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), - response_writer_->response_id()); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - - // Seed storage with expected manifest response info that will cause - // an If-Modified-Since header to be put in the manifest fetch request. - const char data[] = - "HTTP/1.1 200 OK\0" - "Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->headers = headers; // adds ref to headers - scoped_refptr<HttpResponseInfoIOBuffer> io_buffer( - new HttpResponseInfoIOBuffer(response_info)); // adds ref to info - response_writer_->WriteInfo( - io_buffer.get(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void IfNoneMatchUpgradeTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - HttpHeadersRequestTestJob::Initialize(std::string(), "\"LadeDade\""); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), - MockHttpServer::GetMockUrl("files/manifest1"), - 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Give the newest cache a manifest enry that is in storage. - response_writer_.reset( - service_->storage()->CreateResponseWriter(group_->manifest_url(), - group_->group_id())); - - AppCache* cache = MakeCacheForGroup(service_->storage()->NewCacheId(), - response_writer_->response_id()); - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - host->AssociateCompleteCache(cache); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - expect_old_cache_ = cache; - tested_manifest_ = MANIFEST1; - MockFrontend::HostIds ids1(1, host->host_id()); - frontend->AddExpectedEvent(ids1, CHECKING_EVENT); - frontend->AddExpectedEvent(ids1, DOWNLOADING_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); - frontend->AddExpectedEvent(ids1, PROGRESS_EVENT); // final - frontend->AddExpectedEvent(ids1, UPDATE_READY_EVENT); - - // Seed storage with expected manifest response info that will cause - // an If-None-Match header to be put in the manifest fetch request. - const char data[] = - "HTTP/1.1 200 OK\0" - "ETag: \"LadeDade\"\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->headers = headers; // adds ref to headers - scoped_refptr<HttpResponseInfoIOBuffer> io_buffer( - new HttpResponseInfoIOBuffer(response_info)); // adds ref to info - response_writer_->WriteInfo( - io_buffer.get(), - base::Bind(&AppCacheUpdateJobTest::StartUpdateAfterSeedingStorageData, - base::Unretained(this))); - - // Start update after data write completes asynchronously. - } - - void IfNoneMatchRefetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - HttpHeadersRequestTestJob::Initialize(std::string(), "\"LadeDade\""); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), GURL("http://headertest"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Simulate a refetch manifest request that uses an ETag header. - const char data[] = - "HTTP/1.1 200 OK\0" - "ETag: \"LadeDade\"\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->headers = headers; // adds ref to headers - - group_->update_status_ = AppCacheGroup::DOWNLOADING; - update->manifest_response_info_.reset(response_info); - update->internal_state_ = AppCacheUpdateJob::REFETCH_MANIFEST; - update->FetchManifest(false); // not first request - HttpHeadersRequestTestJob::Verify(); - delete update; - - UpdateFinished(); - } - - void MultipleHeadersRefetchTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - // Verify that code is correct when building multiple extra headers. - HttpHeadersRequestTestJob::Initialize( - "Sat, 29 Oct 1994 19:43:31 GMT", "\"LadeDade\""); - net::URLRequestJobFactoryImpl* new_factory( - new net::URLRequestJobFactoryImpl); - new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); - io_thread_->SetNewJobFactory(new_factory); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), GURL("http://headertest"), 111); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - // Simulate a refetch manifest request that uses an ETag header. - const char data[] = - "HTTP/1.1 200 OK\0" - "Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT\0" - "ETag: \"LadeDade\"\0" - "\0"; - net::HttpResponseHeaders* headers = - new net::HttpResponseHeaders(std::string(data, arraysize(data))); - net::HttpResponseInfo* response_info = new net::HttpResponseInfo(); - response_info->headers = headers; // adds ref to headers - - group_->update_status_ = AppCacheGroup::DOWNLOADING; - update->manifest_response_info_.reset(response_info); - update->internal_state_ = AppCacheUpdateJob::REFETCH_MANIFEST; - update->FetchManifest(false); // not first request - HttpHeadersRequestTestJob::Verify(); - delete update; - - UpdateFinished(); - } - - void CrossOriginHttpsSuccessTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - GURL manifest_url = MockHttpServer::GetMockHttpsUrl( - "files/valid_cross_origin_https_manifest"); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), manifest_url, service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = true; - tested_manifest_ = NONE; - MockFrontend::HostIds host_ids(1, host->host_id()); - frontend->AddExpectedEvent(host_ids, CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void CrossOriginHttpsDeniedTest() { - ASSERT_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type()); - - GURL manifest_url = MockHttpServer::GetMockHttpsUrl( - "files/invalid_cross_origin_https_manifest"); - - MakeService(); - group_ = new AppCacheGroup( - service_->storage(), manifest_url, service_->storage()->NewGroupId()); - AppCacheUpdateJob* update = - new AppCacheUpdateJob(service_.get(), group_.get()); - group_->update_job_ = update; - - MockFrontend* frontend = MakeMockFrontend(); - AppCacheHost* host = MakeHost(1, frontend); - update->StartUpdate(host, GURL()); - - // Set up checks for when update job finishes. - do_checks_after_update_finished_ = true; - expect_group_obsolete_ = false; - expect_group_has_cache_ = false; - tested_manifest_ = NONE; - MockFrontend::HostIds host_ids(1, host->host_id()); - frontend->AddExpectedEvent(host_ids, CHECKING_EVENT); - - WaitForUpdateToFinish(); - } - - void WaitForUpdateToFinish() { - if (group_->update_status() == AppCacheGroup::IDLE) - UpdateFinished(); - else - group_->AddUpdateObserver(this); - } - - virtual void OnUpdateComplete(AppCacheGroup* group) OVERRIDE { - ASSERT_EQ(group_, group); - protect_newest_cache_ = group->newest_complete_cache(); - UpdateFinished(); - } - - void UpdateFinished() { - // We unwind the stack prior to finishing up to let stack-based objects - // get deleted. - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&AppCacheUpdateJobTest::UpdateFinishedUnwound, - base::Unretained(this))); - } - - void UpdateFinishedUnwound() { - EXPECT_EQ(AppCacheGroup::IDLE, group_->update_status()); - EXPECT_TRUE(group_->update_job() == NULL); - if (do_checks_after_update_finished_) - VerifyExpectations(); - - // Clean up everything that was created on the IO thread. - protect_newest_cache_ = NULL; - group_ = NULL; - STLDeleteContainerPointers(hosts_.begin(), hosts_.end()); - STLDeleteContainerPointers(frontends_.begin(), frontends_.end()); - response_infos_.clear(); - service_.reset(NULL); - - event_->Signal(); - } - - void MakeService() { - service_.reset(new MockAppCacheService()); - service_->set_request_context(io_thread_->request_context()); - } - - AppCache* MakeCacheForGroup(int64 cache_id, int64 manifest_response_id) { - return MakeCacheForGroup(cache_id, group_->manifest_url(), - manifest_response_id); - } - - AppCache* MakeCacheForGroup(int64 cache_id, const GURL& manifest_entry_url, - int64 manifest_response_id) { - AppCache* cache = new AppCache(service_->storage(), cache_id); - cache->set_complete(true); - cache->set_update_time(base::Time::Now()); - group_->AddCache(cache); - - // Add manifest entry to cache. - cache->AddEntry(manifest_entry_url, - AppCacheEntry(AppCacheEntry::MANIFEST, manifest_response_id)); - - return cache; - } - - AppCacheHost* MakeHost(int host_id, AppCacheFrontend* frontend) { - AppCacheHost* host = new AppCacheHost(host_id, frontend, service_.get()); - hosts_.push_back(host); - return host; - } - - AppCacheResponseInfo* MakeAppCacheResponseInfo( - const GURL& manifest_url, int64 response_id, - const std::string& raw_headers) { - net::HttpResponseInfo* http_info = new net::HttpResponseInfo(); - http_info->headers = new net::HttpResponseHeaders(raw_headers); - scoped_refptr<AppCacheResponseInfo> info( - new AppCacheResponseInfo(service_->storage(), manifest_url, - response_id, http_info, 0)); - response_infos_.push_back(info); - return info.get(); - } - - MockFrontend* MakeMockFrontend() { - MockFrontend* frontend = new MockFrontend(); - frontends_.push_back(frontend); - return frontend; - } - - // Verifies conditions about the group and notifications after an update - // has finished. Cannot verify update job internals as update is deleted. - void VerifyExpectations() { - RetryRequestTestJob::Verify(); - HttpHeadersRequestTestJob::Verify(); - - EXPECT_EQ(expect_group_obsolete_, group_->is_obsolete()); - EXPECT_EQ(expect_group_is_being_deleted_, group_->is_being_deleted()); - - if (expect_group_has_cache_) { - EXPECT_TRUE(group_->newest_complete_cache() != NULL); - - if (expect_non_null_update_time_) - EXPECT_TRUE(!group_->newest_complete_cache()->update_time().is_null()); - - if (expect_old_cache_) { - EXPECT_NE(expect_old_cache_, group_->newest_complete_cache()); - EXPECT_TRUE(group_->old_caches().end() != - std::find(group_->old_caches().begin(), - group_->old_caches().end(), expect_old_cache_)); - } - if (expect_newest_cache_) { - EXPECT_EQ(expect_newest_cache_, group_->newest_complete_cache()); - EXPECT_TRUE(group_->old_caches().end() == - std::find(group_->old_caches().begin(), - group_->old_caches().end(), expect_newest_cache_)); - } else { - // Tests that don't know which newest cache to expect contain updates - // that succeed (because the update creates a new cache whose pointer - // is unknown to the test). Check group and newest cache were stored - // when update succeeds. - MockAppCacheStorage* storage = - reinterpret_cast<MockAppCacheStorage*>(service_->storage()); - EXPECT_TRUE(storage->IsGroupStored(group_.get())); - EXPECT_TRUE(storage->IsCacheStored(group_->newest_complete_cache())); - - // Check that all entries in the newest cache were stored. - const AppCache::EntryMap& entries = - group_->newest_complete_cache()->entries(); - for (AppCache::EntryMap::const_iterator it = entries.begin(); - it != entries.end(); ++it) { - EXPECT_NE(kNoResponseId, it->second.response_id()); - - // Check that any copied entries have the expected response id - // and that entries that are not copied have a different response id. - std::map<GURL, int64>::iterator found = - expect_response_ids_.find(it->first); - if (found != expect_response_ids_.end()) { - EXPECT_EQ(found->second, it->second.response_id()); - } else if (expect_old_cache_) { - AppCacheEntry* old_entry = expect_old_cache_->GetEntry(it->first); - if (old_entry) - EXPECT_NE(old_entry->response_id(), it->second.response_id()); - } - } - } - } else { - EXPECT_TRUE(group_->newest_complete_cache() == NULL); - } - - // Check expected events. - for (size_t i = 0; i < frontends_.size(); ++i) { - MockFrontend* frontend = frontends_[i]; - - MockFrontend::RaisedEvents& expected_events = frontend->expected_events_; - MockFrontend::RaisedEvents& actual_events = frontend->raised_events_; - EXPECT_EQ(expected_events.size(), actual_events.size()); - - // Check each expected event. - for (size_t j = 0; - j < expected_events.size() && j < actual_events.size(); ++j) { - EXPECT_EQ(expected_events[j].second, actual_events[j].second); - - MockFrontend::HostIds& expected_ids = expected_events[j].first; - MockFrontend::HostIds& actual_ids = actual_events[j].first; - EXPECT_EQ(expected_ids.size(), actual_ids.size()); - - for (size_t k = 0; k < expected_ids.size(); ++k) { - int id = expected_ids[k]; - EXPECT_TRUE(std::find(actual_ids.begin(), actual_ids.end(), id) != - actual_ids.end()); - } - } - - if (!frontend->expected_error_message_.empty()) { - EXPECT_EQ(frontend->expected_error_message_, - frontend->error_message_); - } - } - - // Verify expected cache contents last as some checks are asserts - // and will abort the test if they fail. - if (tested_manifest_) { - AppCache* cache = group_->newest_complete_cache(); - ASSERT_TRUE(cache != NULL); - EXPECT_EQ(group_, cache->owning_group()); - EXPECT_TRUE(cache->is_complete()); - - switch (tested_manifest_) { - case MANIFEST1: - VerifyManifest1(cache); - break; - case MANIFEST_MERGED_TYPES: - VerifyManifestMergedTypes(cache); - break; - case EMPTY_MANIFEST: - VerifyEmptyManifest(cache); - break; - case EMPTY_FILE_MANIFEST: - VerifyEmptyFileManifest(cache); - break; - case PENDING_MASTER_NO_UPDATE: - VerifyMasterEntryNoUpdate(cache); - break; - case MANIFEST_WITH_INTERCEPT: - VerifyManifestWithIntercept(cache); - break; - case NONE: - default: - break; - } - } - } - - void VerifyManifest1(AppCache* cache) { - size_t expected = 3 + expect_extra_entries_.size(); - EXPECT_EQ(expected, cache->entries().size()); - const char* kManifestPath = tested_manifest_path_override_ ? - tested_manifest_path_override_ : - "files/manifest1"; - AppCacheEntry* entry = - cache->GetEntry(MockHttpServer::GetMockUrl(kManifestPath)); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MANIFEST, entry->types()); - entry = cache->GetEntry(MockHttpServer::GetMockUrl("files/explicit1")); - ASSERT_TRUE(entry); - EXPECT_TRUE(entry->IsExplicit()); - entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/fallback1a")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::FALLBACK, entry->types()); - - for (AppCache::EntryMap::iterator i = expect_extra_entries_.begin(); - i != expect_extra_entries_.end(); ++i) { - entry = cache->GetEntry(i->first); - ASSERT_TRUE(entry); - EXPECT_EQ(i->second.types(), entry->types()); - } - - expected = 1; - ASSERT_EQ(expected, cache->fallback_namespaces_.size()); - EXPECT_TRUE(cache->fallback_namespaces_[0] == - Namespace( - FALLBACK_NAMESPACE, - MockHttpServer::GetMockUrl("files/fallback1"), - MockHttpServer::GetMockUrl("files/fallback1a"), - false)); - - EXPECT_TRUE(cache->online_whitelist_namespaces_.empty()); - EXPECT_TRUE(cache->online_whitelist_all_); - - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - void VerifyManifestMergedTypes(AppCache* cache) { - size_t expected = 2; - EXPECT_EQ(expected, cache->entries().size()); - AppCacheEntry* entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/manifest-merged-types")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::EXPLICIT | AppCacheEntry::MANIFEST, - entry->types()); - entry = cache->GetEntry(MockHttpServer::GetMockUrl("files/explicit1")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::EXPLICIT | AppCacheEntry::FALLBACK | - AppCacheEntry::MASTER, entry->types()); - - expected = 1; - ASSERT_EQ(expected, cache->fallback_namespaces_.size()); - EXPECT_TRUE(cache->fallback_namespaces_[0] == - Namespace( - FALLBACK_NAMESPACE, - MockHttpServer::GetMockUrl("files/fallback1"), - MockHttpServer::GetMockUrl("files/explicit1"), - false)); - - EXPECT_EQ(expected, cache->online_whitelist_namespaces_.size()); - EXPECT_TRUE(cache->online_whitelist_namespaces_[0] == - Namespace( - NETWORK_NAMESPACE, - MockHttpServer::GetMockUrl("files/online1"), - GURL(), false)); - EXPECT_FALSE(cache->online_whitelist_all_); - - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - void VerifyEmptyManifest(AppCache* cache) { - const char* kManifestPath = tested_manifest_path_override_ ? - tested_manifest_path_override_ : - "files/empty-manifest"; - size_t expected = 1; - EXPECT_EQ(expected, cache->entries().size()); - AppCacheEntry* entry = cache->GetEntry( - MockHttpServer::GetMockUrl(kManifestPath)); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MANIFEST, entry->types()); - - EXPECT_TRUE(cache->fallback_namespaces_.empty()); - EXPECT_TRUE(cache->online_whitelist_namespaces_.empty()); - EXPECT_FALSE(cache->online_whitelist_all_); - - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - void VerifyEmptyFileManifest(AppCache* cache) { - EXPECT_EQ(size_t(2), cache->entries().size()); - AppCacheEntry* entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/empty-file-manifest")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MANIFEST, entry->types()); - - entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/empty1")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::EXPLICIT, entry->types()); - EXPECT_TRUE(entry->has_response_id()); - - EXPECT_TRUE(cache->fallback_namespaces_.empty()); - EXPECT_TRUE(cache->online_whitelist_namespaces_.empty()); - EXPECT_FALSE(cache->online_whitelist_all_); - - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - void VerifyMasterEntryNoUpdate(AppCache* cache) { - EXPECT_EQ(size_t(3), cache->entries().size()); - AppCacheEntry* entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/notmodified")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MANIFEST, entry->types()); - - entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/explicit1")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MASTER, entry->types()); - EXPECT_TRUE(entry->has_response_id()); - - entry = cache->GetEntry( - MockHttpServer::GetMockUrl("files/explicit2")); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::EXPLICIT | AppCacheEntry::MASTER, entry->types()); - EXPECT_TRUE(entry->has_response_id()); - - EXPECT_TRUE(cache->fallback_namespaces_.empty()); - EXPECT_TRUE(cache->online_whitelist_namespaces_.empty()); - EXPECT_FALSE(cache->online_whitelist_all_); - - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - void VerifyManifestWithIntercept(AppCache* cache) { - EXPECT_EQ(2u, cache->entries().size()); - const char* kManifestPath = "files/manifest-with-intercept"; - AppCacheEntry* entry = - cache->GetEntry(MockHttpServer::GetMockUrl(kManifestPath)); - ASSERT_TRUE(entry); - EXPECT_EQ(AppCacheEntry::MANIFEST, entry->types()); - entry = cache->GetEntry(MockHttpServer::GetMockUrl("files/intercept1a")); - ASSERT_TRUE(entry); - EXPECT_TRUE(entry->IsIntercept()); - EXPECT_TRUE(cache->online_whitelist_namespaces_.empty()); - EXPECT_FALSE(cache->online_whitelist_all_); - EXPECT_TRUE(cache->update_time_ > base::Time()); - } - - private: - // Various manifest files used in this test. - enum TestedManifest { - NONE, - MANIFEST1, - MANIFEST_MERGED_TYPES, - EMPTY_MANIFEST, - EMPTY_FILE_MANIFEST, - PENDING_MASTER_NO_UPDATE, - MANIFEST_WITH_INTERCEPT - }; - - scoped_ptr<IOThread> io_thread_; - - scoped_ptr<MockAppCacheService> service_; - scoped_refptr<AppCacheGroup> group_; - scoped_refptr<AppCache> protect_newest_cache_; - scoped_ptr<base::WaitableEvent> event_; - - scoped_ptr<AppCacheResponseWriter> response_writer_; - - // Hosts used by an async test that need to live until update job finishes. - // Otherwise, test can put host on the stack instead of here. - std::vector<AppCacheHost*> hosts_; - - // Response infos used by an async test that need to live until update job - // finishes. - std::vector<scoped_refptr<AppCacheResponseInfo> > response_infos_; - - // Flag indicating if test cares to verify the update after update finishes. - bool do_checks_after_update_finished_; - bool expect_group_obsolete_; - bool expect_group_has_cache_; - bool expect_group_is_being_deleted_; - AppCache* expect_old_cache_; - AppCache* expect_newest_cache_; - bool expect_non_null_update_time_; - std::vector<MockFrontend*> frontends_; // to check expected events - TestedManifest tested_manifest_; - const char* tested_manifest_path_override_; - AppCache::EntryMap expect_extra_entries_; - std::map<GURL, int64> expect_response_ids_; -}; - -TEST_F(AppCacheUpdateJobTest, AlreadyChecking) { - MockAppCacheService service; - scoped_refptr<AppCacheGroup> group( - new AppCacheGroup(service.storage(), GURL("http://manifesturl.com"), - service.storage()->NewGroupId())); - - AppCacheUpdateJob update(&service, group.get()); - - // Pretend group is in checking state. - group->update_job_ = &update; - group->update_status_ = AppCacheGroup::CHECKING; - - update.StartUpdate(NULL, GURL()); - EXPECT_EQ(AppCacheGroup::CHECKING, group->update_status()); - - MockFrontend mock_frontend; - AppCacheHost host(1, &mock_frontend, &service); - update.StartUpdate(&host, GURL()); - - MockFrontend::RaisedEvents events = mock_frontend.raised_events_; - size_t expected = 1; - EXPECT_EQ(expected, events.size()); - EXPECT_EQ(expected, events[0].first.size()); - EXPECT_EQ(host.host_id(), events[0].first[0]); - EXPECT_EQ(CHECKING_EVENT, events[0].second); - EXPECT_EQ(AppCacheGroup::CHECKING, group->update_status()); -} - -TEST_F(AppCacheUpdateJobTest, AlreadyDownloading) { - MockAppCacheService service; - scoped_refptr<AppCacheGroup> group( - new AppCacheGroup(service.storage(), GURL("http://manifesturl.com"), - service.storage()->NewGroupId())); - - AppCacheUpdateJob update(&service, group.get()); - - // Pretend group is in downloading state. - group->update_job_ = &update; - group->update_status_ = AppCacheGroup::DOWNLOADING; - - update.StartUpdate(NULL, GURL()); - EXPECT_EQ(AppCacheGroup::DOWNLOADING, group->update_status()); - - MockFrontend mock_frontend; - AppCacheHost host(1, &mock_frontend, &service); - update.StartUpdate(&host, GURL()); - - MockFrontend::RaisedEvents events = mock_frontend.raised_events_; - size_t expected = 2; - EXPECT_EQ(expected, events.size()); - expected = 1; - EXPECT_EQ(expected, events[0].first.size()); - EXPECT_EQ(host.host_id(), events[0].first[0]); - EXPECT_EQ(CHECKING_EVENT, events[0].second); - - EXPECT_EQ(expected, events[1].first.size()); - EXPECT_EQ(host.host_id(), events[1].first[0]); - EXPECT_EQ(appcache::DOWNLOADING_EVENT, events[1].second); - - EXPECT_EQ(AppCacheGroup::DOWNLOADING, group->update_status()); -} - -TEST_F(AppCacheUpdateJobTest, StartCacheAttempt) { - RunTestOnIOThread(&AppCacheUpdateJobTest::StartCacheAttemptTest); -} - -TEST_F(AppCacheUpdateJobTest, StartUpgradeAttempt) { - RunTestOnIOThread(&AppCacheUpdateJobTest::StartUpgradeAttemptTest); -} - -TEST_F(AppCacheUpdateJobTest, CacheAttemptFetchManifestFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::CacheAttemptFetchManifestFailTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeFetchManifestFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFetchManifestFailTest); -} - -TEST_F(AppCacheUpdateJobTest, ManifestRedirect) { - RunTestOnIOThread(&AppCacheUpdateJobTest::ManifestRedirectTest); -} - -TEST_F(AppCacheUpdateJobTest, ManifestMissingMimeTypeTest) { - RunTestOnIOThread(&AppCacheUpdateJobTest::ManifestMissingMimeTypeTest); -} - -TEST_F(AppCacheUpdateJobTest, ManifestNotFound) { - RunTestOnIOThread(&AppCacheUpdateJobTest::ManifestNotFoundTest); -} - -TEST_F(AppCacheUpdateJobTest, ManifestGone) { - RunTestOnIOThread(&AppCacheUpdateJobTest::ManifestGoneTest); -} - -TEST_F(AppCacheUpdateJobTest, CacheAttemptNotModified) { - RunTestOnIOThread(&AppCacheUpdateJobTest::CacheAttemptNotModifiedTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeNotModified) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeNotModifiedTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeManifestDataUnchanged) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeManifestDataUnchangedTest); -} - -TEST_F(AppCacheUpdateJobTest, Bug95101Test) { - RunTestOnIOThread(&AppCacheUpdateJobTest::Bug95101Test); -} - -TEST_F(AppCacheUpdateJobTest, BasicCacheAttemptSuccess) { - RunTestOnIOThread(&AppCacheUpdateJobTest::BasicCacheAttemptSuccessTest); -} - -TEST_F(AppCacheUpdateJobTest, DownloadInterceptEntriesTest) { - RunTestOnIOThread(&AppCacheUpdateJobTest::DownloadInterceptEntriesTest); -} - -TEST_F(AppCacheUpdateJobTest, BasicUpgradeSuccess) { - RunTestOnIOThread(&AppCacheUpdateJobTest::BasicUpgradeSuccessTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeLoadFromNewestCache) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeLoadFromNewestCacheTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeNoLoadFromNewestCache) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeNoLoadFromNewestCacheTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeLoadFromNewestCacheVaryHeader) { - RunTestOnIOThread( - &AppCacheUpdateJobTest::UpgradeLoadFromNewestCacheVaryHeaderTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeSuccessMergedTypes) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeSuccessMergedTypesTest); -} - -TEST_F(AppCacheUpdateJobTest, CacheAttemptFailUrlFetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::CacheAttemptFailUrlFetchTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeFailUrlFetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailUrlFetchTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeFailMasterUrlFetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailMasterUrlFetchTest); -} - -TEST_F(AppCacheUpdateJobTest, EmptyManifest) { - RunTestOnIOThread(&AppCacheUpdateJobTest::EmptyManifestTest); -} - -TEST_F(AppCacheUpdateJobTest, EmptyFile) { - RunTestOnIOThread(&AppCacheUpdateJobTest::EmptyFileTest); -} - -TEST_F(AppCacheUpdateJobTest, RetryRequest) { - RunTestOnIOThread(&AppCacheUpdateJobTest::RetryRequestTest); -} - -TEST_F(AppCacheUpdateJobTest, RetryNoRetryAfter) { - RunTestOnIOThread(&AppCacheUpdateJobTest::RetryNoRetryAfterTest); -} - -TEST_F(AppCacheUpdateJobTest, RetryNonzeroRetryAfter) { - RunTestOnIOThread(&AppCacheUpdateJobTest::RetryNonzeroRetryAfterTest); -} - -TEST_F(AppCacheUpdateJobTest, RetrySuccess) { - RunTestOnIOThread(&AppCacheUpdateJobTest::RetrySuccessTest); -} - -TEST_F(AppCacheUpdateJobTest, RetryUrl) { - RunTestOnIOThread(&AppCacheUpdateJobTest::RetryUrlTest); -} - -TEST_F(AppCacheUpdateJobTest, FailStoreNewestCache) { - RunTestOnIOThread(&AppCacheUpdateJobTest::FailStoreNewestCacheTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryFailStoreNewestCacheTest) { - RunTestOnIOThread( - &AppCacheUpdateJobTest::MasterEntryFailStoreNewestCacheTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeFailStoreNewestCache) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailStoreNewestCacheTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeFailMakeGroupObsolete) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeFailMakeGroupObsoleteTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryFetchManifestFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryFetchManifestFailTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryBadManifest) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryBadManifestTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryManifestNotFound) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryManifestNotFoundTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryFailUrlFetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryFailUrlFetchTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryAllFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryAllFailTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeMasterEntryAllFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeMasterEntryAllFailTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntrySomeFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntrySomeFailTest); -} - -TEST_F(AppCacheUpdateJobTest, UpgradeMasterEntrySomeFail) { - RunTestOnIOThread(&AppCacheUpdateJobTest::UpgradeMasterEntrySomeFailTest); -} - -TEST_F(AppCacheUpdateJobTest, MasterEntryNoUpdate) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MasterEntryNoUpdateTest); -} - -TEST_F(AppCacheUpdateJobTest, StartUpdateMidCacheAttempt) { - RunTestOnIOThread(&AppCacheUpdateJobTest::StartUpdateMidCacheAttemptTest); -} - -TEST_F(AppCacheUpdateJobTest, StartUpdateMidNoUpdate) { - RunTestOnIOThread(&AppCacheUpdateJobTest::StartUpdateMidNoUpdateTest); -} - -TEST_F(AppCacheUpdateJobTest, StartUpdateMidDownload) { - RunTestOnIOThread(&AppCacheUpdateJobTest::StartUpdateMidDownloadTest); -} - -TEST_F(AppCacheUpdateJobTest, QueueMasterEntry) { - RunTestOnIOThread(&AppCacheUpdateJobTest::QueueMasterEntryTest); -} - -TEST_F(AppCacheUpdateJobTest, IfModifiedSince) { - RunTestOnIOThread(&AppCacheUpdateJobTest::IfModifiedSinceTest); -} - -TEST_F(AppCacheUpdateJobTest, IfModifiedSinceUpgrade) { - RunTestOnIOThread(&AppCacheUpdateJobTest::IfModifiedSinceUpgradeTest); -} - -TEST_F(AppCacheUpdateJobTest, IfNoneMatchUpgrade) { - RunTestOnIOThread(&AppCacheUpdateJobTest::IfNoneMatchUpgradeTest); -} - -TEST_F(AppCacheUpdateJobTest, IfNoneMatchRefetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::IfNoneMatchRefetchTest); -} - -TEST_F(AppCacheUpdateJobTest, MultipleHeadersRefetch) { - RunTestOnIOThread(&AppCacheUpdateJobTest::MultipleHeadersRefetchTest); -} - -TEST_F(AppCacheUpdateJobTest, CrossOriginHttpsSuccess) { - RunTestOnIOThread(&AppCacheUpdateJobTest::CrossOriginHttpsSuccessTest); -} - -TEST_F(AppCacheUpdateJobTest, CrossOriginHttpsDenied) { - RunTestOnIOThread(&AppCacheUpdateJobTest::CrossOriginHttpsDeniedTest); -} - -} // namespace appcache |