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