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 <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "content/browser/message_port_service.h" | 9 #include "content/browser/message_port_service.h" |
10 #include "content/browser/service_worker/embedded_worker_registry.h" | 10 #include "content/browser/service_worker/embedded_worker_registry.h" |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() { | 233 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() { |
234 return make_scoped_ptr(new MessageReceiver()); | 234 return make_scoped_ptr(new MessageReceiver()); |
235 } | 235 } |
236 | 236 |
237 void TearDown() override { | 237 void TearDown() override { |
238 version_ = 0; | 238 version_ = 0; |
239 registration_ = 0; | 239 registration_ = 0; |
240 helper_.reset(); | 240 helper_.reset(); |
241 } | 241 } |
242 | 242 |
| 243 void SimulateDispatchEvent() { |
| 244 ServiceWorkerStatusCode status = |
| 245 SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value |
| 246 |
| 247 // Make sure worker is running. |
| 248 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 249 version_->RunAfterStartWorker(runner->QuitClosure(), |
| 250 CreateReceiverOnCurrentThread(&status)); |
| 251 runner->Run(); |
| 252 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
| 253 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 254 |
| 255 // Start request, as if an event is being dispatched. |
| 256 int request_id = |
| 257 version_->StartRequest(ServiceWorkerMetrics::EventType::PUSH, |
| 258 CreateReceiverOnCurrentThread(&status)); |
| 259 base::RunLoop().RunUntilIdle(); |
| 260 |
| 261 // And finish request, as if a response to the event was received. |
| 262 EXPECT_TRUE(version_->FinishRequest(request_id)); |
| 263 base::RunLoop().RunUntilIdle(); |
| 264 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
| 265 } |
| 266 |
243 TestBrowserThreadBundle thread_bundle_; | 267 TestBrowserThreadBundle thread_bundle_; |
244 scoped_ptr<MessageReceiver> helper_; | 268 scoped_ptr<MessageReceiver> helper_; |
245 scoped_refptr<ServiceWorkerRegistration> registration_; | 269 scoped_refptr<ServiceWorkerRegistration> registration_; |
246 scoped_refptr<ServiceWorkerVersion> version_; | 270 scoped_refptr<ServiceWorkerVersion> version_; |
247 GURL pattern_; | 271 GURL pattern_; |
248 | 272 |
249 private: | 273 private: |
250 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); | 274 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); |
251 }; | 275 }; |
252 | 276 |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 EXPECT_EQ(SERVICE_WORKER_OK, status); | 719 EXPECT_EQ(SERVICE_WORKER_OK, status); |
696 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 720 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
697 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); | 721 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); |
698 | 722 |
699 version_ = nullptr; | 723 version_ = nullptr; |
700 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); | 724 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); |
701 } | 725 } |
702 | 726 |
703 // Test that update isn't triggered for a non-stale worker. | 727 // Test that update isn't triggered for a non-stale worker. |
704 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { | 728 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { |
705 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
706 | |
707 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 729 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
708 registration_->SetActiveVersion(version_); | 730 registration_->SetActiveVersion(version_); |
709 registration_->set_last_update_check(base::Time::Now()); | 731 registration_->set_last_update_check(base::Time::Now()); |
710 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 732 SimulateDispatchEvent(); |
711 std::string()); | |
712 base::RunLoop().RunUntilIdle(); | |
713 | 733 |
714 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
715 EXPECT_TRUE(version_->stale_time_.is_null()); | 734 EXPECT_TRUE(version_->stale_time_.is_null()); |
716 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 735 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
717 } | 736 } |
718 | 737 |
719 // Test that update isn't triggered for a non-active worker. | 738 // Test that update isn't triggered for a non-active worker. |
720 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { | 739 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { |
721 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 740 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
722 | 741 |
723 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 742 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
724 registration_->SetInstallingVersion(version_); | 743 registration_->SetInstallingVersion(version_); |
725 registration_->set_last_update_check(GetYesterday()); | 744 registration_->set_last_update_check(GetYesterday()); |
726 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); | 745 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
727 base::RunLoop().RunUntilIdle(); | 746 base::RunLoop().RunUntilIdle(); |
728 | 747 |
729 EXPECT_EQ(SERVICE_WORKER_OK, status); | 748 EXPECT_EQ(SERVICE_WORKER_OK, status); |
730 EXPECT_TRUE(version_->stale_time_.is_null()); | 749 EXPECT_TRUE(version_->stale_time_.is_null()); |
731 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 750 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
732 } | 751 } |
733 | 752 |
734 // Test that staleness is detected when starting a worker. | 753 // Test that staleness is detected when starting a worker. |
735 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { | 754 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { |
736 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 755 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
737 | 756 |
738 // Starting the worker marks it as stale. | 757 // Starting the worker marks it as stale. |
739 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 758 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
740 registration_->SetActiveVersion(version_); | 759 registration_->SetActiveVersion(version_); |
741 registration_->set_last_update_check(GetYesterday()); | 760 registration_->set_last_update_check(GetYesterday()); |
742 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 761 SimulateDispatchEvent(); |
743 std::string()); | |
744 base::RunLoop().RunUntilIdle(); | |
745 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
746 EXPECT_FALSE(version_->stale_time_.is_null()); | 762 EXPECT_FALSE(version_->stale_time_.is_null()); |
747 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 763 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
748 | 764 |
749 // Update is actually scheduled after the worker stops. | 765 // Update is actually scheduled after the worker stops. |
750 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | 766 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); |
751 base::RunLoop().RunUntilIdle(); | 767 base::RunLoop().RunUntilIdle(); |
752 EXPECT_EQ(SERVICE_WORKER_OK, status); | 768 EXPECT_EQ(SERVICE_WORKER_OK, status); |
753 EXPECT_TRUE(version_->stale_time_.is_null()); | 769 EXPECT_TRUE(version_->stale_time_.is_null()); |
754 EXPECT_TRUE(version_->update_timer_.IsRunning()); | 770 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
755 } | 771 } |
756 | 772 |
757 // Test that staleness is detected on a running worker. | 773 // Test that staleness is detected on a running worker. |
758 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { | 774 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { |
759 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
760 | |
761 // Start a fresh worker. | 775 // Start a fresh worker. |
762 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 776 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
763 registration_->SetActiveVersion(version_); | 777 registration_->SetActiveVersion(version_); |
764 registration_->set_last_update_check(base::Time::Now()); | 778 registration_->set_last_update_check(base::Time::Now()); |
765 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 779 SimulateDispatchEvent(); |
766 std::string()); | |
767 base::RunLoop().RunUntilIdle(); | |
768 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
769 EXPECT_TRUE(version_->stale_time_.is_null()); | 780 EXPECT_TRUE(version_->stale_time_.is_null()); |
770 | 781 |
771 // Simulate it running for a day. It will be marked stale. | 782 // Simulate it running for a day. It will be marked stale. |
772 registration_->set_last_update_check(GetYesterday()); | 783 registration_->set_last_update_check(GetYesterday()); |
773 version_->OnTimeoutTimer(); | 784 version_->OnTimeoutTimer(); |
774 EXPECT_FALSE(version_->stale_time_.is_null()); | 785 EXPECT_FALSE(version_->stale_time_.is_null()); |
775 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 786 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
776 | 787 |
777 // Simulate it running for past the wait threshold. The update will be | 788 // Simulate it running for past the wait threshold. The update will be |
778 // scheduled. | 789 // scheduled. |
(...skipping 12 matching lines...) Expand all Loading... |
791 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 802 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
792 registration_->SetActiveVersion(version_); | 803 registration_->SetActiveVersion(version_); |
793 registration_->set_last_update_check(GetYesterday()); | 804 registration_->set_last_update_check(GetYesterday()); |
794 base::TimeTicks stale_time = | 805 base::TimeTicks stale_time = |
795 base::TimeTicks::Now() - | 806 base::TimeTicks::Now() - |
796 base::TimeDelta::FromMinutes( | 807 base::TimeDelta::FromMinutes( |
797 ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); | 808 ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); |
798 version_->stale_time_ = stale_time; | 809 version_->stale_time_ = stale_time; |
799 | 810 |
800 // Stale time is not deferred. | 811 // Stale time is not deferred. |
801 version_->DispatchPushEvent( | 812 version_->RunAfterStartWorker( |
802 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); | 813 base::Bind(&base::DoNothing), |
803 version_->DispatchPushEvent( | 814 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
804 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); | 815 version_->RunAfterStartWorker( |
| 816 base::Bind(&base::DoNothing), |
| 817 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 818 base::RunLoop().RunUntilIdle(); |
805 EXPECT_EQ(stale_time, version_->stale_time_); | 819 EXPECT_EQ(stale_time, version_->stale_time_); |
806 | 820 |
807 // Timeout triggers the update. | 821 // Timeout triggers the update. |
808 version_->OnTimeoutTimer(); | 822 version_->OnTimeoutTimer(); |
809 EXPECT_TRUE(version_->stale_time_.is_null()); | 823 EXPECT_TRUE(version_->stale_time_.is_null()); |
810 EXPECT_TRUE(version_->update_timer_.IsRunning()); | 824 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
811 | 825 |
812 // Update timer is not deferred. | 826 // Update timer is not deferred. |
813 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); | 827 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); |
814 version_->DispatchPushEvent( | 828 SimulateDispatchEvent(); |
815 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); | 829 SimulateDispatchEvent(); |
816 version_->DispatchPushEvent( | 830 SimulateDispatchEvent(); |
817 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); | |
818 version_->DispatchPushEvent( | |
819 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); | |
820 base::RunLoop().RunUntilIdle(); | 831 base::RunLoop().RunUntilIdle(); |
821 EXPECT_TRUE(version_->stale_time_.is_null()); | 832 EXPECT_TRUE(version_->stale_time_.is_null()); |
822 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); | 833 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); |
823 } | 834 } |
824 | 835 |
825 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) { | 836 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) { |
826 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 837 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
827 | 838 |
828 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 839 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
829 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), | 840 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 | 1349 |
1339 // Verify correct response was received. | 1350 // Verify correct response was received. |
1340 EXPECT_EQ(request_id1, received_request_id1); | 1351 EXPECT_EQ(request_id1, received_request_id1); |
1341 EXPECT_EQ(request_id2, received_request_id2); | 1352 EXPECT_EQ(request_id2, received_request_id2); |
1342 EXPECT_EQ(reply1, received_data1); | 1353 EXPECT_EQ(reply1, received_data1); |
1343 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 1354 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
1344 EXPECT_TRUE(version_->FinishRequest(request_id1)); | 1355 EXPECT_TRUE(version_->FinishRequest(request_id1)); |
1345 } | 1356 } |
1346 | 1357 |
1347 } // namespace content | 1358 } // namespace content |
OLD | NEW |