embedded_worker_test_helper.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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 "content/browser/service_worker/embedded_worker_test_helper.h"
6
7#include "base/bind.h"
8#include "content/browser/service_worker/embedded_worker_instance.h"
9#include "content/browser/service_worker/embedded_worker_registry.h"
10#include "content/browser/service_worker/service_worker_context_core.h"
11#include "content/browser/service_worker/service_worker_context_wrapper.h"
12#include "content/common/service_worker/embedded_worker_messages.h"
13#include "content/common/service_worker/service_worker_messages.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace content {
17
18EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(int mock_render_process_id)
19    : wrapper_(new ServiceWorkerContextWrapper(NULL)),
20      next_thread_id_(0),
21      weak_factory_(this) {
22  wrapper_->InitInternal(base::FilePath(),
23                         base::MessageLoopProxy::current(),
24                         base::MessageLoopProxy::current(),
25                         NULL);
26  wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id);
27  registry()->AddChildProcessSender(mock_render_process_id, this);
28}
29
30EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
31  if (wrapper_)
32    wrapper_->Shutdown();
33}
34
35void EmbeddedWorkerTestHelper::SimulateAddProcessToWorker(
36    int embedded_worker_id,
37    int process_id) {
38  EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
39  ASSERT_TRUE(worker);
40  registry()->AddChildProcessSender(process_id, this);
41  worker->AddProcessReference(process_id);
42}
43
44bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) {
45  OnMessageReceived(*message);
46  delete message;
47  return true;
48}
49
50bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) {
51  bool handled = true;
52  IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
53    IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StartWorker, OnStartWorkerStub)
54    IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StopWorker, OnStopWorkerStub)
55    IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker,
56                        OnMessageToWorkerStub)
57    IPC_MESSAGE_UNHANDLED(handled = false)
58  IPC_END_MESSAGE_MAP()
59
60  // IPC::TestSink only records messages that are not handled by filters,
61  // so we just forward all messages to the separate sink.
62  sink_.OnMessageReceived(message);
63
64  return handled;
65}
66
67ServiceWorkerContextCore* EmbeddedWorkerTestHelper::context() {
68  return wrapper_->context();
69}
70
71void EmbeddedWorkerTestHelper::ShutdownContext() {
72  wrapper_->Shutdown();
73  wrapper_ = NULL;
74}
75
76void EmbeddedWorkerTestHelper::OnStartWorker(
77    int embedded_worker_id,
78    int64 service_worker_version_id,
79    const GURL& scope,
80    const GURL& script_url) {
81  // By default just notify the sender that the worker is started.
82  SimulateWorkerStarted(next_thread_id_++, embedded_worker_id);
83}
84
85void EmbeddedWorkerTestHelper::OnStopWorker(int embedded_worker_id) {
86  // By default just notify the sender that the worker is stopped.
87  SimulateWorkerStopped(embedded_worker_id);
88}
89
90bool EmbeddedWorkerTestHelper::OnMessageToWorker(
91    int thread_id,
92    int embedded_worker_id,
93    const IPC::Message& message) {
94  bool handled = true;
95  current_embedded_worker_id_ = embedded_worker_id;
96  IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
97    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEventStub)
98    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEventStub)
99    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEventStub)
100    IPC_MESSAGE_UNHANDLED(handled = false)
101  IPC_END_MESSAGE_MAP()
102  // Record all messages directed to inner script context.
103  inner_sink_.OnMessageReceived(message);
104  return handled;
105}
106
107void EmbeddedWorkerTestHelper::OnActivateEvent(int embedded_worker_id,
108                                               int request_id) {
109  SimulateSend(
110      new ServiceWorkerHostMsg_ActivateEventFinished(
111          embedded_worker_id, request_id,
112          blink::WebServiceWorkerEventResultCompleted));
113}
114
115void EmbeddedWorkerTestHelper::OnInstallEvent(int embedded_worker_id,
116                                              int request_id,
117                                              int active_version_id) {
118  SimulateSend(
119      new ServiceWorkerHostMsg_InstallEventFinished(
120          embedded_worker_id, request_id,
121          blink::WebServiceWorkerEventResultCompleted));
122}
123
124void EmbeddedWorkerTestHelper::OnFetchEvent(
125    int embedded_worker_id,
126    int request_id,
127    const ServiceWorkerFetchRequest& request) {
128  SimulateSend(
129      new ServiceWorkerHostMsg_FetchEventFinished(
130          embedded_worker_id,
131          request_id,
132          SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
133          ServiceWorkerResponse(200, "OK",
134                                std::map<std::string, std::string>(),
135                                std::string())));
136}
137
138void EmbeddedWorkerTestHelper::SimulateWorkerStarted(
139    int thread_id, int embedded_worker_id) {
140  EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
141  ASSERT_TRUE(worker != NULL);
142  registry()->OnWorkerStarted(
143      worker->process_id(),
144      thread_id,
145      embedded_worker_id);
146}
147
148void EmbeddedWorkerTestHelper::SimulateWorkerStopped(
149    int embedded_worker_id) {
150  EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
151  if (worker != NULL)
152    registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id);
153}
154
155void EmbeddedWorkerTestHelper::SimulateSend(
156    IPC::Message* message) {
157  registry()->OnMessageReceived(*message);
158  delete message;
159}
160
161void EmbeddedWorkerTestHelper::OnStartWorkerStub(
162    const EmbeddedWorkerMsg_StartWorker_Params& params) {
163  EmbeddedWorkerInstance* worker =
164      registry()->GetWorker(params.embedded_worker_id);
165  ASSERT_TRUE(worker != NULL);
166  EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status());
167  base::MessageLoopProxy::current()->PostTask(
168      FROM_HERE,
169      base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker,
170                 weak_factory_.GetWeakPtr(),
171                 params.embedded_worker_id,
172                 params.service_worker_version_id,
173                 params.scope,
174                 params.script_url));
175}
176
177void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) {
178  EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
179  ASSERT_TRUE(worker != NULL);
180  base::MessageLoopProxy::current()->PostTask(
181      FROM_HERE,
182      base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker,
183                 weak_factory_.GetWeakPtr(),
184                 embedded_worker_id));
185}
186
187void EmbeddedWorkerTestHelper::OnMessageToWorkerStub(
188    int thread_id,
189    int embedded_worker_id,
190    const IPC::Message& message) {
191  EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
192  ASSERT_TRUE(worker != NULL);
193  EXPECT_EQ(worker->thread_id(), thread_id);
194  base::MessageLoopProxy::current()->PostTask(
195      FROM_HERE,
196      base::Bind(
197          base::IgnoreResult(&EmbeddedWorkerTestHelper::OnMessageToWorker),
198          weak_factory_.GetWeakPtr(),
199          thread_id,
200          embedded_worker_id,
201          message));
202}
203
204void EmbeddedWorkerTestHelper::OnActivateEventStub(int request_id) {
205  base::MessageLoopProxy::current()->PostTask(
206      FROM_HERE,
207      base::Bind(&EmbeddedWorkerTestHelper::OnActivateEvent,
208                 weak_factory_.GetWeakPtr(),
209                 current_embedded_worker_id_,
210                 request_id));
211}
212
213void EmbeddedWorkerTestHelper::OnInstallEventStub(int request_id,
214                                                  int active_version_id) {
215  base::MessageLoopProxy::current()->PostTask(
216      FROM_HERE,
217      base::Bind(&EmbeddedWorkerTestHelper::OnInstallEvent,
218                 weak_factory_.GetWeakPtr(),
219                 current_embedded_worker_id_,
220                 request_id,
221                 active_version_id));
222}
223
224void EmbeddedWorkerTestHelper::OnFetchEventStub(
225    int request_id,
226    const ServiceWorkerFetchRequest& request) {
227  base::MessageLoopProxy::current()->PostTask(
228      FROM_HERE,
229      base::Bind(&EmbeddedWorkerTestHelper::OnFetchEvent,
230                 weak_factory_.GetWeakPtr(),
231                 current_embedded_worker_id_,
232                 request_id,
233                 request));
234}
235
236EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() {
237  DCHECK(context());
238  return context()->embedded_worker_registry();
239}
240
241}  // namespace content
242