| 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" |
| 11 #include "content/browser/service_worker/service_worker_registration.h" | 11 #include "content/browser/service_worker/service_worker_registration.h" |
| 12 #include "content/browser/service_worker/service_worker_test_utils.h" | 12 #include "content/browser/service_worker/service_worker_test_utils.h" |
| 13 #include "content/browser/service_worker/service_worker_version.h" | 13 #include "content/browser/service_worker/service_worker_version.h" |
| 14 #include "content/common/background_sync_service.mojom.h" | 14 #include "content/common/background_sync_service.mojom.h" |
| 15 #include "content/common/service_worker/service_worker_utils.h" | 15 #include "content/common/service_worker/service_worker_utils.h" |
| 16 #include "content/public/test/mock_render_process_host.h" | 16 #include "content/public/test/mock_render_process_host.h" |
| 17 #include "content/public/test/test_browser_thread_bundle.h" | 17 #include "content/public/test/test_browser_thread_bundle.h" |
| 18 #include "content/public/test/test_mojo_service.mojom.h" |
| 19 #include "content/public/test/test_utils.h" |
| 18 #include "mojo/public/cpp/bindings/strong_binding.h" | 20 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 20 | 22 |
| 21 // IPC messages for testing --------------------------------------------------- | 23 // IPC messages for testing --------------------------------------------------- |
| 22 | 24 |
| 23 #define IPC_MESSAGE_IMPL | 25 #define IPC_MESSAGE_IMPL |
| 24 #include "ipc/ipc_message_macros.h" | 26 #include "ipc/ipc_message_macros.h" |
| 25 | 27 |
| 26 #define IPC_MESSAGE_START TestMsgStart | 28 #define IPC_MESSAGE_START TestMsgStart |
| 27 | 29 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 TransferredMessagePort dummy_port; | 159 TransferredMessagePort dummy_port; |
| 158 dummy_port.id = port_id; | 160 dummy_port.id = port_id; |
| 159 ports->push_back(dummy_port); | 161 ports->push_back(dummy_port); |
| 160 } | 162 } |
| 161 | 163 |
| 162 base::Time GetYesterday() { | 164 base::Time GetYesterday() { |
| 163 return base::Time::Now() - base::TimeDelta::FromDays(1) - | 165 return base::Time::Now() - base::TimeDelta::FromDays(1) - |
| 164 base::TimeDelta::FromSeconds(1); | 166 base::TimeDelta::FromSeconds(1); |
| 165 } | 167 } |
| 166 | 168 |
| 169 class TestMojoServiceImpl : public TestMojoService { |
| 170 public: |
| 171 static void Create(mojo::InterfaceRequest<TestMojoService> request) { |
| 172 new TestMojoServiceImpl(std::move(request)); |
| 173 } |
| 174 |
| 175 void DoSomething(const DoSomethingCallback& callback) override { |
| 176 callback.Run(); |
| 177 } |
| 178 |
| 179 void GetRequestorURL(const GetRequestorURLCallback& callback) override { |
| 180 callback.Run(mojo::String("")); |
| 181 } |
| 182 |
| 183 private: |
| 184 explicit TestMojoServiceImpl(mojo::InterfaceRequest<TestMojoService> request) |
| 185 : binding_(this, std::move(request)) {} |
| 186 |
| 187 mojo::StrongBinding<TestMojoService> binding_; |
| 188 }; |
| 189 |
| 167 } // namespace | 190 } // namespace |
| 168 | 191 |
| 169 class ServiceWorkerVersionTest : public testing::Test { | 192 class ServiceWorkerVersionTest : public testing::Test { |
| 170 protected: | 193 protected: |
| 171 struct RunningStateListener : public ServiceWorkerVersion::Listener { | 194 struct RunningStateListener : public ServiceWorkerVersion::Listener { |
| 172 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} | 195 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} |
| 173 ~RunningStateListener() override {} | 196 ~RunningStateListener() override {} |
| 174 void OnRunningStateChanged(ServiceWorkerVersion* version) override { | 197 void OnRunningStateChanged(ServiceWorkerVersion* version) override { |
| 175 last_status = version->running_status(); | 198 last_status = version->running_status(); |
| 176 } | 199 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {} | 344 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {} |
| 322 | 345 |
| 323 scoped_ptr<MessageReceiver> GetMessageReceiver() override { | 346 scoped_ptr<MessageReceiver> GetMessageReceiver() override { |
| 324 return make_scoped_ptr(new MessageReceiverDisallowFetch()); | 347 return make_scoped_ptr(new MessageReceiverDisallowFetch()); |
| 325 } | 348 } |
| 326 | 349 |
| 327 private: | 350 private: |
| 328 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); | 351 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); |
| 329 }; | 352 }; |
| 330 | 353 |
| 354 class MessageReceiverMojoTestService : public MessageReceiver { |
| 355 public: |
| 356 MessageReceiverMojoTestService() : MessageReceiver() {} |
| 357 ~MessageReceiverMojoTestService() override {} |
| 358 |
| 359 void OnSetupMojo(ServiceRegistry* service_registry) override { |
| 360 service_registry->AddService(base::Bind(&TestMojoServiceImpl::Create)); |
| 361 } |
| 362 |
| 363 private: |
| 364 DISALLOW_COPY_AND_ASSIGN(MessageReceiverMojoTestService); |
| 365 }; |
| 366 |
| 367 class ServiceWorkerVersionWithMojoTest : public ServiceWorkerVersionTest { |
| 368 protected: |
| 369 ServiceWorkerVersionWithMojoTest() : ServiceWorkerVersionTest() {} |
| 370 |
| 371 scoped_ptr<MessageReceiver> GetMessageReceiver() override { |
| 372 return make_scoped_ptr(new MessageReceiverMojoTestService()); |
| 373 } |
| 374 |
| 375 private: |
| 376 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionWithMojoTest); |
| 377 }; |
| 378 |
| 331 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { | 379 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
| 332 // Call StartWorker() multiple times. | 380 // Call StartWorker() multiple times. |
| 333 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | 381 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
| 334 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | 382 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
| 335 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; | 383 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; |
| 336 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); | 384 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); |
| 337 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); | 385 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); |
| 338 | 386 |
| 339 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 387 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 340 base::RunLoop().RunUntilIdle(); | 388 base::RunLoop().RunUntilIdle(); |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 version_->idle_time_ -= kOneSecond; | 642 version_->idle_time_ -= kOneSecond; |
| 595 idle_time = version_->idle_time_; | 643 idle_time = version_->idle_time_; |
| 596 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), | 644 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), |
| 597 base::Bind(&base::DoNothing), | 645 base::Bind(&base::DoNothing), |
| 598 base::Bind(&ReceiveFetchResult, &status)); | 646 base::Bind(&ReceiveFetchResult, &status)); |
| 599 base::RunLoop().RunUntilIdle(); | 647 base::RunLoop().RunUntilIdle(); |
| 600 | 648 |
| 601 EXPECT_EQ(SERVICE_WORKER_OK, status); | 649 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 602 EXPECT_LT(idle_time, version_->idle_time_); | 650 EXPECT_LT(idle_time, version_->idle_time_); |
| 603 | 651 |
| 652 // Starting and finishing a request resets the idle time. |
| 653 version_->idle_time_ -= kOneSecond; |
| 654 idle_time = version_->idle_time_; |
| 655 int request_id = |
| 656 version_->StartRequest(CreateReceiverOnCurrentThread(&status)); |
| 657 EXPECT_TRUE(version_->FinishRequest(request_id)); |
| 658 |
| 659 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 660 EXPECT_LT(idle_time, version_->idle_time_); |
| 661 |
| 604 // Dispatching a message event resets the idle time. | 662 // Dispatching a message event resets the idle time. |
| 605 std::vector<TransferredMessagePort> ports; | 663 std::vector<TransferredMessagePort> ports; |
| 606 SetUpDummyMessagePort(&ports); | 664 SetUpDummyMessagePort(&ports); |
| 607 status = SERVICE_WORKER_ERROR_FAILED; | 665 status = SERVICE_WORKER_ERROR_FAILED; |
| 608 version_->idle_time_ -= kOneSecond; | 666 version_->idle_time_ -= kOneSecond; |
| 609 idle_time = version_->idle_time_; | 667 idle_time = version_->idle_time_; |
| 610 version_->DispatchMessageEvent(base::string16(), ports, | 668 version_->DispatchMessageEvent(base::string16(), ports, |
| 611 CreateReceiverOnCurrentThread(&status)); | 669 CreateReceiverOnCurrentThread(&status)); |
| 612 base::RunLoop().RunUntilIdle(); | 670 base::RunLoop().RunUntilIdle(); |
| 613 MessagePortService::GetInstance()->Destroy(ports[0].id); | 671 MessagePortService::GetInstance()->Destroy(ports[0].id); |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 // Verify that the fetch times out later. | 914 // Verify that the fetch times out later. |
| 857 version_->SetAllRequestExpirations(base::TimeTicks::Now()); | 915 version_->SetAllRequestExpirations(base::TimeTicks::Now()); |
| 858 version_->timeout_timer_.user_task().Run(); | 916 version_->timeout_timer_.user_task().Run(); |
| 859 base::RunLoop().RunUntilIdle(); | 917 base::RunLoop().RunUntilIdle(); |
| 860 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, fetch_status); | 918 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, fetch_status); |
| 861 | 919 |
| 862 // Other timeouts do stop the service worker. | 920 // Other timeouts do stop the service worker. |
| 863 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 921 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 864 } | 922 } |
| 865 | 923 |
| 924 TEST_F(ServiceWorkerVersionTest, RequestTimeout) { |
| 925 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 926 |
| 927 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 928 version_->StartWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 929 base::RunLoop().RunUntilIdle(); |
| 930 int request_id = |
| 931 version_->StartRequest(CreateReceiverOnCurrentThread(&status)); |
| 932 base::RunLoop().RunUntilIdle(); |
| 933 |
| 934 // Callback has not completed yet. |
| 935 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); |
| 936 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 937 |
| 938 // Simulate timeout. |
| 939 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 940 version_->SetAllRequestExpirations( |
| 941 base::TimeTicks::Now() - |
| 942 base::TimeDelta::FromMinutes( |
| 943 ServiceWorkerVersion::kRequestTimeoutMinutes + 1)); |
| 944 version_->timeout_timer_.user_task().Run(); |
| 945 base::RunLoop().RunUntilIdle(); |
| 946 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
| 947 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 948 |
| 949 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 950 } |
| 951 |
| 866 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { | 952 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { |
| 867 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 953 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 868 version_->StartWorker( | 954 version_->StartWorker( |
| 869 CreateReceiverOnCurrentThread(&status)); | 955 CreateReceiverOnCurrentThread(&status)); |
| 870 base::RunLoop().RunUntilIdle(); | 956 base::RunLoop().RunUntilIdle(); |
| 871 | 957 |
| 872 // Callback has not completed yet. | 958 // Callback has not completed yet. |
| 873 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); | 959 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); |
| 874 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 960 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 875 | 961 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 // Valid URL 2. | 1117 // Valid URL 2. |
| 1032 GURL valid_scope_2("http://www.example.com/test/subscope"); | 1118 GURL valid_scope_2("http://www.example.com/test/subscope"); |
| 1033 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_2)); | 1119 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_2)); |
| 1034 base::RunLoop().RunUntilIdle(); | 1120 base::RunLoop().RunUntilIdle(); |
| 1035 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); | 1121 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); |
| 1036 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); | 1122 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); |
| 1037 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); | 1123 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); |
| 1038 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); | 1124 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); |
| 1039 } | 1125 } |
| 1040 | 1126 |
| 1127 TEST_F(ServiceWorkerVersionTest, RendererCrashDuringEvent) { |
| 1128 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1129 |
| 1130 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1131 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1132 base::RunLoop().RunUntilIdle(); |
| 1133 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1134 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1135 |
| 1136 int request_id = |
| 1137 version_->StartRequest(CreateReceiverOnCurrentThread(&status)); |
| 1138 base::RunLoop().RunUntilIdle(); |
| 1139 |
| 1140 // Callback has not completed yet. |
| 1141 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1142 |
| 1143 // Simulate renderer crash: do what |
| 1144 // ServiceWorkerDispatcherHost::OnFilterRemoved does. |
| 1145 int process_id = helper_->mock_render_process_id(); |
| 1146 helper_->context()->RemoveAllProviderHostsForProcess(process_id); |
| 1147 helper_->context()->embedded_worker_registry()->RemoveChildProcessSender( |
| 1148 process_id); |
| 1149 base::RunLoop().RunUntilIdle(); |
| 1150 |
| 1151 // Callback completed. |
| 1152 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1153 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 1154 |
| 1155 // Request already failed, calling finsh should return false. |
| 1156 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 1157 } |
| 1158 |
| 1159 TEST_F(ServiceWorkerVersionWithMojoTest, MojoService) { |
| 1160 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1161 |
| 1162 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1163 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1164 base::RunLoop().RunUntilIdle(); |
| 1165 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1166 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1167 |
| 1168 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 1169 int request_id = version_->StartRequest( |
| 1170 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 1171 base::WeakPtr<TestMojoService> service = |
| 1172 version_->GetMojoServiceForRequest<TestMojoService>(request_id); |
| 1173 service->DoSomething(runner->QuitClosure()); |
| 1174 runner->Run(); |
| 1175 |
| 1176 // Mojo service does exist in worker, so error callback should not have been |
| 1177 // called and FinishRequest should return true. |
| 1178 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1179 EXPECT_TRUE(version_->FinishRequest(request_id)); |
| 1180 } |
| 1181 |
| 1182 TEST_F(ServiceWorkerVersionTest, NonExistentMojoService) { |
| 1183 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1184 |
| 1185 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1186 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1187 base::RunLoop().RunUntilIdle(); |
| 1188 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1189 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1190 |
| 1191 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 1192 int request_id = version_->StartRequest( |
| 1193 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 1194 base::WeakPtr<TestMojoService> service = |
| 1195 version_->GetMojoServiceForRequest<TestMojoService>(request_id); |
| 1196 service->DoSomething(runner->QuitClosure()); |
| 1197 runner->Run(); |
| 1198 |
| 1199 // Mojo service doesn't exist in worker, so error callback should have been |
| 1200 // called and FinishRequest should return false. |
| 1201 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1202 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 1203 } |
| 1204 |
| 1041 } // namespace content | 1205 } // namespace content |
| OLD | NEW |