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