service_worker_url_request_job_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/basictypes.h"
6#include "base/callback.h"
7#include "base/memory/scoped_ptr.h"
8#include "base/run_loop.h"
9#include "content/browser/service_worker/embedded_worker_registry.h"
10#include "content/browser/service_worker/embedded_worker_test_helper.h"
11#include "content/browser/service_worker/service_worker_context_core.h"
12#include "content/browser/service_worker/service_worker_provider_host.h"
13#include "content/browser/service_worker/service_worker_registration.h"
14#include "content/browser/service_worker/service_worker_test_utils.h"
15#include "content/browser/service_worker/service_worker_url_request_job.h"
16#include "content/browser/service_worker/service_worker_version.h"
17#include "content/public/test/test_browser_thread_bundle.h"
18#include "net/base/io_buffer.h"
19#include "net/http/http_request_headers.h"
20#include "net/http/http_response_headers.h"
21#include "net/url_request/url_request.h"
22#include "net/url_request/url_request_context.h"
23#include "net/url_request/url_request_job_factory_impl.h"
24#include "testing/gtest/include/gtest/gtest.h"
25
26namespace content {
27
28namespace {
29
30const int kBufferSize = 1024;
31const int kProcessID = 1;
32const int kProviderID = 100;
33
34class MockURLRequestDelegate : public net::URLRequest::Delegate {
35 public:
36  MockURLRequestDelegate() : received_data_(new net::IOBuffer(kBufferSize)) {}
37  virtual ~MockURLRequestDelegate() {}
38  virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE {
39    if (request->status().is_success()) {
40      EXPECT_TRUE(request->response_headers());
41      Read(request);
42    }
43  }
44  virtual void OnReadCompleted(net::URLRequest* request,
45                               int bytes_read) OVERRIDE {
46    EXPECT_EQ(0, bytes_read);
47  }
48
49 private:
50  void Read(net::URLRequest* request) {
51    if (request->is_pending()) {
52      int bytes_read = 0;
53      request->Read(received_data_.get(), kBufferSize, &bytes_read);
54      // For now ServiceWorkerURLRequestJob wouldn't return
55      // any content data yet.
56      EXPECT_EQ(0, bytes_read);
57    }
58  }
59
60  scoped_refptr<net::IOBuffer> received_data_;
61  base::Closure on_complete_;
62};
63
64class MockProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
65 public:
66  MockProtocolHandler(base::WeakPtr<ServiceWorkerProviderHost> provider_host)
67      : provider_host_(provider_host) {}
68  virtual ~MockProtocolHandler() {}
69
70  virtual net::URLRequestJob* MaybeCreateJob(
71      net::URLRequest* request,
72      net::NetworkDelegate* network_delegate) const OVERRIDE {
73    ServiceWorkerURLRequestJob* job = new ServiceWorkerURLRequestJob(
74        request, network_delegate, provider_host_);
75    job->ForwardToServiceWorker();
76    return job;
77  }
78
79 private:
80  base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
81};
82
83}  // namespace
84
85class ServiceWorkerURLRequestJobTest : public testing::Test {
86 protected:
87  ServiceWorkerURLRequestJobTest()
88      : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
89  virtual ~ServiceWorkerURLRequestJobTest() {}
90
91  virtual void SetUp() OVERRIDE {
92    helper_.reset(new EmbeddedWorkerTestHelper(kProcessID));
93
94    registration_ = new ServiceWorkerRegistration(
95        GURL("http://example.com/*"),
96        GURL("http://example.com/service_worker.js"),
97        1L,
98        helper_->context()->AsWeakPtr());
99    version_ = new ServiceWorkerVersion(
100        registration_, 1L, helper_->context()->AsWeakPtr());
101
102    scoped_ptr<ServiceWorkerProviderHost> provider_host(
103        new ServiceWorkerProviderHost(
104            kProcessID, kProviderID, helper_->context()->AsWeakPtr(), NULL));
105    provider_host->SetActiveVersion(version_.get());
106
107    url_request_job_factory_.SetProtocolHandler(
108        "http", new MockProtocolHandler(provider_host->AsWeakPtr()));
109    url_request_context_.set_job_factory(&url_request_job_factory_);
110
111    helper_->context()->AddProviderHost(provider_host.Pass());
112  }
113
114  virtual void TearDown() OVERRIDE {
115    version_ = NULL;
116    registration_ = NULL;
117    helper_.reset();
118  }
119
120  void TestRequest() {
121    request_ = url_request_context_.CreateRequest(
122        GURL("http://example.com/foo.html"),
123        net::DEFAULT_PRIORITY,
124        &url_request_delegate_,
125        NULL);
126
127    request_->set_method("GET");
128    request_->Start();
129    base::RunLoop().RunUntilIdle();
130
131    // Verify response.
132    EXPECT_TRUE(request_->status().is_success());
133    EXPECT_EQ(200, request_->response_headers()->response_code());
134  }
135
136  TestBrowserThreadBundle thread_bundle_;
137
138  scoped_ptr<EmbeddedWorkerTestHelper> helper_;
139  scoped_refptr<ServiceWorkerRegistration> registration_;
140  scoped_refptr<ServiceWorkerVersion> version_;
141
142  net::URLRequestJobFactoryImpl url_request_job_factory_;
143  net::URLRequestContext url_request_context_;
144  MockURLRequestDelegate url_request_delegate_;
145  scoped_ptr<net::URLRequest> request_;
146
147  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerURLRequestJobTest);
148};
149
150TEST_F(ServiceWorkerURLRequestJobTest, Simple) {
151  version_->SetStatus(ServiceWorkerVersion::ACTIVE);
152  TestRequest();
153}
154
155TEST_F(ServiceWorkerURLRequestJobTest, WaitForActivation) {
156  ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
157  version_->SetStatus(ServiceWorkerVersion::INSTALLED);
158  version_->DispatchActivateEvent(CreateReceiverOnCurrentThread(&status));
159
160  TestRequest();
161
162  EXPECT_EQ(SERVICE_WORKER_OK, status);
163}
164
165// TODO(kinuko): Add more tests with different response data and also for
166// FallbackToNetwork case.
167
168}  // namespace content
169