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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/run_loop.h" | 6 #include "base/run_loop.h" |
7 #include "content/browser/message_port_service.h" | 7 #include "content/browser/message_port_service.h" |
8 #include "content/browser/service_worker/embedded_worker_registry.h" | 8 #include "content/browser/service_worker/embedded_worker_registry.h" |
9 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 9 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
10 #include "content/browser/service_worker/service_worker_context_core.h" | 10 #include "content/browser/service_worker/service_worker_context_core.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 | 120 |
121 void SetUpDummyMessagePort(std::vector<TransferredMessagePort>* ports) { | 121 void SetUpDummyMessagePort(std::vector<TransferredMessagePort>* ports) { |
122 int port_id = -1; | 122 int port_id = -1; |
123 MessagePortService::GetInstance()->Create(MSG_ROUTING_NONE, nullptr, | 123 MessagePortService::GetInstance()->Create(MSG_ROUTING_NONE, nullptr, |
124 &port_id); | 124 &port_id); |
125 TransferredMessagePort dummy_port; | 125 TransferredMessagePort dummy_port; |
126 dummy_port.id = port_id; | 126 dummy_port.id = port_id; |
127 ports->push_back(dummy_port); | 127 ports->push_back(dummy_port); |
128 } | 128 } |
129 | 129 |
| 130 base::Time GetYesterday() { |
| 131 return base::Time::Now() - base::TimeDelta::FromDays(1) - |
| 132 base::TimeDelta::FromSeconds(1); |
| 133 } |
| 134 |
130 } // namespace | 135 } // namespace |
131 | 136 |
132 class ServiceWorkerVersionTest : public testing::Test { | 137 class ServiceWorkerVersionTest : public testing::Test { |
133 protected: | 138 protected: |
134 struct RunningStateListener : public ServiceWorkerVersion::Listener { | 139 struct RunningStateListener : public ServiceWorkerVersion::Listener { |
135 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} | 140 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} |
136 ~RunningStateListener() override {} | 141 ~RunningStateListener() override {} |
137 void OnRunningStateChanged(ServiceWorkerVersion* version) override { | 142 void OnRunningStateChanged(ServiceWorkerVersion* version) override { |
138 last_status = version->running_status(); | 143 last_status = version->running_status(); |
139 } | 144 } |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 546 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
542 base::RunLoop().RunUntilIdle(); | 547 base::RunLoop().RunUntilIdle(); |
543 EXPECT_EQ(SERVICE_WORKER_OK, status); | 548 EXPECT_EQ(SERVICE_WORKER_OK, status); |
544 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 549 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
545 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); | 550 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); |
546 | 551 |
547 version_ = nullptr; | 552 version_ = nullptr; |
548 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); | 553 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); |
549 } | 554 } |
550 | 555 |
| 556 // Test that update isn't triggered for a non-stale worker. |
| 557 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { |
| 558 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 559 |
| 560 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 561 registration_->SetActiveVersion(version_); |
| 562 registration_->set_last_update_check(base::Time::Now()); |
| 563 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
| 564 std::string()); |
| 565 base::RunLoop().RunUntilIdle(); |
| 566 |
| 567 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 568 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 569 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
| 570 } |
| 571 |
| 572 // Test that update isn't triggered for a non-active worker. |
| 573 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { |
| 574 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 575 |
| 576 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
| 577 registration_->SetInstallingVersion(version_); |
| 578 registration_->set_last_update_check(GetYesterday()); |
| 579 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
| 580 base::RunLoop().RunUntilIdle(); |
| 581 |
| 582 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 583 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 584 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
| 585 } |
| 586 |
| 587 // Test that staleness is detected when starting a worker. |
| 588 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { |
| 589 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 590 |
| 591 // Starting the worker marks it as stale. |
| 592 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 593 registration_->SetActiveVersion(version_); |
| 594 registration_->set_last_update_check(GetYesterday()); |
| 595 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
| 596 std::string()); |
| 597 base::RunLoop().RunUntilIdle(); |
| 598 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 599 EXPECT_FALSE(version_->stale_time_.is_null()); |
| 600 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
| 601 |
| 602 // Update is actually scheduled after the worker stops. |
| 603 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); |
| 604 base::RunLoop().RunUntilIdle(); |
| 605 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 606 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 607 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
| 608 } |
| 609 |
| 610 // Test that staleness is detected on a running worker. |
| 611 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { |
| 612 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 613 |
| 614 // Start a fresh worker. |
| 615 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 616 registration_->SetActiveVersion(version_); |
| 617 registration_->set_last_update_check(base::Time::Now()); |
| 618 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
| 619 std::string()); |
| 620 base::RunLoop().RunUntilIdle(); |
| 621 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 622 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 623 |
| 624 // Simulate it running for a day. It will be marked stale. |
| 625 registration_->set_last_update_check(GetYesterday()); |
| 626 version_->OnTimeoutTimer(); |
| 627 EXPECT_FALSE(version_->stale_time_.is_null()); |
| 628 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
| 629 |
| 630 // Simulate it running for past the wait threshold. The update will be |
| 631 // scheduled. |
| 632 version_->stale_time_ = |
| 633 base::TimeTicks::Now() - |
| 634 base::TimeDelta::FromMinutes( |
| 635 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); |
| 636 version_->OnTimeoutTimer(); |
| 637 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 638 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
| 639 } |
| 640 |
| 641 // Test that a stream of events doesn't restart the timer. |
| 642 TEST_F(ServiceWorkerVersionTest, StaleUpdate_DoNotDeferTimer) { |
| 643 // Make a stale worker. |
| 644 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 645 registration_->SetActiveVersion(version_); |
| 646 registration_->set_last_update_check(GetYesterday()); |
| 647 base::TimeTicks stale_time = |
| 648 base::TimeTicks::Now() - |
| 649 base::TimeDelta::FromMinutes( |
| 650 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); |
| 651 version_->stale_time_ = stale_time; |
| 652 |
| 653 // Stale time is not deferred. |
| 654 version_->DispatchPushEvent( |
| 655 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); |
| 656 version_->DispatchPushEvent( |
| 657 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); |
| 658 EXPECT_EQ(stale_time, version_->stale_time_); |
| 659 |
| 660 // Timeout triggers the update. |
| 661 version_->OnTimeoutTimer(); |
| 662 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 663 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
| 664 |
| 665 // Update timer is not deferred. |
| 666 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); |
| 667 version_->DispatchPushEvent( |
| 668 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); |
| 669 version_->DispatchPushEvent( |
| 670 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); |
| 671 version_->DispatchPushEvent( |
| 672 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); |
| 673 base::RunLoop().RunUntilIdle(); |
| 674 EXPECT_TRUE(version_->stale_time_.is_null()); |
| 675 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); |
| 676 } |
| 677 |
551 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) { | 678 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) { |
552 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 679 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
553 | 680 |
554 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 681 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
555 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), | 682 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), |
556 base::Bind(&base::DoNothing), | 683 base::Bind(&base::DoNothing), |
557 base::Bind(&ReceiveFetchResult, &status)); | 684 base::Bind(&ReceiveFetchResult, &status)); |
558 base::RunLoop().RunUntilIdle(); | 685 base::RunLoop().RunUntilIdle(); |
559 | 686 |
560 // Callback has not completed yet. | 687 // Callback has not completed yet. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 base::TimeTicks::Now() - | 742 base::TimeTicks::Now() - |
616 base::TimeDelta::FromMinutes( | 743 base::TimeDelta::FromMinutes( |
617 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); | 744 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); |
618 version_->timeout_timer_.user_task().Run(); | 745 version_->timeout_timer_.user_task().Run(); |
619 base::RunLoop().RunUntilIdle(); | 746 base::RunLoop().RunUntilIdle(); |
620 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 747 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
621 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 748 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
622 } | 749 } |
623 | 750 |
624 } // namespace content | 751 } // namespace content |
OLD | NEW |