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

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

Issue 1187623006: Service Worker: Update stale workers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix DCHECK Created 5 years, 6 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 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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | content/common/service_worker/service_worker_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698