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