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.
5 #include "content/browser/service_worker/embedded_worker_test_helper.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"
18 static bool AlwaysTrue(int process_id) {
22 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(int mock_render_process_id)
23 : wrapper_(new ServiceWorkerContextWrapper(NULL)),
26 wrapper_->InitForTesting(base::FilePath(),
27 base::MessageLoopProxy::current(),
29 scoped_ptr<ServiceWorkerProcessManager> process_manager(
30 new ServiceWorkerProcessManager(wrapper_));
31 process_manager->SetProcessRefcountOpsForTest(base::Bind(AlwaysTrue),
32 base::Bind(AlwaysTrue));
33 wrapper_->context()->SetProcessManagerForTest(process_manager.Pass());
34 registry()->AddChildProcessSender(mock_render_process_id, this);
37 EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
42 void EmbeddedWorkerTestHelper::SimulateAddProcessToWorker(
43 int embedded_worker_id,
45 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
47 registry()->AddChildProcessSender(process_id, this);
48 worker->AddProcessReference(process_id);
51 bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) {
52 OnMessageReceived(*message);
57 bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) {
59 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
60 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StartWorker, OnStartWorkerStub)
61 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StopWorker, OnStopWorkerStub)
62 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker,
63 OnMessageToWorkerStub)
64 IPC_MESSAGE_UNHANDLED(handled = false)
67 // IPC::TestSink only records messages that are not handled by filters,
68 // so we just forward all messages to the separate sink.
69 sink_.OnMessageReceived(message);
74 ServiceWorkerContextCore* EmbeddedWorkerTestHelper::context() {
75 return wrapper_->context();
78 void EmbeddedWorkerTestHelper::ShutdownContext() {
83 void EmbeddedWorkerTestHelper::OnStartWorker(
84 int embedded_worker_id,
85 int64 service_worker_version_id,
87 const GURL& script_url) {
88 // By default just notify the sender that the worker is started.
89 SimulateWorkerStarted(next_thread_id_++, embedded_worker_id);
92 void EmbeddedWorkerTestHelper::OnStopWorker(int embedded_worker_id) {
93 // By default just notify the sender that the worker is stopped.
94 SimulateWorkerStopped(embedded_worker_id);
97 bool EmbeddedWorkerTestHelper::OnMessageToWorker(
99 int embedded_worker_id,
100 const IPC::Message& message) {
102 current_embedded_worker_id_ = embedded_worker_id;
103 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
104 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEventStub)
105 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEventStub)
106 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEventStub)
107 IPC_MESSAGE_UNHANDLED(handled = false)
108 IPC_END_MESSAGE_MAP()
109 // Record all messages directed to inner script context.
110 inner_sink_.OnMessageReceived(message);
114 void EmbeddedWorkerTestHelper::OnActivateEvent(int embedded_worker_id,
117 new ServiceWorkerHostMsg_ActivateEventFinished(
118 embedded_worker_id, request_id,
119 blink::WebServiceWorkerEventResultCompleted));
122 void EmbeddedWorkerTestHelper::OnInstallEvent(int embedded_worker_id,
124 int active_version_id) {
126 new ServiceWorkerHostMsg_InstallEventFinished(
127 embedded_worker_id, request_id,
128 blink::WebServiceWorkerEventResultCompleted));
131 void EmbeddedWorkerTestHelper::OnFetchEvent(
132 int embedded_worker_id,
134 const ServiceWorkerFetchRequest& request) {
136 new ServiceWorkerHostMsg_FetchEventFinished(
137 embedded_worker_id, request_id,
138 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
139 ServiceWorkerResponse(200, "OK", "GET",
140 std::map<std::string, std::string>())));
143 void EmbeddedWorkerTestHelper::SimulateWorkerStarted(
144 int thread_id, int embedded_worker_id) {
145 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
146 ASSERT_TRUE(worker != NULL);
147 registry()->OnWorkerStarted(
148 worker->process_id(),
153 void EmbeddedWorkerTestHelper::SimulateWorkerStopped(
154 int embedded_worker_id) {
155 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
156 ASSERT_TRUE(worker != NULL);
157 registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id);
160 void EmbeddedWorkerTestHelper::SimulateSend(
161 IPC::Message* message) {
162 registry()->OnMessageReceived(*message);
166 void EmbeddedWorkerTestHelper::OnStartWorkerStub(
167 const EmbeddedWorkerMsg_StartWorker_Params& params) {
168 EmbeddedWorkerInstance* worker =
169 registry()->GetWorker(params.embedded_worker_id);
170 ASSERT_TRUE(worker != NULL);
171 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status());
172 base::MessageLoopProxy::current()->PostTask(
174 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker,
175 weak_factory_.GetWeakPtr(),
176 params.embedded_worker_id,
177 params.service_worker_version_id,
182 void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) {
183 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
184 ASSERT_TRUE(worker != NULL);
185 base::MessageLoopProxy::current()->PostTask(
187 base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker,
188 weak_factory_.GetWeakPtr(),
189 embedded_worker_id));
192 void EmbeddedWorkerTestHelper::OnMessageToWorkerStub(
194 int embedded_worker_id,
195 const IPC::Message& message) {
196 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
197 ASSERT_TRUE(worker != NULL);
198 EXPECT_EQ(worker->thread_id(), thread_id);
199 base::MessageLoopProxy::current()->PostTask(
202 base::IgnoreResult(&EmbeddedWorkerTestHelper::OnMessageToWorker),
203 weak_factory_.GetWeakPtr(),
209 void EmbeddedWorkerTestHelper::OnActivateEventStub(int request_id) {
210 base::MessageLoopProxy::current()->PostTask(
212 base::Bind(&EmbeddedWorkerTestHelper::OnActivateEvent,
213 weak_factory_.GetWeakPtr(),
214 current_embedded_worker_id_,
218 void EmbeddedWorkerTestHelper::OnInstallEventStub(int request_id,
219 int active_version_id) {
220 base::MessageLoopProxy::current()->PostTask(
222 base::Bind(&EmbeddedWorkerTestHelper::OnInstallEvent,
223 weak_factory_.GetWeakPtr(),
224 current_embedded_worker_id_,
229 void EmbeddedWorkerTestHelper::OnFetchEventStub(
231 const ServiceWorkerFetchRequest& request) {
232 base::MessageLoopProxy::current()->PostTask(
234 base::Bind(&EmbeddedWorkerTestHelper::OnFetchEvent,
235 weak_factory_.GetWeakPtr(),
236 current_embedded_worker_id_,
241 EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() {
243 return context()->embedded_worker_registry();
246 } // namespace content