embedded_worker_test_helper.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 "testing/gtest/include/gtest/gtest.h" 13 14namespace content { 15 16EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( 17 ServiceWorkerContextCore* context, 18 int mock_render_process_id) 19 : context_(context->AsWeakPtr()), 20 next_thread_id_(0), 21 weak_factory_(this) { 22 registry()->AddChildProcessSender(mock_render_process_id, this); 23} 24 25EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() { 26} 27 28void EmbeddedWorkerTestHelper::SimulateAddProcessToWorker( 29 int embedded_worker_id, 30 int process_id) { 31 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 32 ASSERT_TRUE(worker); 33 registry()->AddChildProcessSender(process_id, this); 34 worker->AddProcessReference(process_id); 35} 36 37bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) { 38 OnMessageReceived(*message); 39 delete message; 40 return true; 41} 42 43bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) { 44 bool handled = true; 45 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message) 46 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StartWorker, OnStartWorkerStub) 47 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StopWorker, OnStopWorkerStub) 48 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_SendMessageToWorker, 49 OnSendMessageToWorkerStub) 50 IPC_MESSAGE_UNHANDLED(handled = false) 51 IPC_END_MESSAGE_MAP() 52 53 // IPC::TestSink only records messages that are not handled by filters, 54 // so we just forward all messages to the separate sink. 55 sink_.OnMessageReceived(message); 56 57 return handled; 58} 59 60void EmbeddedWorkerTestHelper::OnStartWorker( 61 int embedded_worker_id, 62 int64 service_worker_version_id, 63 const GURL& script_url) { 64 // By default just notify the sender that the worker is started. 65 SimulateWorkerStarted(next_thread_id_++, embedded_worker_id); 66} 67 68void EmbeddedWorkerTestHelper::OnStopWorker(int embedded_worker_id) { 69 // By default just notify the sender that the worker is stopped. 70 SimulateWorkerStopped(embedded_worker_id); 71} 72 73void EmbeddedWorkerTestHelper::OnSendMessageToWorker( 74 int thread_id, 75 int embedded_worker_id, 76 int request_id, 77 const IPC::Message& message) { 78 // Do nothing on the message by default. 79} 80 81void EmbeddedWorkerTestHelper::SimulateWorkerStarted( 82 int thread_id, int embedded_worker_id) { 83 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 84 ASSERT_TRUE(worker != NULL); 85 registry()->OnWorkerStarted( 86 worker->process_id(), 87 thread_id, 88 embedded_worker_id); 89} 90 91void EmbeddedWorkerTestHelper::SimulateWorkerStopped( 92 int embedded_worker_id) { 93 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 94 ASSERT_TRUE(worker != NULL); 95 registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id); 96} 97 98void EmbeddedWorkerTestHelper::SimulateSendMessageToBrowser( 99 int embedded_worker_id, int request_id, const IPC::Message& message) { 100 registry()->OnSendMessageToBrowser(embedded_worker_id, request_id, message); 101} 102 103void EmbeddedWorkerTestHelper::OnStartWorkerStub( 104 int embedded_worker_id, 105 int64 service_worker_version_id, 106 const GURL& script_url) { 107 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 108 ASSERT_TRUE(worker != NULL); 109 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status()); 110 base::MessageLoopProxy::current()->PostTask( 111 FROM_HERE, 112 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, 113 weak_factory_.GetWeakPtr(), 114 embedded_worker_id, 115 service_worker_version_id, 116 script_url)); 117} 118 119void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) { 120 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 121 ASSERT_TRUE(worker != NULL); 122 base::MessageLoopProxy::current()->PostTask( 123 FROM_HERE, 124 base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker, 125 weak_factory_.GetWeakPtr(), 126 embedded_worker_id)); 127} 128 129void EmbeddedWorkerTestHelper::OnSendMessageToWorkerStub( 130 int thread_id, 131 int embedded_worker_id, 132 int request_id, 133 const IPC::Message& message) { 134 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); 135 ASSERT_TRUE(worker != NULL); 136 EXPECT_EQ(worker->thread_id(), thread_id); 137 base::MessageLoopProxy::current()->PostTask( 138 FROM_HERE, 139 base::Bind(&EmbeddedWorkerTestHelper::OnSendMessageToWorker, 140 weak_factory_.GetWeakPtr(), 141 thread_id, 142 embedded_worker_id, 143 request_id, 144 message)); 145} 146 147EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() { 148 DCHECK(context_); 149 return context_->embedded_worker_registry(); 150} 151 152} // namespace content 153