service_worker_context_request_handler_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/logging.h" 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/run_loop.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/browser_thread_impl.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/fileapi/mock_url_request_delegate.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_test_helper.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_context_request_handler.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_provider_host.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_registration.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h" 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_write_to_cache_job.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/base/load_flags.h" 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/url_request/url_request_context.h" 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace content { 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int kMockRenderProcessId = 1224; 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EmptyCallback() {} 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ServiceWorkerContextRequestHandlerTest : public testing::Test { 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerContextRequestHandlerTest() 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void SetUp() OVERRIDE { 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) helper_.reset(new EmbeddedWorkerTestHelper(kMockRenderProcessId)); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // A new unstored registration/version. 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scope_ = GURL("http://host/scope/"); 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) script_url_ = GURL("http://host/script.js"); 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_ = new ServiceWorkerRegistration( 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scope_, script_url_, 1L, context()->AsWeakPtr()); 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_ = new ServiceWorkerVersion( 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_, 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1L, context()->AsWeakPtr()); 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // An empty host. 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kMockRenderProcessId, 1 /* provider_id */, 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), NULL)); 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_ = host->AsWeakPtr(); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AddProviderHost(host.Pass()); 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->storage()->LazyInitialize(base::Bind(&EmptyCallback)); 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void TearDown() OVERRIDE { 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_ = NULL; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_ = NULL; 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) helper_.reset(); 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerContextCore* context() const { return helper_->context(); } 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestBrowserThreadBundle browser_thread_bundle_; 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<EmbeddedWorkerTestHelper> helper_; 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> registration_; 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_; 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::WeakPtr<ServiceWorkerProviderHost> provider_host_; 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::URLRequestContext url_request_context_; 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MockURLRequestDelegate url_request_delegate_; 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL scope_; 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL script_url_; 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerContextRequestHandlerTest, UpdateBefore24Hours) { 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Give the registration a very recent last update time and pretend 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // we're installing a new version. 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_->set_last_update_check(base::Time::Now()); 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_->SetStatus(ServiceWorkerVersion::NEW); 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_->running_hosted_version_ = version_; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Conduct a resource fetch for the main script. 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScriptUrl("http://host/script.js"); 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScriptUrl, 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::DEFAULT_PRIORITY, 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &url_request_delegate_, 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL); 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerContextRequestHandler> handler( 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerContextRequestHandler( 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_, 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::WeakPtr<storage::BlobStorageContext>(), 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RESOURCE_TYPE_SERVICE_WORKER)); 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<net::URLRequestJob> job = 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) handler->MaybeCreateJob(request.get(), NULL); 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(job); 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerWriteToCacheJob* sw_job = 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static_cast<ServiceWorkerWriteToCacheJob*>(job.get()); 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Verify the net request is not initialized to bypass the browser cache. 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(sw_job->net_request_->load_flags() & net::LOAD_BYPASS_CACHE); 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerContextRequestHandlerTest, UpdateAfter24Hours) { 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Give the registration a old update time and pretend 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // we're installing a new version. 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_->set_last_update_check( 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Time::Now() - base::TimeDelta::FromDays(7)); 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_->SetStatus(ServiceWorkerVersion::NEW); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_->running_hosted_version_ = version_; 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Conduct a resource fetch for the main script. 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScriptUrl("http://host/script.js"); 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScriptUrl, 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::DEFAULT_PRIORITY, 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &url_request_delegate_, 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL); 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerContextRequestHandler> handler( 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerContextRequestHandler( 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_, 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::WeakPtr<storage::BlobStorageContext>(), 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RESOURCE_TYPE_SERVICE_WORKER)); 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<net::URLRequestJob> job = 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) handler->MaybeCreateJob(request.get(), NULL); 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(job); 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerWriteToCacheJob* sw_job = 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static_cast<ServiceWorkerWriteToCacheJob*>(job.get()); 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Verify the net request is initialized to bypass the browser cache. 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(sw_job->net_request_->load_flags() & net::LOAD_BYPASS_CACHE); 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace content 142