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