Chromium Code Reviews| 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 "content/browser/service_worker/service_worker_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <tuple> | 8 #include <tuple> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 13 #include "base/test/histogram_tester.h" | 13 #include "base/test/histogram_tester.h" |
| 14 #include "base/test/simple_test_tick_clock.h" | |
| 14 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 15 #include "content/browser/service_worker/embedded_worker_registry.h" | 16 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 16 #include "content/browser/service_worker/embedded_worker_status.h" | 17 #include "content/browser/service_worker/embedded_worker_status.h" |
| 17 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 18 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
| 18 #include "content/browser/service_worker/service_worker_context_core.h" | 19 #include "content/browser/service_worker/service_worker_context_core.h" |
| 19 #include "content/browser/service_worker/service_worker_registration.h" | 20 #include "content/browser/service_worker/service_worker_registration.h" |
| 20 #include "content/browser/service_worker/service_worker_test_utils.h" | 21 #include "content/browser/service_worker/service_worker_test_utils.h" |
| 21 #include "content/common/service_worker/service_worker_utils.h" | 22 #include "content/common/service_worker/service_worker_utils.h" |
| 22 #include "content/public/test/mock_render_process_host.h" | 23 #include "content/public/test/mock_render_process_host.h" |
| 23 #include "content/public/test/test_browser_thread_bundle.h" | 24 #include "content/public/test/test_browser_thread_bundle.h" |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 event_type, CreateReceiverOnCurrentThread(&status)); | 275 event_type, CreateReceiverOnCurrentThread(&status)); |
| 275 base::RunLoop().RunUntilIdle(); | 276 base::RunLoop().RunUntilIdle(); |
| 276 | 277 |
| 277 // And finish request, as if a response to the event was received. | 278 // And finish request, as if a response to the event was received. |
| 278 EXPECT_TRUE(version_->FinishRequest(request_id, true /* was_handled */, | 279 EXPECT_TRUE(version_->FinishRequest(request_id, true /* was_handled */, |
| 279 base::Time::Now())); | 280 base::Time::Now())); |
| 280 base::RunLoop().RunUntilIdle(); | 281 base::RunLoop().RunUntilIdle(); |
| 281 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); | 282 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
| 282 } | 283 } |
| 283 | 284 |
| 285 base::SimpleTestTickClock* SetTickClockForTesting() { | |
| 286 base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock(); | |
| 287 version_->SetTickClockForTesting(base::WrapUnique(tick_clock)); | |
| 288 return tick_clock; | |
| 289 } | |
| 290 | |
| 284 TestBrowserThreadBundle thread_bundle_; | 291 TestBrowserThreadBundle thread_bundle_; |
| 285 std::unique_ptr<MessageReceiver> helper_; | 292 std::unique_ptr<MessageReceiver> helper_; |
| 286 scoped_refptr<ServiceWorkerRegistration> registration_; | 293 scoped_refptr<ServiceWorkerRegistration> registration_; |
| 287 scoped_refptr<ServiceWorkerVersion> version_; | 294 scoped_refptr<ServiceWorkerVersion> version_; |
| 288 GURL pattern_; | 295 GURL pattern_; |
| 289 | 296 |
| 290 private: | 297 private: |
| 291 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); | 298 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); |
| 292 }; | 299 }; |
| 293 | 300 |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 868 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 875 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 869 version_->SetAllRequestExpirations(base::TimeTicks::Now()); | 876 version_->SetAllRequestExpirations(base::TimeTicks::Now()); |
| 870 version_->timeout_timer_.user_task().Run(); | 877 version_->timeout_timer_.user_task().Run(); |
| 871 base::RunLoop().RunUntilIdle(); | 878 base::RunLoop().RunUntilIdle(); |
| 872 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 879 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
| 873 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 880 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| 874 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 881 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
| 875 base::Time::Now())); | 882 base::Time::Now())); |
| 876 } | 883 } |
| 877 | 884 |
| 878 TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeout) { | 885 TEST_P(ServiceWorkerVersionTestP, RequestNowTimeout) { |
| 879 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 886 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 880 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 887 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 881 | 888 |
| 882 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | 889 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
| 883 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 890 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 884 base::RunLoop().RunUntilIdle(); | 891 base::RunLoop().RunUntilIdle(); |
| 885 | 892 |
| 886 // Create a request that should expire Now(). | 893 // Create a request that should expire Now(). |
| 887 int request_id = version_->StartRequestWithCustomTimeout( | 894 int request_id = version_->StartRequestWithCustomTimeout( |
| 888 ServiceWorkerMetrics::EventType::SYNC, | 895 ServiceWorkerMetrics::EventType::SYNC, |
| 889 CreateReceiverOnCurrentThread(&status), base::TimeDelta(), | 896 CreateReceiverOnCurrentThread(&status), base::TimeDelta(), |
| 890 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); | 897 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); |
| 891 | 898 |
| 892 base::RunLoop().RunUntilIdle(); | 899 base::RunLoop().RunUntilIdle(); |
| 893 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 900 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 894 version_->timeout_timer_.user_task().Run(); | 901 version_->timeout_timer_.user_task().Run(); |
| 895 base::RunLoop().RunUntilIdle(); | 902 base::RunLoop().RunUntilIdle(); |
| 896 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 903 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
| 897 | 904 |
| 898 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 905 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
| 899 base::Time::Now())); | 906 base::Time::Now())); |
| 900 | 907 |
| 901 // CONTINUE_ON_TIMEOUT timeouts don't stop the service worker. | 908 // CONTINUE_ON_TIMEOUT timeouts don't stop the service worker. |
| 902 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 909 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
| 903 } | 910 } |
| 904 | 911 |
| 905 TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeoutKill) { | 912 TEST_P(ServiceWorkerVersionTestP, RequestNowTimeoutKill) { |
| 906 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 913 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 907 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 914 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 908 | 915 |
| 909 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | 916 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
| 910 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 917 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 911 base::RunLoop().RunUntilIdle(); | 918 base::RunLoop().RunUntilIdle(); |
| 912 | 919 |
| 913 // Create a request that should expire Now(). | 920 // Create a request that should expire Now(). |
| 914 int request_id = version_->StartRequestWithCustomTimeout( | 921 int request_id = version_->StartRequestWithCustomTimeout( |
| 915 ServiceWorkerMetrics::EventType::SYNC, | 922 ServiceWorkerMetrics::EventType::SYNC, |
| 916 CreateReceiverOnCurrentThread(&status), base::TimeDelta(), | 923 CreateReceiverOnCurrentThread(&status), base::TimeDelta(), |
| 917 ServiceWorkerVersion::KILL_ON_TIMEOUT); | 924 ServiceWorkerVersion::KILL_ON_TIMEOUT); |
| 918 | 925 |
| 919 base::RunLoop().RunUntilIdle(); | 926 base::RunLoop().RunUntilIdle(); |
| 920 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 927 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 921 version_->timeout_timer_.user_task().Run(); | 928 version_->timeout_timer_.user_task().Run(); |
| 922 base::RunLoop().RunUntilIdle(); | 929 base::RunLoop().RunUntilIdle(); |
| 923 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 930 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
| 924 | 931 |
| 925 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 932 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
| 926 base::Time::Now())); | 933 base::Time::Now())); |
| 927 | 934 |
| 928 // KILL_ON_TIMEOUT timeouts should stop the service worker. | 935 // KILL_ON_TIMEOUT timeouts should stop the service worker. |
| 929 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 936 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| 930 } | 937 } |
| 931 | 938 |
| 939 TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeout) { | |
| 940 ServiceWorkerStatusCode first_status = | |
| 941 SERVICE_WORKER_ERROR_NETWORK; // dummy value | |
|
Marijn Kruisselbrink
2016/12/02 00:15:52
nit: new code generally uses SERVICE_WORKER_ERROR_
harkness
2016/12/02 10:15:33
Done.
| |
| 942 ServiceWorkerStatusCode second_status = | |
| 943 SERVICE_WORKER_ERROR_NETWORK; // dummy value | |
| 944 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
| 945 | |
| 946 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | |
| 947 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | |
| 948 base::RunLoop().RunUntilIdle(); | |
| 949 | |
| 950 base::SimpleTestTickClock* tick_clock = SetTickClockForTesting(); | |
| 951 | |
| 952 // Create two requests. One which times out in 10 seconds, one in 20 seconds. | |
| 953 int timeout_seconds = 10; | |
| 954 int first_request_id = version_->StartRequestWithCustomTimeout( | |
| 955 ServiceWorkerMetrics::EventType::SYNC, | |
| 956 CreateReceiverOnCurrentThread(&first_status), | |
| 957 base::TimeDelta::FromSeconds(2 * timeout_seconds), | |
| 958 ServiceWorkerVersion::KILL_ON_TIMEOUT); | |
| 959 | |
| 960 int second_request_id = version_->StartRequestWithCustomTimeout( | |
| 961 ServiceWorkerMetrics::EventType::SYNC, | |
| 962 CreateReceiverOnCurrentThread(&second_status), | |
| 963 base::TimeDelta::FromSeconds(timeout_seconds), | |
| 964 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); | |
| 965 | |
| 966 // The status should not have changed since neither task has timed out yet. | |
| 967 base::RunLoop().RunUntilIdle(); | |
| 968 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | |
| 969 version_->timeout_timer_.user_task().Run(); | |
| 970 base::RunLoop().RunUntilIdle(); | |
| 971 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, first_status); | |
| 972 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, second_status); | |
| 973 | |
| 974 // Now advance time until the second task timeout should expire. | |
| 975 tick_clock->Advance(base::TimeDelta::FromSeconds(timeout_seconds + 1)); | |
| 976 version_->timeout_timer_.user_task().Run(); | |
| 977 base::RunLoop().RunUntilIdle(); | |
| 978 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, first_status); | |
| 979 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, second_status); | |
| 980 | |
| 981 // CONTINUE_ON_TIMEOUT timeouts don't stop the service worker. | |
| 982 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | |
| 983 | |
| 984 // Now advance time until both tasks should be expired. | |
| 985 tick_clock->Advance(base::TimeDelta::FromSeconds(timeout_seconds + 1)); | |
| 986 version_->timeout_timer_.user_task().Run(); | |
| 987 base::RunLoop().RunUntilIdle(); | |
| 988 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, first_status); | |
| 989 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, second_status); | |
| 990 | |
| 991 EXPECT_FALSE(version_->FinishRequest(first_request_id, true /* was_handled */, | |
| 992 base::Time::Now())); | |
| 993 | |
| 994 EXPECT_FALSE(version_->FinishRequest( | |
| 995 second_request_id, true /* was_handled */, base::Time::Now())); | |
| 996 | |
| 997 // KILL_ON_TIMEOUT timeouts should stop the service worker. | |
| 998 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | |
| 999 } | |
| 1000 | |
| 932 TEST_P(ServiceWorkerVersionTestP, MixedRequestTimeouts) { | 1001 TEST_P(ServiceWorkerVersionTestP, MixedRequestTimeouts) { |
| 933 ServiceWorkerStatusCode sync_status = | 1002 ServiceWorkerStatusCode sync_status = |
| 934 SERVICE_WORKER_ERROR_NETWORK; // dummy value | 1003 SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 935 ServiceWorkerStatusCode fetch_status = | 1004 ServiceWorkerStatusCode fetch_status = |
| 936 SERVICE_WORKER_ERROR_NETWORK; // dummy value | 1005 SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 937 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 1006 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 938 | 1007 |
| 939 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | 1008 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, |
| 940 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1009 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 941 base::RunLoop().RunUntilIdle(); | 1010 base::RunLoop().RunUntilIdle(); |
| (...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1785 ServiceWorkerNavigationHintUMATest, | 1854 ServiceWorkerNavigationHintUMATest, |
| 1786 testing::Bool()); | 1855 testing::Bool()); |
| 1787 INSTANTIATE_TEST_CASE_P(ServiceWorkerStallInStoppingTest, | 1856 INSTANTIATE_TEST_CASE_P(ServiceWorkerStallInStoppingTest, |
| 1788 ServiceWorkerStallInStoppingTest, | 1857 ServiceWorkerStallInStoppingTest, |
| 1789 testing::Bool()); | 1858 testing::Bool()); |
| 1790 INSTANTIATE_TEST_CASE_P(ServiceWorkerVersionWithMojoTest, | 1859 INSTANTIATE_TEST_CASE_P(ServiceWorkerVersionWithMojoTest, |
| 1791 ServiceWorkerVersionWithMojoTest, | 1860 ServiceWorkerVersionWithMojoTest, |
| 1792 testing::Bool()); | 1861 testing::Bool()); |
| 1793 | 1862 |
| 1794 } // namespace content | 1863 } // namespace content |
| OLD | NEW |