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

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

Issue 2490623005: Remove InterfaceRegistry/Provider from service workers (Closed)
Patch Set: Created 4 years, 1 month 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/command_line.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/stl_util.h" 14 #include "base/stl_util.h"
15 #include "content/browser/service_worker/embedded_worker_registry.h" 15 #include "content/browser/service_worker/embedded_worker_registry.h"
16 #include "content/browser/service_worker/embedded_worker_status.h" 16 #include "content/browser/service_worker/embedded_worker_status.h"
17 #include "content/browser/service_worker/embedded_worker_test_helper.h" 17 #include "content/browser/service_worker/embedded_worker_test_helper.h"
18 #include "content/browser/service_worker/service_worker_context_core.h" 18 #include "content/browser/service_worker/service_worker_context_core.h"
19 #include "content/browser/service_worker/service_worker_context_wrapper.h" 19 #include "content/browser/service_worker/service_worker_context_wrapper.h"
20 #include "content/browser/service_worker/service_worker_test_utils.h" 20 #include "content/browser/service_worker/service_worker_test_utils.h"
21 #include "content/common/service_worker/embedded_worker.mojom.h" 21 #include "content/common/service_worker/embedded_worker.mojom.h"
22 #include "content/common/service_worker/embedded_worker_messages.h" 22 #include "content/common/service_worker/embedded_worker_messages.h"
23 #include "content/common/service_worker/embedded_worker_start_params.h" 23 #include "content/common/service_worker/embedded_worker_start_params.h"
24 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
24 #include "content/common/service_worker/service_worker_utils.h" 25 #include "content/common/service_worker/service_worker_utils.h"
25 #include "content/public/common/child_process_host.h" 26 #include "content/public/common/child_process_host.h"
26 #include "content/public/common/content_switches.h" 27 #include "content/public/common/content_switches.h"
27 #include "content/public/test/test_browser_thread_bundle.h" 28 #include "content/public/test/test_browser_thread_bundle.h"
28 #include "mojo/public/cpp/bindings/strong_binding.h" 29 #include "mojo/public/cpp/bindings/strong_binding.h"
29 #include "testing/gmock/include/gmock/gmock.h" 30 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
31 32
32 namespace content { 33 namespace content {
33 34
34 namespace { 35 namespace {
35 36
36 void SaveStatusAndCall(ServiceWorkerStatusCode* out, 37 void SaveStatusAndCall(ServiceWorkerStatusCode* out,
37 const base::Closure& callback, 38 const base::Closure& callback,
38 ServiceWorkerStatusCode status) { 39 ServiceWorkerStatusCode status) {
39 *out = status; 40 *out = status;
40 callback.Run(); 41 callback.Run();
41 } 42 }
42 43
43 std::unique_ptr<EmbeddedWorkerStartParams>
44 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) {
45 std::unique_ptr<EmbeddedWorkerStartParams> params(
46 new EmbeddedWorkerStartParams);
47 params->service_worker_version_id = version_id;
48 params->scope = scope;
49 params->script_url = script_url;
50 params->pause_after_download = false;
51 params->is_installed = false;
52 return params;
53 }
54
55 } // namespace 44 } // namespace
56 45
57 class EmbeddedWorkerInstanceTest : public testing::Test, 46 class EmbeddedWorkerInstanceTest : public testing::Test,
58 public EmbeddedWorkerInstance::Listener { 47 public EmbeddedWorkerInstance::Listener {
59 protected: 48 protected:
60 EmbeddedWorkerInstanceTest() 49 EmbeddedWorkerInstanceTest()
61 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} 50 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
62 51
63 enum EventType { 52 enum EventType {
64 PROCESS_ALLOCATED, 53 PROCESS_ALLOCATED,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 ServiceWorkerStatusCode status; 95 ServiceWorkerStatusCode status;
107 base::RunLoop run_loop; 96 base::RunLoop run_loop;
108 std::unique_ptr<EmbeddedWorkerStartParams> params = 97 std::unique_ptr<EmbeddedWorkerStartParams> params =
109 CreateStartParams(id, pattern, url); 98 CreateStartParams(id, pattern, url);
110 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 99 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
111 run_loop.QuitClosure())); 100 run_loop.QuitClosure()));
112 run_loop.Run(); 101 run_loop.Run();
113 return status; 102 return status;
114 } 103 }
115 104
105 std::unique_ptr<EmbeddedWorkerStartParams>
106 CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) {
107 std::unique_ptr<EmbeddedWorkerStartParams> params(
108 new EmbeddedWorkerStartParams);
109 params->internal.service_worker_version_id = version_id;
110 params->internal.scope = scope;
111 params->internal.script_url = script_url;
112 params->internal.pause_after_download = false;
113 params->internal.is_installed = false;
114 params->dispatcher_request = CreateEventDispatcher();
115 return params;
116 }
117
118 mojom::ServiceWorkerEventDispatcherRequest CreateEventDispatcher() {
119 dispatchers_.emplace_back();
120 return mojo::GetProxy(&dispatchers_.back());
121 }
122
116 ServiceWorkerContextCore* context() { return helper_->context(); } 123 ServiceWorkerContextCore* context() { return helper_->context(); }
117 124
118 EmbeddedWorkerRegistry* embedded_worker_registry() { 125 EmbeddedWorkerRegistry* embedded_worker_registry() {
119 DCHECK(context()); 126 DCHECK(context());
120 return context()->embedded_worker_registry(); 127 return context()->embedded_worker_registry();
121 } 128 }
122 129
123 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } 130 IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); }
124 131
125 std::vector<std::unique_ptr< 132 std::vector<std::unique_ptr<
126 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* 133 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>*
127 mock_instance_clients() { 134 mock_instance_clients() {
128 return helper_->mock_instance_clients(); 135 return helper_->mock_instance_clients();
129 } 136 }
130 137
138 std::vector<mojom::ServiceWorkerEventDispatcherPtr> dispatchers_;
139
131 TestBrowserThreadBundle thread_bundle_; 140 TestBrowserThreadBundle thread_bundle_;
132 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; 141 std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
133 std::vector<EventLog> events_; 142 std::vector<EventLog> events_;
134 143
135 private: 144 private:
136 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); 145 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest);
137 }; 146 };
138 147
139 class EmbeddedWorkerInstanceTestP 148 class EmbeddedWorkerInstanceTestP
140 : public MojoServiceWorkerTestP<EmbeddedWorkerInstanceTest> {}; 149 : public MojoServiceWorkerTestP<EmbeddedWorkerInstanceTest> {};
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 // unittests can't actually create a new process itself. 263 // unittests can't actually create a new process itself.
255 // ServiceWorkerProcessManager only chooses this process id in unittests if 264 // ServiceWorkerProcessManager only chooses this process id in unittests if
256 // can_use_existing_process is false. 265 // can_use_existing_process is false.
257 helper_->SimulateAddProcessToPattern(pattern, 266 helper_->SimulateAddProcessToPattern(pattern,
258 helper_->new_render_process_id()); 267 helper_->new_render_process_id());
259 268
260 { 269 {
261 // Start once normally. 270 // Start once normally.
262 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 271 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
263 base::RunLoop run_loop; 272 base::RunLoop run_loop;
264 std::unique_ptr<EmbeddedWorkerStartParams> params( 273 std::unique_ptr<EmbeddedWorkerStartParams> params =
265 CreateStartParams(service_worker_version_id, pattern, url)); 274 CreateStartParams(service_worker_version_id, pattern, url);
266 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 275 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
267 run_loop.QuitClosure())); 276 run_loop.QuitClosure()));
268 run_loop.Run(); 277 run_loop.Run();
269 EXPECT_EQ(SERVICE_WORKER_OK, status); 278 EXPECT_EQ(SERVICE_WORKER_OK, status);
270 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); 279 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
271 // The worker should be using the default render process. 280 // The worker should be using the default render process.
272 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); 281 EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
273 282
274 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); 283 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop());
275 base::RunLoop().RunUntilIdle(); 284 base::RunLoop().RunUntilIdle();
276 } 285 }
277 286
278 // Fail twice. 287 // Fail twice.
279 context()->UpdateVersionFailureCount(service_worker_version_id, 288 context()->UpdateVersionFailureCount(service_worker_version_id,
280 SERVICE_WORKER_ERROR_FAILED); 289 SERVICE_WORKER_ERROR_FAILED);
281 context()->UpdateVersionFailureCount(service_worker_version_id, 290 context()->UpdateVersionFailureCount(service_worker_version_id,
282 SERVICE_WORKER_ERROR_FAILED); 291 SERVICE_WORKER_ERROR_FAILED);
283 292
284 { 293 {
285 // Start again. 294 // Start again.
286 ServiceWorkerStatusCode status; 295 ServiceWorkerStatusCode status;
287 base::RunLoop run_loop; 296 base::RunLoop run_loop;
288 std::unique_ptr<EmbeddedWorkerStartParams> params( 297 std::unique_ptr<EmbeddedWorkerStartParams> params =
289 CreateStartParams(service_worker_version_id, pattern, url)); 298 CreateStartParams(service_worker_version_id, pattern, url);
290 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 299 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
291 run_loop.QuitClosure())); 300 run_loop.QuitClosure()));
292 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); 301 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
293 run_loop.Run(); 302 run_loop.Run();
294 EXPECT_EQ(SERVICE_WORKER_OK, status); 303 EXPECT_EQ(SERVICE_WORKER_OK, status);
295 304
296 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); 305 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
297 // The worker should be using the new render process. 306 // The worker should be using the new render process.
298 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); 307 EXPECT_EQ(helper_->new_render_process_id(), worker->process_id());
299 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); 308 EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop());
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 const int64_t version_id2 = 56L; 367 const int64_t version_id2 = 56L;
359 const GURL pattern("http://example.com/"); 368 const GURL pattern("http://example.com/");
360 const GURL url("http://example.com/worker.js"); 369 const GURL url("http://example.com/worker.js");
361 int process_id = helper_->mock_render_process_id(); 370 int process_id = helper_->mock_render_process_id();
362 371
363 helper_->SimulateAddProcessToPattern(pattern, process_id); 372 helper_->SimulateAddProcessToPattern(pattern, process_id);
364 { 373 {
365 // Start worker1. 374 // Start worker1.
366 ServiceWorkerStatusCode status; 375 ServiceWorkerStatusCode status;
367 base::RunLoop run_loop; 376 base::RunLoop run_loop;
368 std::unique_ptr<EmbeddedWorkerStartParams> params( 377 std::unique_ptr<EmbeddedWorkerStartParams> params =
369 CreateStartParams(version_id1, pattern, url)); 378 CreateStartParams(version_id1, pattern, url);
370 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 379 worker1->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
371 run_loop.QuitClosure())); 380 run_loop.QuitClosure()));
372 run_loop.Run(); 381 run_loop.Run();
373 EXPECT_EQ(SERVICE_WORKER_OK, status); 382 EXPECT_EQ(SERVICE_WORKER_OK, status);
374 } 383 }
375 384
376 { 385 {
377 // Start worker2. 386 // Start worker2.
378 ServiceWorkerStatusCode status; 387 ServiceWorkerStatusCode status;
379 base::RunLoop run_loop; 388 base::RunLoop run_loop;
380 std::unique_ptr<EmbeddedWorkerStartParams> params( 389 std::unique_ptr<EmbeddedWorkerStartParams> params =
381 CreateStartParams(version_id2, pattern, url)); 390 CreateStartParams(version_id2, pattern, url);
382 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 391 worker2->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
383 run_loop.QuitClosure())); 392 run_loop.QuitClosure()));
384 run_loop.Run(); 393 run_loop.Run();
385 EXPECT_EQ(SERVICE_WORKER_OK, status); 394 EXPECT_EQ(SERVICE_WORKER_OK, status);
386 } 395 }
387 396
388 // The two workers share the same process. 397 // The two workers share the same process.
389 EXPECT_EQ(worker1->process_id(), worker2->process_id()); 398 EXPECT_EQ(worker1->process_id(), worker2->process_id());
390 399
391 // Destroy worker1. It removes itself from the registry. 400 // Destroy worker1. It removes itself from the registry.
(...skipping 15 matching lines...) Expand all
407 const int64_t version_id = 55L; 416 const int64_t version_id = 55L;
408 const GURL scope("http://example.com/"); 417 const GURL scope("http://example.com/");
409 const GURL url("http://example.com/worker.js"); 418 const GURL url("http://example.com/worker.js");
410 419
411 std::unique_ptr<EmbeddedWorkerInstance> worker = 420 std::unique_ptr<EmbeddedWorkerInstance> worker =
412 embedded_worker_registry()->CreateWorker(); 421 embedded_worker_registry()->CreateWorker();
413 worker->AddListener(this); 422 worker->AddListener(this);
414 423
415 // Run the start worker sequence and detach during process allocation. 424 // Run the start worker sequence and detach during process allocation.
416 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 425 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
417 std::unique_ptr<EmbeddedWorkerStartParams> params( 426 std::unique_ptr<EmbeddedWorkerStartParams> params =
418 CreateStartParams(version_id, scope, url)); 427 CreateStartParams(version_id, scope, url);
419 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 428 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
420 base::Bind(&base::DoNothing))); 429 base::Bind(&base::DoNothing)));
421 worker->Detach(); 430 worker->Detach();
422 base::RunLoop().RunUntilIdle(); 431 base::RunLoop().RunUntilIdle();
423 432
424 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 433 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
425 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); 434 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id());
426 435
427 // The start callback should not be aborted by detach (see a comment on the 436 // The start callback should not be aborted by detach (see a comment on the
428 // dtor of EmbeddedWorkerInstance::StartTask). 437 // dtor of EmbeddedWorkerInstance::StartTask).
(...skipping 10 matching lines...) Expand all
439 const GURL scope("http://example.com/"); 448 const GURL scope("http://example.com/");
440 const GURL url("http://example.com/worker.js"); 449 const GURL url("http://example.com/worker.js");
441 450
442 helper_.reset(new StalledInStartWorkerHelper()); 451 helper_.reset(new StalledInStartWorkerHelper());
443 std::unique_ptr<EmbeddedWorkerInstance> worker = 452 std::unique_ptr<EmbeddedWorkerInstance> worker =
444 embedded_worker_registry()->CreateWorker(); 453 embedded_worker_registry()->CreateWorker();
445 worker->AddListener(this); 454 worker->AddListener(this);
446 455
447 // Run the start worker sequence until a start worker message is sent. 456 // Run the start worker sequence until a start worker message is sent.
448 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 457 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
449 std::unique_ptr<EmbeddedWorkerStartParams> params( 458 std::unique_ptr<EmbeddedWorkerStartParams> params =
450 CreateStartParams(version_id, scope, url)); 459 CreateStartParams(version_id, scope, url);
451 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 460 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
452 base::Bind(&base::DoNothing))); 461 base::Bind(&base::DoNothing)));
453 base::RunLoop().RunUntilIdle(); 462 base::RunLoop().RunUntilIdle();
454 463
455 ASSERT_EQ(2u, events_.size()); 464 ASSERT_EQ(2u, events_.size());
456 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 465 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
457 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); 466 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
458 events_.clear(); 467 events_.clear();
459 468
460 worker->Detach(); 469 worker->Detach();
(...skipping 17 matching lines...) Expand all
478 const GURL scope("http://example.com/"); 487 const GURL scope("http://example.com/");
479 const GURL url("http://example.com/worker.js"); 488 const GURL url("http://example.com/worker.js");
480 489
481 std::unique_ptr<EmbeddedWorkerInstance> worker = 490 std::unique_ptr<EmbeddedWorkerInstance> worker =
482 embedded_worker_registry()->CreateWorker(); 491 embedded_worker_registry()->CreateWorker();
483 worker->AddListener(this); 492 worker->AddListener(this);
484 493
485 // Stop the start worker sequence before a process is allocated. 494 // Stop the start worker sequence before a process is allocated.
486 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 495 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
487 496
488 std::unique_ptr<EmbeddedWorkerStartParams> params( 497 std::unique_ptr<EmbeddedWorkerStartParams> params =
489 CreateStartParams(version_id, scope, url)); 498 CreateStartParams(version_id, scope, url);
490 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 499 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
491 base::Bind(&base::DoNothing))); 500 base::Bind(&base::DoNothing)));
492 worker->Stop(); 501 worker->Stop();
493 base::RunLoop().RunUntilIdle(); 502 base::RunLoop().RunUntilIdle();
494 503
495 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 504 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
496 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id()); 505 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, worker->process_id());
497 506
498 // The start callback should not be aborted by stop (see a comment on the dtor 507 // The start callback should not be aborted by stop (see a comment on the dtor
499 // of EmbeddedWorkerInstance::StartTask). 508 // of EmbeddedWorkerInstance::StartTask).
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 const GURL scope("http://example.com/"); 543 const GURL scope("http://example.com/");
535 const GURL url("http://example.com/worker.js"); 544 const GURL url("http://example.com/worker.js");
536 545
537 std::unique_ptr<EmbeddedWorkerInstance> worker = 546 std::unique_ptr<EmbeddedWorkerInstance> worker =
538 embedded_worker_registry()->CreateWorker(); 547 embedded_worker_registry()->CreateWorker();
539 worker->AddListener(this); 548 worker->AddListener(this);
540 549
541 // Run the start worker sequence until pause after download. 550 // Run the start worker sequence until pause after download.
542 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 551 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
543 552
544 std::unique_ptr<EmbeddedWorkerStartParams> params( 553 std::unique_ptr<EmbeddedWorkerStartParams> params =
545 CreateStartParams(version_id, scope, url)); 554 CreateStartParams(version_id, scope, url);
546 params->pause_after_download = true; 555 params->internal.pause_after_download = true;
547 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 556 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
548 base::Bind(&base::DoNothing))); 557 base::Bind(&base::DoNothing)));
549 base::RunLoop().RunUntilIdle(); 558 base::RunLoop().RunUntilIdle();
550 559
551 // Make the worker stopping and attempt to send a resume after download 560 // Make the worker stopping and attempt to send a resume after download
552 // message. 561 // message.
553 worker->Stop(); 562 worker->Stop();
554 worker->ResumeAfterDownload(); 563 worker->ResumeAfterDownload();
555 base::RunLoop().RunUntilIdle(); 564 base::RunLoop().RunUntilIdle();
556 565
557 // The resume after download message should not have been sent. 566 // The resume after download message should not have been sent.
558 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 567 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
559 EXPECT_FALSE(ipc_sink()->GetFirstMessageMatching( 568 EXPECT_FALSE(ipc_sink()->GetFirstMessageMatching(
560 EmbeddedWorkerMsg_ResumeAfterDownload::ID)); 569 EmbeddedWorkerMsg_ResumeAfterDownload::ID));
561 } 570 }
562 571
563 TEST_P(EmbeddedWorkerInstanceTestP, StopAfterSendingStartWorkerMessage) { 572 TEST_P(EmbeddedWorkerInstanceTestP, StopAfterSendingStartWorkerMessage) {
564 const int64_t version_id = 55L; 573 const int64_t version_id = 55L;
565 const GURL scope("http://example.com/"); 574 const GURL scope("http://example.com/");
566 const GURL url("http://example.com/worker.js"); 575 const GURL url("http://example.com/worker.js");
567 576
568 helper_.reset(new StalledInStartWorkerHelper); 577 helper_.reset(new StalledInStartWorkerHelper);
569 std::unique_ptr<EmbeddedWorkerInstance> worker = 578 std::unique_ptr<EmbeddedWorkerInstance> worker =
570 embedded_worker_registry()->CreateWorker(); 579 embedded_worker_registry()->CreateWorker();
571 worker->AddListener(this); 580 worker->AddListener(this);
572 581
573 // Run the start worker sequence until a start worker message is sent. 582 // Run the start worker sequence until a start worker message is sent.
574 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 583 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
575 std::unique_ptr<EmbeddedWorkerStartParams> params( 584 std::unique_ptr<EmbeddedWorkerStartParams> params =
576 CreateStartParams(version_id, scope, url)); 585 CreateStartParams(version_id, scope, url);
577 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 586 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
578 base::Bind(&base::DoNothing))); 587 base::Bind(&base::DoNothing)));
579 base::RunLoop().RunUntilIdle(); 588 base::RunLoop().RunUntilIdle();
580 589
581 ASSERT_EQ(2u, events_.size()); 590 ASSERT_EQ(2u, events_.size());
582 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 591 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
583 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); 592 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
584 events_.clear(); 593 events_.clear();
585 594
586 worker->Stop(); 595 worker->Stop();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 const GURL url("http://example.com/worker.js"); 636 const GURL url("http://example.com/worker.js");
628 std::unique_ptr<EmbeddedWorkerInstance> worker = 637 std::unique_ptr<EmbeddedWorkerInstance> worker =
629 embedded_worker_registry()->CreateWorker(); 638 embedded_worker_registry()->CreateWorker();
630 helper_->SimulateAddProcessToPattern(pattern, 639 helper_->SimulateAddProcessToPattern(pattern,
631 helper_->mock_render_process_id()); 640 helper_->mock_render_process_id());
632 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 641 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
633 worker->AddListener(this); 642 worker->AddListener(this);
634 643
635 // Start the worker. 644 // Start the worker.
636 base::RunLoop run_loop; 645 base::RunLoop run_loop;
637 std::unique_ptr<EmbeddedWorkerStartParams> params( 646 std::unique_ptr<EmbeddedWorkerStartParams> params =
638 CreateStartParams(version_id, pattern, url)); 647 CreateStartParams(version_id, pattern, url);
639 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 648 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
640 run_loop.QuitClosure())); 649 run_loop.QuitClosure()));
641 run_loop.Run(); 650 run_loop.Run();
642 651
643 // Detach. 652 // Detach.
644 int process_id = worker->process_id(); 653 int process_id = worker->process_id();
645 worker->Detach(); 654 worker->Detach();
646 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); 655 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
647 656
648 // Send the registry a message from the detached worker. Nothing should 657 // Send the registry a message from the detached worker. Nothing should
(...skipping 17 matching lines...) Expand all
666 } 675 }
667 676
668 std::unique_ptr<EmbeddedWorkerInstance> worker = 677 std::unique_ptr<EmbeddedWorkerInstance> worker =
669 embedded_worker_registry()->CreateWorker(); 678 embedded_worker_registry()->CreateWorker();
670 helper_->SimulateAddProcessToPattern(pattern, 679 helper_->SimulateAddProcessToPattern(pattern,
671 helper_->mock_render_process_id()); 680 helper_->mock_render_process_id());
672 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 681 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
673 worker->AddListener(this); 682 worker->AddListener(this);
674 683
675 // Attempt to start the worker. 684 // Attempt to start the worker.
676 std::unique_ptr<EmbeddedWorkerStartParams> params( 685 std::unique_ptr<EmbeddedWorkerStartParams> params =
677 CreateStartParams(version_id, pattern, url)); 686 CreateStartParams(version_id, pattern, url);
678 if (is_mojo_enabled()) { 687 if (is_mojo_enabled()) {
679 worker->Start(std::move(params), 688 worker->Start(std::move(params),
680 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 689 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
681 base::RunLoop().RunUntilIdle(); 690 base::RunLoop().RunUntilIdle();
682 } else { 691 } else {
683 base::RunLoop run_loop; 692 base::RunLoop run_loop;
684 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, 693 worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status,
685 run_loop.QuitClosure())); 694 run_loop.QuitClosure()));
686 run_loop.Run(); 695 run_loop.Run();
687 } 696 }
(...skipping 18 matching lines...) Expand all
706 715
707 class FailEmbeddedWorkerInstanceClientImpl 716 class FailEmbeddedWorkerInstanceClientImpl
708 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient { 717 : public EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient {
709 public: 718 public:
710 explicit FailEmbeddedWorkerInstanceClientImpl( 719 explicit FailEmbeddedWorkerInstanceClientImpl(
711 base::WeakPtr<EmbeddedWorkerTestHelper> helper) 720 base::WeakPtr<EmbeddedWorkerTestHelper> helper)
712 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} 721 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {}
713 722
714 private: 723 private:
715 void StartWorker( 724 void StartWorker(
716 const EmbeddedWorkerStartParams& /* unused */, 725 const EmbeddedWorkerStartParamsInternal& /* unused */,
717 service_manager::mojom::InterfaceProviderPtr /* unused */, 726 mojom::ServiceWorkerEventDispatcherRequest /* unused */) override {
718 service_manager::mojom::InterfaceProviderRequest /* unused */) override {
719 helper_->mock_instance_clients()->clear(); 727 helper_->mock_instance_clients()->clear();
720 } 728 }
721 }; 729 };
722 730
723 TEST_P(EmbeddedWorkerInstanceTestP, RemoveRemoteInterface) { 731 TEST_P(EmbeddedWorkerInstanceTestP, RemoveRemoteInterface) {
724 if (!is_mojo_enabled()) 732 if (!is_mojo_enabled())
725 return; 733 return;
726 734
727 const int64_t version_id = 55L; 735 const int64_t version_id = 55L;
728 const GURL pattern("http://example.com/"); 736 const GURL pattern("http://example.com/");
729 const GURL url("http://example.com/worker.js"); 737 const GURL url("http://example.com/worker.js");
730 738
731 // Let StartWorker fail; binding is discarded in the middle of IPC 739 // Let StartWorker fail; binding is discarded in the middle of IPC
732 helper_->RegisterMockInstanceClient( 740 helper_->RegisterMockInstanceClient(
733 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>( 741 base::MakeUnique<FailEmbeddedWorkerInstanceClientImpl>(
734 helper_->AsWeakPtr())); 742 helper_->AsWeakPtr()));
735 ASSERT_EQ(mock_instance_clients()->size(), 1UL); 743 ASSERT_EQ(mock_instance_clients()->size(), 1UL);
736 744
737 std::unique_ptr<EmbeddedWorkerInstance> worker = 745 std::unique_ptr<EmbeddedWorkerInstance> worker =
738 embedded_worker_registry()->CreateWorker(); 746 embedded_worker_registry()->CreateWorker();
739 helper_->SimulateAddProcessToPattern(pattern, 747 helper_->SimulateAddProcessToPattern(pattern,
740 helper_->mock_render_process_id()); 748 helper_->mock_render_process_id());
741 worker->AddListener(this); 749 worker->AddListener(this);
742 750
743 // Attempt to start the worker. 751 // Attempt to start the worker.
744 std::unique_ptr<EmbeddedWorkerStartParams> params( 752 std::unique_ptr<EmbeddedWorkerStartParams> params =
745 CreateStartParams(version_id, pattern, url)); 753 CreateStartParams(version_id, pattern, url);
746 worker->Start(std::move(params), 754 worker->Start(std::move(params),
747 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 755 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
748 base::RunLoop().RunUntilIdle(); 756 base::RunLoop().RunUntilIdle();
749 757
750 // Worker should handle the sudden shutdown as detach. 758 // Worker should handle the sudden shutdown as detach.
751 ASSERT_EQ(3u, events_.size()); 759 ASSERT_EQ(3u, events_.size());
752 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); 760 EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
753 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); 761 EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
754 EXPECT_EQ(DETACHED, events_[2].type); 762 EXPECT_EQ(DETACHED, events_[2].type);
755 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); 763 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status);
756 } 764 }
757 765
758 INSTANTIATE_TEST_CASE_P(EmbeddedWorkerInstanceTest, 766 INSTANTIATE_TEST_CASE_P(EmbeddedWorkerInstanceTest,
759 EmbeddedWorkerInstanceTestP, 767 EmbeddedWorkerInstanceTestP,
760 ::testing::Values(false, true)); 768 ::testing::Values(false, true));
761 769
762 } // namespace content 770 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698