embedded_worker_test_helper.cc revision 010d83a9304c5a91596085d917d248abff47903a
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 18static bool AlwaysTrue(int process_id) { 19 return true; 20} 21 22EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(int mock_render_process_id) 23 : wrapper_(new ServiceWorkerContextWrapper(NULL)), 24 next_thread_id_(0), 25 weak_factory_(this) { 26 wrapper_->InitForTesting(base::FilePath(), 27 base::MessageLoopProxy::current(), 28 NULL); 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); 35} 36 37EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() { 38 if (wrapper_) 39 wrapper_->Shutdown(); 40} 41 42void EmbeddedWorkerTestHelper::SimulateAddProcessToWorker( 43 int embedded_worker_id, 44 int process_id) { 45 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 46 ASSERT_TRUE(worker); 47 registry()->AddChildProcessSender(process_id, this); 48 worker->AddProcessReference(process_id); 49} 50 51bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) { 52 OnMessageReceived(*message); 53 delete message; 54 return true; 55} 56 57bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) { 58 bool handled = true; 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) 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 // By default just notify the sender that the worker is started. 89 SimulateWorkerStarted(next_thread_id_++, embedded_worker_id); 90} 91 92void EmbeddedWorkerTestHelper::OnStopWorker(int embedded_worker_id) { 93 // By default just notify the sender that the worker is stopped. 94 SimulateWorkerStopped(embedded_worker_id); 95} 96 97bool EmbeddedWorkerTestHelper::OnMessageToWorker( 98 int thread_id, 99 int embedded_worker_id, 100 const IPC::Message& message) { 101 bool handled = true; 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); 111 return handled; 112} 113 114void EmbeddedWorkerTestHelper::OnActivateEvent(int embedded_worker_id, 115 int request_id) { 116 SimulateSend( 117 new ServiceWorkerHostMsg_ActivateEventFinished( 118 embedded_worker_id, request_id, 119 blink::WebServiceWorkerEventResultCompleted)); 120} 121 122void EmbeddedWorkerTestHelper::OnInstallEvent(int embedded_worker_id, 123 int request_id, 124 int active_version_id) { 125 SimulateSend( 126 new ServiceWorkerHostMsg_InstallEventFinished( 127 embedded_worker_id, request_id, 128 blink::WebServiceWorkerEventResultCompleted)); 129} 130 131void EmbeddedWorkerTestHelper::OnFetchEvent( 132 int embedded_worker_id, 133 int request_id, 134 const ServiceWorkerFetchRequest& request) { 135 SimulateSend( 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>()))); 141} 142 143void 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(), 149 thread_id, 150 embedded_worker_id); 151} 152 153void 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); 158} 159 160void EmbeddedWorkerTestHelper::SimulateSend( 161 IPC::Message* message) { 162 registry()->OnMessageReceived(*message); 163 delete message; 164} 165 166void 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( 173 FROM_HERE, 174 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, 175 weak_factory_.GetWeakPtr(), 176 params.embedded_worker_id, 177 params.service_worker_version_id, 178 params.scope, 179 params.script_url)); 180} 181 182void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) { 183 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 184 ASSERT_TRUE(worker != NULL); 185 base::MessageLoopProxy::current()->PostTask( 186 FROM_HERE, 187 base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker, 188 weak_factory_.GetWeakPtr(), 189 embedded_worker_id)); 190} 191 192void EmbeddedWorkerTestHelper::OnMessageToWorkerStub( 193 int thread_id, 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( 200 FROM_HERE, 201 base::Bind( 202 base::IgnoreResult(&EmbeddedWorkerTestHelper::OnMessageToWorker), 203 weak_factory_.GetWeakPtr(), 204 thread_id, 205 embedded_worker_id, 206 message)); 207} 208 209void EmbeddedWorkerTestHelper::OnActivateEventStub(int request_id) { 210 base::MessageLoopProxy::current()->PostTask( 211 FROM_HERE, 212 base::Bind(&EmbeddedWorkerTestHelper::OnActivateEvent, 213 weak_factory_.GetWeakPtr(), 214 current_embedded_worker_id_, 215 request_id)); 216} 217 218void EmbeddedWorkerTestHelper::OnInstallEventStub(int request_id, 219 int active_version_id) { 220 base::MessageLoopProxy::current()->PostTask( 221 FROM_HERE, 222 base::Bind(&EmbeddedWorkerTestHelper::OnInstallEvent, 223 weak_factory_.GetWeakPtr(), 224 current_embedded_worker_id_, 225 request_id, 226 active_version_id)); 227} 228 229void EmbeddedWorkerTestHelper::OnFetchEventStub( 230 int request_id, 231 const ServiceWorkerFetchRequest& request) { 232 base::MessageLoopProxy::current()->PostTask( 233 FROM_HERE, 234 base::Bind(&EmbeddedWorkerTestHelper::OnFetchEvent, 235 weak_factory_.GetWeakPtr(), 236 current_embedded_worker_id_, 237 request_id, 238 request)); 239} 240 241EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() { 242 DCHECK(context()); 243 return context()->embedded_worker_registry(); 244} 245 246} // namespace content 247