OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 5 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/memory/scoped_vector.h" | 12 #include "base/memory/scoped_vector.h" |
13 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
14 #include "content/browser/message_port_message_filter.h" | 14 #include "content/browser/message_port_message_filter.h" |
15 #include "content/browser/service_worker/embedded_worker_instance.h" | 15 #include "content/browser/service_worker/embedded_worker_instance.h" |
16 #include "content/browser/service_worker/embedded_worker_registry.h" | 16 #include "content/browser/service_worker/embedded_worker_registry.h" |
17 #include "content/browser/service_worker/service_worker_context_core.h" | 17 #include "content/browser/service_worker/service_worker_context_core.h" |
18 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 18 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 19 #include "content/common/service_worker/embedded_worker.mojom.h" |
19 #include "content/common/service_worker/embedded_worker_messages.h" | 20 #include "content/common/service_worker/embedded_worker_messages.h" |
20 #include "content/common/service_worker/service_worker_messages.h" | 21 #include "content/common/service_worker/service_worker_messages.h" |
| 22 #include "content/public/test/mock_render_process_host.h" |
| 23 #include "content/public/test/test_browser_context.h" |
| 24 #include "mojo/common/url_type_converters.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "third_party/mojo/src/mojo/public/cpp/bindings/strong_binding.h" |
22 | 27 |
23 namespace content { | 28 namespace content { |
24 | 29 |
| 30 namespace { |
| 31 |
25 class MockMessagePortMessageFilter : public MessagePortMessageFilter { | 32 class MockMessagePortMessageFilter : public MessagePortMessageFilter { |
26 public: | 33 public: |
27 MockMessagePortMessageFilter() | 34 MockMessagePortMessageFilter() |
28 : MessagePortMessageFilter( | 35 : MessagePortMessageFilter( |
29 base::Bind(&base::AtomicSequenceNumber::GetNext, | 36 base::Bind(&base::AtomicSequenceNumber::GetNext, |
30 base::Unretained(&next_routing_id_))) {} | 37 base::Unretained(&next_routing_id_))) {} |
31 | 38 |
32 bool Send(IPC::Message* message) override { | 39 bool Send(IPC::Message* message) override { |
33 message_queue_.push_back(message); | 40 message_queue_.push_back(message); |
34 return true; | 41 return true; |
35 } | 42 } |
36 | 43 |
37 private: | 44 private: |
38 ~MockMessagePortMessageFilter() override {} | 45 ~MockMessagePortMessageFilter() override {} |
39 base::AtomicSequenceNumber next_routing_id_; | 46 base::AtomicSequenceNumber next_routing_id_; |
40 ScopedVector<IPC::Message> message_queue_; | 47 ScopedVector<IPC::Message> message_queue_; |
41 }; | 48 }; |
| 49 } |
| 50 |
| 51 class MockEmbeddedWorker : public EmbeddedWorker { |
| 52 public: |
| 53 static void Create(base::WeakPtr<EmbeddedWorkerTestHelper> helper, |
| 54 mojo::InterfaceRequest<EmbeddedWorker> request) { |
| 55 new MockEmbeddedWorker(helper, request.Pass()); |
| 56 } |
| 57 ~MockEmbeddedWorker() override { |
| 58 if (!helper_ || embedded_worker_id_ == -1) |
| 59 return; |
| 60 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 61 FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker, helper_, |
| 62 embedded_worker_id_)); |
| 63 } |
| 64 |
| 65 void Initialize(EmbeddedWorkerStartWorkerParamsPtr params) override { |
| 66 if (!helper_) |
| 67 return; |
| 68 ASSERT_EQ(embedded_worker_id_, -1); |
| 69 embedded_worker_id_ = params->embedded_worker_id; |
| 70 EmbeddedWorkerInstance* worker = |
| 71 helper_->registry()->GetWorker(params->embedded_worker_id); |
| 72 ASSERT_TRUE(worker != NULL); |
| 73 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status()); |
| 74 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 75 FROM_HERE, |
| 76 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, helper_, |
| 77 params->embedded_worker_id, |
| 78 params->service_worker_version_id, params->scope.To<GURL>(), |
| 79 params->script_url.To<GURL>())); |
| 80 } |
| 81 |
| 82 private: |
| 83 MockEmbeddedWorker(base::WeakPtr<EmbeddedWorkerTestHelper> helper, |
| 84 mojo::InterfaceRequest<EmbeddedWorker> request) |
| 85 : binding_(this, request.Pass()), helper_(helper) {} |
| 86 |
| 87 mojo::StrongBinding<EmbeddedWorker> binding_; |
| 88 base::WeakPtr<EmbeddedWorkerTestHelper> helper_; |
| 89 int embedded_worker_id_ = -1; |
| 90 }; |
| 91 |
| 92 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( |
| 93 const base::FilePath& user_data_directory) |
| 94 : wrapper_(new ServiceWorkerContextWrapper(NULL)), |
| 95 next_thread_id_(0), |
| 96 browser_context_(new TestBrowserContext), |
| 97 render_process_host_(new MockRenderProcessHost(browser_context_.get())), |
| 98 weak_factory_(this) { |
| 99 mock_render_process_id_ = render_process_host_->GetID(); |
| 100 service_registry_.ServiceRegistry::AddService( |
| 101 base::Bind(&MockEmbeddedWorker::Create, weak_factory_.GetWeakPtr())); |
| 102 mojo::ServiceProviderPtr services; |
| 103 service_registry_.Bind(mojo::GetProxy(&services)); |
| 104 static_cast<ServiceRegistryImpl*>(render_process_host_->GetServiceRegistry()) |
| 105 ->BindRemoteServiceProvider(services.Pass()); |
| 106 scoped_ptr<MockServiceWorkerDatabaseTaskManager> database_task_manager( |
| 107 new MockServiceWorkerDatabaseTaskManager( |
| 108 base::ThreadTaskRunnerHandle::Get())); |
| 109 wrapper_->InitInternal(user_data_directory, database_task_manager.Pass(), |
| 110 base::ThreadTaskRunnerHandle::Get(), NULL, NULL); |
| 111 wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id_); |
| 112 registry()->AddChildProcessSender(mock_render_process_id_, this, |
| 113 NewMessagePortMessageFilter()); |
| 114 } |
42 | 115 |
43 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( | 116 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( |
44 const base::FilePath& user_data_directory, | 117 const base::FilePath& user_data_directory, |
45 int mock_render_process_id) | 118 int mock_render_process_id) |
46 : wrapper_(new ServiceWorkerContextWrapper(NULL)), | 119 : wrapper_(new ServiceWorkerContextWrapper(NULL)), |
47 next_thread_id_(0), | 120 next_thread_id_(0), |
48 mock_render_process_id_(mock_render_process_id), | 121 mock_render_process_id_(mock_render_process_id), |
49 weak_factory_(this) { | 122 weak_factory_(this) { |
50 scoped_ptr<MockServiceWorkerDatabaseTaskManager> database_task_manager( | 123 scoped_ptr<MockServiceWorkerDatabaseTaskManager> database_task_manager( |
51 new MockServiceWorkerDatabaseTaskManager( | 124 new MockServiceWorkerDatabaseTaskManager( |
(...skipping 24 matching lines...) Expand all Loading... |
76 | 149 |
77 bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) { | 150 bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) { |
78 OnMessageReceived(*message); | 151 OnMessageReceived(*message); |
79 delete message; | 152 delete message; |
80 return true; | 153 return true; |
81 } | 154 } |
82 | 155 |
83 bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) { | 156 bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) { |
84 bool handled = true; | 157 bool handled = true; |
85 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message) | 158 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message) |
86 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StartWorker, OnStartWorkerStub) | 159 // IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StartWorker, OnStartWorkerStub) |
87 IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StopWorker, OnStopWorkerStub) | 160 // IPC_MESSAGE_HANDLER(EmbeddedWorkerMsg_StopWorker, OnStopWorkerStub) |
88 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker, | 161 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker, |
89 OnMessageToWorkerStub) | 162 OnMessageToWorkerStub) |
90 IPC_MESSAGE_UNHANDLED(handled = false) | 163 IPC_MESSAGE_UNHANDLED(handled = false) |
91 IPC_END_MESSAGE_MAP() | 164 IPC_END_MESSAGE_MAP() |
92 | 165 |
93 // IPC::TestSink only records messages that are not handled by filters, | 166 // IPC::TestSink only records messages that are not handled by filters, |
94 // so we just forward all messages to the separate sink. | 167 // so we just forward all messages to the separate sink. |
95 sink_.OnMessageReceived(message); | 168 sink_.OnMessageReceived(message); |
96 | 169 |
97 return handled; | 170 return handled; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 } | 320 } |
248 | 321 |
249 void EmbeddedWorkerTestHelper::SimulateSend( | 322 void EmbeddedWorkerTestHelper::SimulateSend( |
250 IPC::Message* message) { | 323 IPC::Message* message) { |
251 registry()->OnMessageReceived(*message, mock_render_process_id_); | 324 registry()->OnMessageReceived(*message, mock_render_process_id_); |
252 delete message; | 325 delete message; |
253 } | 326 } |
254 | 327 |
255 void EmbeddedWorkerTestHelper::OnStartWorkerStub( | 328 void EmbeddedWorkerTestHelper::OnStartWorkerStub( |
256 const EmbeddedWorkerMsg_StartWorker_Params& params) { | 329 const EmbeddedWorkerMsg_StartWorker_Params& params) { |
257 EmbeddedWorkerInstance* worker = | 330 /* EmbeddedWorkerInstance* worker = |
258 registry()->GetWorker(params.embedded_worker_id); | 331 registry()->GetWorker(params.embedded_worker_id); |
259 ASSERT_TRUE(worker != NULL); | 332 ASSERT_TRUE(worker != NULL); |
260 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status()); | 333 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status()); |
261 base::ThreadTaskRunnerHandle::Get()->PostTask( | 334 base::ThreadTaskRunnerHandle::Get()->PostTask( |
262 FROM_HERE, | 335 FROM_HERE, |
263 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, | 336 base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, |
264 weak_factory_.GetWeakPtr(), params.embedded_worker_id, | 337 weak_factory_.GetWeakPtr(), params.embedded_worker_id, |
265 params.service_worker_version_id, params.scope, | 338 params.service_worker_version_id, params.scope, |
266 params.script_url)); | 339 params.script_url));*/ |
267 } | 340 } |
268 | 341 |
269 void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) { | 342 void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) { |
270 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); | 343 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); |
271 ASSERT_TRUE(worker != NULL); | 344 ASSERT_TRUE(worker != NULL); |
272 base::ThreadTaskRunnerHandle::Get()->PostTask( | 345 base::ThreadTaskRunnerHandle::Get()->PostTask( |
273 FROM_HERE, | 346 FROM_HERE, |
274 base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker, | 347 base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker, |
275 weak_factory_.GetWeakPtr(), | 348 weak_factory_.GetWeakPtr(), |
276 embedded_worker_id)); | 349 embedded_worker_id)); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 | 418 |
346 MessagePortMessageFilter* | 419 MessagePortMessageFilter* |
347 EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() { | 420 EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() { |
348 scoped_refptr<MessagePortMessageFilter> filter( | 421 scoped_refptr<MessagePortMessageFilter> filter( |
349 new MockMessagePortMessageFilter); | 422 new MockMessagePortMessageFilter); |
350 message_port_message_filters_.push_back(filter); | 423 message_port_message_filters_.push_back(filter); |
351 return filter.get(); | 424 return filter.get(); |
352 } | 425 } |
353 | 426 |
354 } // namespace content | 427 } // namespace content |
OLD | NEW |