Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: content/browser/service_worker/embedded_worker_instance_unittest.cc

Issue 2378073002: Reland of ServiceWorker: Implement StartWorker by using mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_instance.h" 5 #include "content/browser/service_worker/embedded_worker_instance.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/command_line.h"
11 #include "base/macros.h" 12 #include "base/macros.h"
12 #include "base/run_loop.h" 13 #include "base/run_loop.h"
13 #include "base/stl_util.h" 14 #include "base/stl_util.h"
14 #include "content/browser/service_worker/embedded_worker_registry.h" 15 #include "content/browser/service_worker/embedded_worker_registry.h"
15 #include "content/browser/service_worker/embedded_worker_status.h" 16 #include "content/browser/service_worker/embedded_worker_status.h"
16 #include "content/browser/service_worker/embedded_worker_test_helper.h" 17 #include "content/browser/service_worker/embedded_worker_test_helper.h"
17 #include "content/browser/service_worker/service_worker_context_core.h" 18 #include "content/browser/service_worker/service_worker_context_core.h"
18 #include "content/browser/service_worker/service_worker_context_wrapper.h" 19 #include "content/browser/service_worker/service_worker_context_wrapper.h"
20 #include "content/common/service_worker/embedded_worker.mojom.h"
19 #include "content/common/service_worker/embedded_worker_messages.h" 21 #include "content/common/service_worker/embedded_worker_messages.h"
22 #include "content/common/service_worker/embedded_worker_start_params.h"
20 #include "content/public/common/child_process_host.h" 23 #include "content/public/common/child_process_host.h"
24 #include "content/public/common/content_switches.h"
21 #include "content/public/test/test_browser_thread_bundle.h" 25 #include "content/public/test/test_browser_thread_bundle.h"
26 #include "mojo/public/cpp/bindings/strong_binding.h"
22 #include "testing/gmock/include/gmock/gmock.h" 27 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
24 29
25 namespace content { 30 namespace content {
26 31
27 namespace { 32 namespace {
28 33
29 void SaveStatusAndCall(ServiceWorkerStatusCode* out, 34 void SaveStatusAndCall(ServiceWorkerStatusCode* out,
30 const base::Closure& callback, 35 const base::Closure& callback,
31 ServiceWorkerStatusCode status) { 36 ServiceWorkerStatusCode status) {
32 *out = status; 37 *out = status;
33 callback.Run(); 38 callback.Run();
34 } 39 }
35 40
36 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> 41 std::unique_ptr<EmbeddedWorkerStartParams>
37 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { 42 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) {
38 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 43 std::unique_ptr<EmbeddedWorkerStartParams> params(
39 new EmbeddedWorkerMsg_StartWorker_Params); 44 new EmbeddedWorkerStartParams);
40 params->service_worker_version_id = version_id; 45 params->service_worker_version_id = version_id;
41 params->scope = scope; 46 params->scope = scope;
42 params->script_url = script_url; 47 params->script_url = script_url;
43 params->pause_after_download = false; 48 params->pause_after_download = false;
49 params->is_installed = false;
44 return params; 50 return params;
45 } 51 }
46 52
47 } // namespace 53 } // namespace
48 54
49 class EmbeddedWorkerInstanceTest : public testing::Test, 55 class EmbeddedWorkerInstanceTest : public testing::Test,
50 public EmbeddedWorkerInstance::Listener { 56 public EmbeddedWorkerInstance::Listener {
51 protected: 57 protected:
52 EmbeddedWorkerInstanceTest() 58 EmbeddedWorkerInstanceTest()
53 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} 59 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath())); 96 helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath()));
91 } 97 }
92 98
93 void TearDown() override { helper_.reset(); } 99 void TearDown() override { helper_.reset(); }
94 100
95 ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker, 101 ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker,
96 int id, const GURL& pattern, 102 int id, const GURL& pattern,
97 const GURL& url) { 103 const GURL& url) {
98 ServiceWorkerStatusCode status; 104 ServiceWorkerStatusCode status;
99 base::RunLoop run_loop; 105 base::RunLoop run_loop;
100 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params = 106 std::unique_ptr<EmbeddedWorkerStartParams> params =
101 CreateStartParams(id, pattern, url); 107 CreateStartParams(id, pattern, url);
102 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 108 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
103 run_loop.QuitClosure())); 109 run_loop.QuitClosure()));
104 run_loop.Run(); 110 run_loop.Run();
105 return status; 111 return status;
106 } 112 }
107 113
108 ServiceWorkerContextCore* context() { return helper_->context(); } 114 ServiceWorkerContextCore* context() { return helper_->context(); }
109 115
110 EmbeddedWorkerRegistry* embedded_worker_registry() { 116 EmbeddedWorkerRegistry* embedded_worker_registry() {
111 DCHECK(context()); 117 DCHECK(context());
112 return context()->embedded_worker_registry(); 118 return context()->embedded_worker_registry();
113 } 119 }
114 120
115 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } 121 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); }
116 122
117 TestBrowserThreadBundle thread_bundle_; 123 TestBrowserThreadBundle thread_bundle_;
118 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; 124 std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
119 std::vector<EventLog> events_; 125 std::vector<EventLog> events_;
120 126
121 private: 127 private:
122 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); 128 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest);
123 }; 129 };
124 130
131 class EmbeddedWorkerInstanceTestP : public EmbeddedWorkerInstanceTest,
132 public testing::WithParamInterface<bool> {
133 protected:
134 void SetUp() override {
135 is_mojo_enabled_ = GetParam();
136 if (is_mojo_enabled()) {
137 base::CommandLine::ForCurrentProcess()->AppendSwitch(
138 switches::kMojoServiceWorker);
139 }
140 EmbeddedWorkerInstanceTest::SetUp();
141 }
142
143 bool is_mojo_enabled() { return is_mojo_enabled_; }
144
145 private:
146 bool is_mojo_enabled_ = false;
147 };
148
125 // A helper to simulate the start worker sequence is stalled in a worker 149 // A helper to simulate the start worker sequence is stalled in a worker
126 // process. 150 // process.
127 class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper { 151 class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper {
128 public: 152 public:
129 StalledInStartWorkerHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} 153 StalledInStartWorkerHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {}
130 ~StalledInStartWorkerHelper() override{}; 154 ~StalledInStartWorkerHelper() override{};
131 155
132 void OnStartWorker(int embedded_worker_id, 156 void OnStartWorker(int embedded_worker_id,
133 int64_t service_worker_version_id, 157 int64_t service_worker_version_id,
134 const GURL& scope, 158 const GURL& scope,
(...skipping 20 matching lines...) Expand all
155 public: 179 public:
156 FailToSendIPCHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} 180 FailToSendIPCHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {}
157 ~FailToSendIPCHelper() override {} 181 ~FailToSendIPCHelper() override {}
158 182
159 bool Send(IPC::Message* message) override { 183 bool Send(IPC::Message* message) override {
160 delete message; 184 delete message;
161 return false; 185 return false;
162 } 186 }
163 }; 187 };
164 188
165 TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) { 189 TEST_P(EmbeddedWorkerInstanceTestP, StartAndStop) {
166 std::unique_ptr<EmbeddedWorkerInstance> worker = 190 std::unique_ptr<EmbeddedWorkerInstance> worker =
167 embedded_worker_registry()->CreateWorker(); 191 embedded_worker_registry()->CreateWorker();
168 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 192 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
193 worker->AddListener(this);
169 194
170 const int64_t service_worker_version_id = 55L; 195 const int64_t service_worker_version_id = 55L;
171 const GURL pattern("http://example.com/"); 196 const GURL pattern("http://example.com/");
172 const GURL url("http://example.com/worker.js"); 197 const GURL url("http://example.com/worker.js");
173 198
174 // Simulate adding one process to the pattern. 199 // Simulate adding one process to the pattern.
175 helper_->SimulateAddProcessToPattern(pattern, 200 helper_->SimulateAddProcessToPattern(pattern,
176 helper_->mock_render_process_id()); 201 helper_->mock_render_process_id());
177 202
178 // Start should succeed. 203 // Start should succeed.
179 ServiceWorkerStatusCode status; 204 ServiceWorkerStatusCode status;
180 base::RunLoop run_loop; 205 base::RunLoop run_loop;
181 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params = 206 std::unique_ptr<EmbeddedWorkerStartParams> params =
182 CreateStartParams(service_worker_version_id, pattern, url); 207 CreateStartParams(service_worker_version_id, pattern, url);
183 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 208 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
184 run_loop.QuitClosure())); 209 run_loop.QuitClosure()));
185 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); 210 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
186 run_loop.Run(); 211 run_loop.Run();
187 EXPECT_EQ(SERVICE_WORKER_OK, status); 212 EXPECT_EQ(SERVICE_WORKER_OK, status);
188 213
189 // The 'WorkerStarted' message should have been sent by 214 // The 'WorkerStarted' message should have been sent by
190 // EmbeddedWorkerTestHelper. 215 // EmbeddedWorkerTestHelper.
191 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); 216 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
192 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); 217 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
193 218
194 // Stop the worker. 219 // Stop the worker.
195 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); 220 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop());
196 EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status()); 221 EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status());
197 base::RunLoop().RunUntilIdle(); 222 base::RunLoop().RunUntilIdle();
198 223
199 // The 'WorkerStopped' message should have been sent by 224 // The 'WorkerStopped' message should have been sent by
200 // EmbeddedWorkerTestHelper. 225 // EmbeddedWorkerTestHelper.
201 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 226 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
202 227
203 // Verify that we've sent two messages to start and terminate the worker. 228 if (!is_mojo_enabled()) {
204 ASSERT_TRUE( 229 // Verify that we've sent two messages to start and terminate the worker.
205 ipc_sink()->GetUniqueMessageMatching(EmbeddedWorkerMsg_StartWorker::ID)); 230 ASSERT_TRUE(ipc_sink()->GetUniqueMessageMatching(
231 EmbeddedWorkerMsg_StartWorker::ID));
232 }
233 // StopWorker should be sent in either case.
206 ASSERT_TRUE(ipc_sink()->GetUniqueMessageMatching( 234 ASSERT_TRUE(ipc_sink()->GetUniqueMessageMatching(
207 EmbeddedWorkerMsg_StopWorker::ID)); 235 EmbeddedWorkerMsg_StopWorker::ID));
236
237 // Check if the IPCs are fired in expected order.
238 ASSERT_EQ(4u, events_.size());
239 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
240 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
241 EXPECT_EQ(STARTED, events_[2].type);
242 EXPECT_EQ(STOPPED, events_[3].type);
208 } 243 }
209 244
210 // Test that a worker that failed twice will use a new render process 245 // Test that a worker that failed twice will use a new render process
211 // on the next attempt. 246 // on the next attempt.
212 TEST_F(EmbeddedWorkerInstanceTest, ForceNewProcess) { 247 TEST_F(EmbeddedWorkerInstanceTest, ForceNewProcess) {
213 std::unique_ptr<EmbeddedWorkerInstance> worker = 248 std::unique_ptr<EmbeddedWorkerInstance> worker =
214 embedded_worker_registry()->CreateWorker(); 249 embedded_worker_registry()->CreateWorker();
215 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 250 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
216 251
217 const int64_t service_worker_version_id = 55L; 252 const int64_t service_worker_version_id = 55L;
218 const GURL pattern("http://example.com/"); 253 const GURL pattern("http://example.com/");
219 const GURL url("http://example.com/worker.js"); 254 const GURL url("http://example.com/worker.js");
220 255
221 // Simulate adding one process to the pattern. 256 // Simulate adding one process to the pattern.
222 helper_->SimulateAddProcessToPattern(pattern, 257 helper_->SimulateAddProcessToPattern(pattern,
223 helper_->mock_render_process_id()); 258 helper_->mock_render_process_id());
224 259
225 // Also simulate adding a "newly created" process to the pattern because 260 // Also simulate adding a "newly created" process to the pattern because
226 // unittests can't actually create a new process itself. 261 // unittests can't actually create a new process itself.
227 // ServiceWorkerProcessManager only chooses this process id in unittests if 262 // ServiceWorkerProcessManager only chooses this process id in unittests if
228 // can_use_existing_process is false. 263 // can_use_existing_process is false.
229 helper_->SimulateAddProcessToPattern(pattern, 264 helper_->SimulateAddProcessToPattern(pattern,
230 helper_->new_render_process_id()); 265 helper_->new_render_process_id());
231 266
232 { 267 {
233 // Start once normally. 268 // Start once normally.
234 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 269 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
235 base::RunLoop run_loop; 270 base::RunLoop run_loop;
236 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 271 std::unique_ptr<EmbeddedWorkerStartParams> params(
237 CreateStartParams(service_worker_version_id, pattern, url)); 272 CreateStartParams(service_worker_version_id, pattern, url));
238 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 273 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
239 run_loop.QuitClosure())); 274 run_loop.QuitClosure()));
240 run_loop.Run(); 275 run_loop.Run();
241 EXPECT_EQ(SERVICE_WORKER_OK, status); 276 EXPECT_EQ(SERVICE_WORKER_OK, status);
242 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); 277 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
243 // The worker should be using the default render process. 278 // The worker should be using the default render process.
244 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); 279 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
245 280
246 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); 281 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop());
247 base::RunLoop().RunUntilIdle(); 282 base::RunLoop().RunUntilIdle();
248 } 283 }
249 284
250 // Fail twice. 285 // Fail twice.
251 context()->UpdateVersionFailureCount(service_worker_version_id, 286 context()->UpdateVersionFailureCount(service_worker_version_id,
252 SERVICE_WORKER_ERROR_FAILED); 287 SERVICE_WORKER_ERROR_FAILED);
253 context()->UpdateVersionFailureCount(service_worker_version_id, 288 context()->UpdateVersionFailureCount(service_worker_version_id,
254 SERVICE_WORKER_ERROR_FAILED); 289 SERVICE_WORKER_ERROR_FAILED);
255 290
256 { 291 {
257 // Start again. 292 // Start again.
258 ServiceWorkerStatusCode status; 293 ServiceWorkerStatusCode status;
259 base::RunLoop run_loop; 294 base::RunLoop run_loop;
260 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 295 std::unique_ptr<EmbeddedWorkerStartParams> params(
261 CreateStartParams(service_worker_version_id, pattern, url)); 296 CreateStartParams(service_worker_version_id, pattern, url));
262 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 297 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
263 run_loop.QuitClosure())); 298 run_loop.QuitClosure()));
264 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); 299 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
265 run_loop.Run(); 300 run_loop.Run();
266 EXPECT_EQ(SERVICE_WORKER_OK, status); 301 EXPECT_EQ(SERVICE_WORKER_OK, status);
267 302
268 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); 303 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
269 // The worker should be using the new render process. 304 // The worker should be using the new render process.
270 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); 305 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id());
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 const int64_t version_id2 = 56L; 365 const int64_t version_id2 = 56L;
331 const GURL pattern("http://example.com/"); 366 const GURL pattern("http://example.com/");
332 const GURL url("http://example.com/worker.js"); 367 const GURL url("http://example.com/worker.js");
333 int process_id = helper_->mock_render_process_id(); 368 int process_id = helper_->mock_render_process_id();
334 369
335 helper_->SimulateAddProcessToPattern(pattern, process_id); 370 helper_->SimulateAddProcessToPattern(pattern, process_id);
336 { 371 {
337 // Start worker1. 372 // Start worker1.
338 ServiceWorkerStatusCode status; 373 ServiceWorkerStatusCode status;
339 base::RunLoop run_loop; 374 base::RunLoop run_loop;
340 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 375 std::unique_ptr<EmbeddedWorkerStartParams> params(
341 CreateStartParams(version_id1, pattern, url)); 376 CreateStartParams(version_id1, pattern, url));
342 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 377 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
343 run_loop.QuitClosure())); 378 run_loop.QuitClosure()));
344 run_loop.Run(); 379 run_loop.Run();
345 EXPECT_EQ(SERVICE_WORKER_OK, status); 380 EXPECT_EQ(SERVICE_WORKER_OK, status);
346 } 381 }
347 382
348 { 383 {
349 // Start worker2. 384 // Start worker2.
350 ServiceWorkerStatusCode status; 385 ServiceWorkerStatusCode status;
351 base::RunLoop run_loop; 386 base::RunLoop run_loop;
352 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 387 std::unique_ptr<EmbeddedWorkerStartParams> params(
353 CreateStartParams(version_id2, pattern, url)); 388 CreateStartParams(version_id2, pattern, url));
354 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 389 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
355 run_loop.QuitClosure())); 390 run_loop.QuitClosure()));
356 run_loop.Run(); 391 run_loop.Run();
357 EXPECT_EQ(SERVICE_WORKER_OK, status); 392 EXPECT_EQ(SERVICE_WORKER_OK, status);
358 } 393 }
359 394
360 // The two workers share the same process. 395 // The two workers share the same process.
361 EXPECT_EQ(worker1->process_id(), worker2->process_id()); 396 EXPECT_EQ(worker1->process_id(), worker2->process_id());
362 397
(...skipping 16 matching lines...) Expand all
379 const int64_t version_id = 55L; 414 const int64_t version_id = 55L;
380 const GURL scope("http://example.com/"); 415 const GURL scope("http://example.com/");
381 const GURL url("http://example.com/worker.js"); 416 const GURL url("http://example.com/worker.js");
382 417
383 std::unique_ptr<EmbeddedWorkerInstance> worker = 418 std::unique_ptr<EmbeddedWorkerInstance> worker =
384 embedded_worker_registry()->CreateWorker(); 419 embedded_worker_registry()->CreateWorker();
385 worker->AddListener(this); 420 worker->AddListener(this);
386 421
387 // Run the start worker sequence and detach during process allocation. 422 // Run the start worker sequence and detach during process allocation.
388 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 423 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
389 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 424 std::unique_ptr<EmbeddedWorkerStartParams> params(
390 CreateStartParams(version_id, scope, url)); 425 CreateStartParams(version_id, scope, url));
391 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 426 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
392 base::Bind(&base::DoNothing))); 427 base::Bind(&base::DoNothing)));
393 worker->Detach(); 428 worker->Detach();
394 base::RunLoop().RunUntilIdle(); 429 base::RunLoop().RunUntilIdle();
395 430
396 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 431 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
397 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); 432 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id());
398 433
399 // The start callback should not be aborted by detach (see a comment on the 434 // The start callback should not be aborted by detach (see a comment on the
(...skipping 11 matching lines...) Expand all
411 const GURL scope("http://example.com/"); 446 const GURL scope("http://example.com/");
412 const GURL url("http://example.com/worker.js"); 447 const GURL url("http://example.com/worker.js");
413 448
414 helper_.reset(new StalledInStartWorkerHelper()); 449 helper_.reset(new StalledInStartWorkerHelper());
415 std::unique_ptr<EmbeddedWorkerInstance> worker = 450 std::unique_ptr<EmbeddedWorkerInstance> worker =
416 embedded_worker_registry()->CreateWorker(); 451 embedded_worker_registry()->CreateWorker();
417 worker->AddListener(this); 452 worker->AddListener(this);
418 453
419 // Run the start worker sequence until a start worker message is sent. 454 // Run the start worker sequence until a start worker message is sent.
420 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 455 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
421 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 456 std::unique_ptr<EmbeddedWorkerStartParams> params(
422 CreateStartParams(version_id, scope, url)); 457 CreateStartParams(version_id, scope, url));
423 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 458 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
424 base::Bind(&base::DoNothing))); 459 base::Bind(&base::DoNothing)));
425 base::RunLoop().RunUntilIdle(); 460 base::RunLoop().RunUntilIdle();
426 461
427 ASSERT_EQ(2u, events_.size()); 462 ASSERT_EQ(2u, events_.size());
428 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 463 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
429 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); 464 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
430 events_.clear(); 465 events_.clear();
431 466
(...skipping 18 matching lines...) Expand all
450 const GURL scope("http://example.com/"); 485 const GURL scope("http://example.com/");
451 const GURL url("http://example.com/worker.js"); 486 const GURL url("http://example.com/worker.js");
452 487
453 std::unique_ptr<EmbeddedWorkerInstance> worker = 488 std::unique_ptr<EmbeddedWorkerInstance> worker =
454 embedded_worker_registry()->CreateWorker(); 489 embedded_worker_registry()->CreateWorker();
455 worker->AddListener(this); 490 worker->AddListener(this);
456 491
457 // Stop the start worker sequence before a process is allocated. 492 // Stop the start worker sequence before a process is allocated.
458 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 493 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
459 494
460 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 495 std::unique_ptr<EmbeddedWorkerStartParams> params(
461 CreateStartParams(version_id, scope, url)); 496 CreateStartParams(version_id, scope, url));
462 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 497 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
463 base::Bind(&base::DoNothing))); 498 base::Bind(&base::DoNothing)));
464 worker->Stop(); 499 worker->Stop();
465 base::RunLoop().RunUntilIdle(); 500 base::RunLoop().RunUntilIdle();
466 501
467 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 502 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
468 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); 503 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id());
469 504
470 // The start callback should not be aborted by stop (see a comment on the dtor 505 // The start callback should not be aborted by stop (see a comment on the dtor
(...skipping 29 matching lines...) Expand all
500 const GURL scope("http://example.com/"); 535 const GURL scope("http://example.com/");
501 const GURL url("http://example.com/worker.js"); 536 const GURL url("http://example.com/worker.js");
502 537
503 std::unique_ptr<EmbeddedWorkerInstance> worker = 538 std::unique_ptr<EmbeddedWorkerInstance> worker =
504 embedded_worker_registry()->CreateWorker(); 539 embedded_worker_registry()->CreateWorker();
505 worker->AddListener(this); 540 worker->AddListener(this);
506 541
507 // Run the start worker sequence until pause after download. 542 // Run the start worker sequence until pause after download.
508 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 543 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
509 544
510 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 545 std::unique_ptr<EmbeddedWorkerStartParams> params(
511 CreateStartParams(version_id, scope, url)); 546 CreateStartParams(version_id, scope, url));
512 params->pause_after_download = true; 547 params->pause_after_download = true;
513 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 548 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
514 base::Bind(&base::DoNothing))); 549 base::Bind(&base::DoNothing)));
515 base::RunLoop().RunUntilIdle(); 550 base::RunLoop().RunUntilIdle();
516 551
517 // Make the worker stopping and attempt to send a resume after download 552 // Make the worker stopping and attempt to send a resume after download
518 // message. 553 // message.
519 worker->Stop(); 554 worker->Stop();
520 worker->ResumeAfterDownload(); 555 worker->ResumeAfterDownload();
(...skipping 10 matching lines...) Expand all
531 const GURL scope("http://example.com/"); 566 const GURL scope("http://example.com/");
532 const GURL url("http://example.com/worker.js"); 567 const GURL url("http://example.com/worker.js");
533 568
534 helper_.reset(new StalledInStartWorkerHelper); 569 helper_.reset(new StalledInStartWorkerHelper);
535 std::unique_ptr<EmbeddedWorkerInstance> worker = 570 std::unique_ptr<EmbeddedWorkerInstance> worker =
536 embedded_worker_registry()->CreateWorker(); 571 embedded_worker_registry()->CreateWorker();
537 worker->AddListener(this); 572 worker->AddListener(this);
538 573
539 // Run the start worker sequence until a start worker message is sent. 574 // Run the start worker sequence until a start worker message is sent.
540 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 575 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
541 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 576 std::unique_ptr<EmbeddedWorkerStartParams> params(
542 CreateStartParams(version_id, scope, url)); 577 CreateStartParams(version_id, scope, url));
543 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 578 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
544 base::Bind(&base::DoNothing))); 579 base::Bind(&base::DoNothing)));
545 base::RunLoop().RunUntilIdle(); 580 base::RunLoop().RunUntilIdle();
546 581
547 ASSERT_EQ(2u, events_.size()); 582 ASSERT_EQ(2u, events_.size());
548 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 583 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
549 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); 584 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
550 events_.clear(); 585 events_.clear();
551 586
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 const GURL url("http://example.com/worker.js"); 628 const GURL url("http://example.com/worker.js");
594 std::unique_ptr<EmbeddedWorkerInstance> worker = 629 std::unique_ptr<EmbeddedWorkerInstance> worker =
595 embedded_worker_registry()->CreateWorker(); 630 embedded_worker_registry()->CreateWorker();
596 helper_->SimulateAddProcessToPattern(pattern, 631 helper_->SimulateAddProcessToPattern(pattern,
597 helper_->mock_render_process_id()); 632 helper_->mock_render_process_id());
598 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 633 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
599 worker->AddListener(this); 634 worker->AddListener(this);
600 635
601 // Start the worker. 636 // Start the worker.
602 base::RunLoop run_loop; 637 base::RunLoop run_loop;
603 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 638 std::unique_ptr<EmbeddedWorkerStartParams> params(
604 CreateStartParams(version_id, pattern, url)); 639 CreateStartParams(version_id, pattern, url));
605 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 640 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
606 run_loop.QuitClosure())); 641 run_loop.QuitClosure()));
607 run_loop.Run(); 642 run_loop.Run();
608 643
609 // Detach. 644 // Detach.
610 int process_id = worker->process_id(); 645 int process_id = worker->process_id();
611 worker->Detach(); 646 worker->Detach();
612 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 647 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
613 648
(...skipping 14 matching lines...) Expand all
628 663
629 std::unique_ptr<EmbeddedWorkerInstance> worker = 664 std::unique_ptr<EmbeddedWorkerInstance> worker =
630 embedded_worker_registry()->CreateWorker(); 665 embedded_worker_registry()->CreateWorker();
631 helper_->SimulateAddProcessToPattern(pattern, 666 helper_->SimulateAddProcessToPattern(pattern,
632 helper_->mock_render_process_id()); 667 helper_->mock_render_process_id());
633 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 668 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
634 worker->AddListener(this); 669 worker->AddListener(this);
635 670
636 // Attempt to start the worker. 671 // Attempt to start the worker.
637 base::RunLoop run_loop; 672 base::RunLoop run_loop;
638 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 673 std::unique_ptr<EmbeddedWorkerStartParams> params(
639 CreateStartParams(version_id, pattern, url)); 674 CreateStartParams(version_id, pattern, url));
640 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 675 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
641 run_loop.QuitClosure())); 676 run_loop.QuitClosure()));
642 run_loop.Run(); 677 run_loop.Run();
643 678
644 // The callback should have run, and we should have got an OnStopped message. 679 // The callback should have run, and we should have got an OnStopped message.
645 EXPECT_EQ(SERVICE_WORKER_ERROR_IPC_FAILED, status); 680 EXPECT_EQ(SERVICE_WORKER_ERROR_IPC_FAILED, status);
646 ASSERT_EQ(2u, events_.size()); 681 ASSERT_EQ(2u, events_.size());
647 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 682 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
648 EXPECT_EQ(STOPPED, events_[1].type); 683 EXPECT_EQ(STOPPED, events_[1].type);
649 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[1].status); 684 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[1].status);
650 } 685 }
651 686
687 INSTANTIATE_TEST_CASE_P(EmbeddedWorkerInstanceTest,
688 EmbeddedWorkerInstanceTestP,
689 ::testing::Values(false, true));
690
652 } // namespace content 691 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/embedded_worker_instance.cc ('k') | content/browser/service_worker/embedded_worker_registry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698