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

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

Issue 2504663002: Added a local tick clock to ServiceWorkerVersion. (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 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698