service_worker_context_request_handler_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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( 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scope_, 1L, context()->AsWeakPtr()); 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_ = new ServiceWorkerVersion( 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registration_.get(), script_url_, 1L, context()->AsWeakPtr()); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // An empty host. 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kMockRenderProcessId, 1 /* provider_id */, 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), NULL)); 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_ = host->AsWeakPtr(); 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AddProviderHost(host.Pass()); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->storage()->LazyInitialize(base::Bind(&EmptyCallback)); 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void TearDown() OVERRIDE { 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_ = NULL; 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_ = NULL; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) helper_.reset(); 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerContextCore* context() const { return helper_->context(); } 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestBrowserThreadBundle browser_thread_bundle_; 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<EmbeddedWorkerTestHelper> helper_; 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> registration_; 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_; 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::WeakPtr<ServiceWorkerProviderHost> provider_host_; 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::URLRequestContext url_request_context_; 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MockURLRequestDelegate url_request_delegate_; 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL scope_; 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL script_url_; 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerContextRequestHandlerTest, UpdateBefore24Hours) { 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Give the registration a very recent last update time and pretend 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // we're installing a new version. 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_->set_last_update_check(base::Time::Now()); 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_->SetStatus(ServiceWorkerVersion::NEW); 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_->running_hosted_version_ = version_; 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Conduct a resource fetch for the main script. 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScriptUrl("http://host/script.js"); 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScriptUrl, 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::DEFAULT_PRIORITY, 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &url_request_delegate_, 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL); 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerContextRequestHandler> handler( 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerContextRequestHandler( 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_, 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::WeakPtr<storage::BlobStorageContext>(), 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RESOURCE_TYPE_SERVICE_WORKER)); 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<net::URLRequestJob> job = 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) handler->MaybeCreateJob(request.get(), NULL); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(job.get()); 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerWriteToCacheJob* sw_job = 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static_cast<ServiceWorkerWriteToCacheJob*>(job.get()); 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Verify the net request is not initialized to bypass the browser cache. 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(sw_job->net_request_->load_flags() & net::LOAD_BYPASS_CACHE); 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerContextRequestHandlerTest, UpdateAfter24Hours) { 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Give the registration a old update time and pretend 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // we're installing a new version. 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration_->set_last_update_check( 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Time::Now() - base::TimeDelta::FromDays(7)); 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) version_->SetStatus(ServiceWorkerVersion::NEW); 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_->running_hosted_version_ = version_; 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Conduct a resource fetch for the main script. 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScriptUrl("http://host/script.js"); 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScriptUrl, 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::DEFAULT_PRIORITY, 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &url_request_delegate_, 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerContextRequestHandler> handler( 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerContextRequestHandler( 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context()->AsWeakPtr(), 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) provider_host_, 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::WeakPtr<storage::BlobStorageContext>(), 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RESOURCE_TYPE_SERVICE_WORKER)); 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<net::URLRequestJob> job = 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) handler->MaybeCreateJob(request.get(), NULL); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(job.get()); 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerWriteToCacheJob* sw_job = 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static_cast<ServiceWorkerWriteToCacheJob*>(job.get()); 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Verify the net request is initialized to bypass the browser cache. 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(sw_job->net_request_->load_flags() & net::LOAD_BYPASS_CACHE); 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace content 141