| 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" |
| 11 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 11 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
| 12 #include "content/browser/service_worker/service_worker_context_core.h" | 12 #include "content/browser/service_worker/service_worker_context_core.h" |
| 13 #include "content/browser/service_worker/service_worker_registration.h" | 13 #include "content/browser/service_worker/service_worker_registration.h" |
| 14 #include "content/browser/service_worker/service_worker_test_utils.h" | 14 #include "content/browser/service_worker/service_worker_test_utils.h" |
| 15 #include "content/browser/service_worker/service_worker_version.h" | 15 #include "content/browser/service_worker/service_worker_version.h" |
| 16 #include "content/common/background_sync_service.mojom.h" | 16 #include "content/common/background_sync_service.mojom.h" |
| 17 #include "content/common/service_worker/service_worker_utils.h" | 17 #include "content/common/service_worker/service_worker_utils.h" |
| 18 #include "content/public/test/mock_render_process_host.h" | 18 #include "content/public/test/mock_render_process_host.h" |
| 19 #include "content/public/test/test_browser_thread_bundle.h" | 19 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "content/public/test/test_mojo_service.mojom.h" |
| 21 #include "content/public/test/test_utils.h" |
| 20 #include "mojo/public/cpp/bindings/strong_binding.h" | 22 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 24 |
| 23 // IPC messages for testing --------------------------------------------------- | 25 // IPC messages for testing --------------------------------------------------- |
| 24 | 26 |
| 25 #define IPC_MESSAGE_IMPL | 27 #define IPC_MESSAGE_IMPL |
| 26 #include "ipc/ipc_message_macros.h" | 28 #include "ipc/ipc_message_macros.h" |
| 27 | 29 |
| 28 #define IPC_MESSAGE_START TestMsgStart | 30 #define IPC_MESSAGE_START TestMsgStart |
| 29 | 31 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 TransferredMessagePort dummy_port; | 171 TransferredMessagePort dummy_port; |
| 170 dummy_port.id = port_id; | 172 dummy_port.id = port_id; |
| 171 ports->push_back(dummy_port); | 173 ports->push_back(dummy_port); |
| 172 } | 174 } |
| 173 | 175 |
| 174 base::Time GetYesterday() { | 176 base::Time GetYesterday() { |
| 175 return base::Time::Now() - base::TimeDelta::FromDays(1) - | 177 return base::Time::Now() - base::TimeDelta::FromDays(1) - |
| 176 base::TimeDelta::FromSeconds(1); | 178 base::TimeDelta::FromSeconds(1); |
| 177 } | 179 } |
| 178 | 180 |
| 181 class TestMojoServiceImpl : public TestMojoService { |
| 182 public: |
| 183 static void Create(mojo::InterfaceRequest<TestMojoService> request) { |
| 184 new TestMojoServiceImpl(std::move(request)); |
| 185 } |
| 186 |
| 187 void DoSomething(const DoSomethingCallback& callback) override { |
| 188 callback.Run(); |
| 189 } |
| 190 |
| 191 void GetRequestorURL(const GetRequestorURLCallback& callback) override { |
| 192 callback.Run(mojo::String("")); |
| 193 } |
| 194 |
| 195 private: |
| 196 explicit TestMojoServiceImpl(mojo::InterfaceRequest<TestMojoService> request) |
| 197 : binding_(this, std::move(request)) {} |
| 198 |
| 199 mojo::StrongBinding<TestMojoService> binding_; |
| 200 }; |
| 201 |
| 179 } // namespace | 202 } // namespace |
| 180 | 203 |
| 181 class ServiceWorkerVersionTest : public testing::Test { | 204 class ServiceWorkerVersionTest : public testing::Test { |
| 182 protected: | 205 protected: |
| 183 struct RunningStateListener : public ServiceWorkerVersion::Listener { | 206 struct RunningStateListener : public ServiceWorkerVersion::Listener { |
| 184 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} | 207 RunningStateListener() : last_status(ServiceWorkerVersion::STOPPED) {} |
| 185 ~RunningStateListener() override {} | 208 ~RunningStateListener() override {} |
| 186 void OnRunningStateChanged(ServiceWorkerVersion* version) override { | 209 void OnRunningStateChanged(ServiceWorkerVersion* version) override { |
| 187 last_status = version->running_status(); | 210 last_status = version->running_status(); |
| 188 } | 211 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {} | 356 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {} |
| 334 | 357 |
| 335 scoped_ptr<MessageReceiver> GetMessageReceiver() override { | 358 scoped_ptr<MessageReceiver> GetMessageReceiver() override { |
| 336 return make_scoped_ptr(new MessageReceiverDisallowFetch()); | 359 return make_scoped_ptr(new MessageReceiverDisallowFetch()); |
| 337 } | 360 } |
| 338 | 361 |
| 339 private: | 362 private: |
| 340 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); | 363 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); |
| 341 }; | 364 }; |
| 342 | 365 |
| 366 class MessageReceiverMojoTestService : public MessageReceiver { |
| 367 public: |
| 368 MessageReceiverMojoTestService() : MessageReceiver() {} |
| 369 ~MessageReceiverMojoTestService() override {} |
| 370 |
| 371 void OnSetupMojo(ServiceRegistry* service_registry) override { |
| 372 service_registry->AddService(base::Bind(&TestMojoServiceImpl::Create)); |
| 373 } |
| 374 |
| 375 private: |
| 376 DISALLOW_COPY_AND_ASSIGN(MessageReceiverMojoTestService); |
| 377 }; |
| 378 |
| 379 class ServiceWorkerVersionWithMojoTest : public ServiceWorkerVersionTest { |
| 380 protected: |
| 381 ServiceWorkerVersionWithMojoTest() : ServiceWorkerVersionTest() {} |
| 382 |
| 383 scoped_ptr<MessageReceiver> GetMessageReceiver() override { |
| 384 return make_scoped_ptr(new MessageReceiverMojoTestService()); |
| 385 } |
| 386 |
| 387 private: |
| 388 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionWithMojoTest); |
| 389 }; |
| 390 |
| 343 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { | 391 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
| 344 // Call StartWorker() multiple times. | 392 // Call StartWorker() multiple times. |
| 345 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | 393 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
| 346 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | 394 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
| 347 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; | 395 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; |
| 348 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); | 396 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); |
| 349 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); | 397 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); |
| 350 | 398 |
| 351 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 399 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 352 base::RunLoop().RunUntilIdle(); | 400 base::RunLoop().RunUntilIdle(); |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 version_->idle_time_ -= kOneSecond; | 654 version_->idle_time_ -= kOneSecond; |
| 607 idle_time = version_->idle_time_; | 655 idle_time = version_->idle_time_; |
| 608 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), | 656 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), |
| 609 base::Bind(&base::DoNothing), | 657 base::Bind(&base::DoNothing), |
| 610 base::Bind(&ReceiveFetchResult, &status)); | 658 base::Bind(&ReceiveFetchResult, &status)); |
| 611 base::RunLoop().RunUntilIdle(); | 659 base::RunLoop().RunUntilIdle(); |
| 612 | 660 |
| 613 EXPECT_EQ(SERVICE_WORKER_OK, status); | 661 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 614 EXPECT_LT(idle_time, version_->idle_time_); | 662 EXPECT_LT(idle_time, version_->idle_time_); |
| 615 | 663 |
| 664 // Starting and finishing a request resets the idle time. |
| 665 version_->idle_time_ -= kOneSecond; |
| 666 idle_time = version_->idle_time_; |
| 667 int request_id = |
| 668 version_->StartRequest(ServiceWorkerMetrics::EventType::SYNC, |
| 669 CreateReceiverOnCurrentThread(&status)); |
| 670 EXPECT_TRUE(version_->FinishRequest(request_id)); |
| 671 |
| 672 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 673 EXPECT_LT(idle_time, version_->idle_time_); |
| 674 |
| 616 // Dispatching a message event resets the idle time. | 675 // Dispatching a message event resets the idle time. |
| 617 std::vector<TransferredMessagePort> ports; | 676 std::vector<TransferredMessagePort> ports; |
| 618 SetUpDummyMessagePort(&ports); | 677 SetUpDummyMessagePort(&ports); |
| 619 status = SERVICE_WORKER_ERROR_FAILED; | 678 status = SERVICE_WORKER_ERROR_FAILED; |
| 620 version_->idle_time_ -= kOneSecond; | 679 version_->idle_time_ -= kOneSecond; |
| 621 idle_time = version_->idle_time_; | 680 idle_time = version_->idle_time_; |
| 622 version_->DispatchMessageEvent(base::string16(), ports, | 681 version_->DispatchMessageEvent(base::string16(), ports, |
| 623 CreateReceiverOnCurrentThread(&status)); | 682 CreateReceiverOnCurrentThread(&status)); |
| 624 base::RunLoop().RunUntilIdle(); | 683 base::RunLoop().RunUntilIdle(); |
| 625 MessagePortService::GetInstance()->Destroy(ports[0].id); | 684 MessagePortService::GetInstance()->Destroy(ports[0].id); |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 // Verify that the fetch times out later. | 932 // Verify that the fetch times out later. |
| 874 version_->SetAllRequestExpirations(base::TimeTicks::Now()); | 933 version_->SetAllRequestExpirations(base::TimeTicks::Now()); |
| 875 version_->timeout_timer_.user_task().Run(); | 934 version_->timeout_timer_.user_task().Run(); |
| 876 base::RunLoop().RunUntilIdle(); | 935 base::RunLoop().RunUntilIdle(); |
| 877 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, fetch_status); | 936 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, fetch_status); |
| 878 | 937 |
| 879 // Other timeouts do stop the service worker. | 938 // Other timeouts do stop the service worker. |
| 880 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 939 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 881 } | 940 } |
| 882 | 941 |
| 942 TEST_F(ServiceWorkerVersionTest, RequestTimeout) { |
| 943 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 944 |
| 945 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 946 version_->StartWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 947 base::RunLoop().RunUntilIdle(); |
| 948 int request_id = |
| 949 version_->StartRequest(ServiceWorkerMetrics::EventType::SYNC, |
| 950 CreateReceiverOnCurrentThread(&status)); |
| 951 base::RunLoop().RunUntilIdle(); |
| 952 |
| 953 // Callback has not completed yet. |
| 954 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); |
| 955 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 956 |
| 957 // Simulate timeout. |
| 958 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 959 version_->SetAllRequestExpirations( |
| 960 base::TimeTicks::Now() - |
| 961 base::TimeDelta::FromMinutes( |
| 962 ServiceWorkerVersion::kRequestTimeoutMinutes + 1)); |
| 963 version_->timeout_timer_.user_task().Run(); |
| 964 base::RunLoop().RunUntilIdle(); |
| 965 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
| 966 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 967 |
| 968 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 969 } |
| 970 |
| 883 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { | 971 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { |
| 884 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 972 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 885 version_->StartWorker( | 973 version_->StartWorker( |
| 886 CreateReceiverOnCurrentThread(&status)); | 974 CreateReceiverOnCurrentThread(&status)); |
| 887 base::RunLoop().RunUntilIdle(); | 975 base::RunLoop().RunUntilIdle(); |
| 888 | 976 |
| 889 // Callback has not completed yet. | 977 // Callback has not completed yet. |
| 890 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); | 978 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); |
| 891 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 979 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 892 | 980 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1048 // Valid URL 2. | 1136 // Valid URL 2. |
| 1049 GURL valid_scope_2("http://www.example.com/test/subscope"); | 1137 GURL valid_scope_2("http://www.example.com/test/subscope"); |
| 1050 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_2)); | 1138 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_2)); |
| 1051 base::RunLoop().RunUntilIdle(); | 1139 base::RunLoop().RunUntilIdle(); |
| 1052 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); | 1140 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); |
| 1053 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); | 1141 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); |
| 1054 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); | 1142 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); |
| 1055 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); | 1143 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); |
| 1056 } | 1144 } |
| 1057 | 1145 |
| 1146 TEST_F(ServiceWorkerVersionTest, RendererCrashDuringEvent) { |
| 1147 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1148 |
| 1149 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1150 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1151 base::RunLoop().RunUntilIdle(); |
| 1152 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1153 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1154 |
| 1155 int request_id = |
| 1156 version_->StartRequest(ServiceWorkerMetrics::EventType::SYNC, |
| 1157 CreateReceiverOnCurrentThread(&status)); |
| 1158 base::RunLoop().RunUntilIdle(); |
| 1159 |
| 1160 // Callback has not completed yet. |
| 1161 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1162 |
| 1163 // Simulate renderer crash: do what |
| 1164 // ServiceWorkerDispatcherHost::OnFilterRemoved does. |
| 1165 int process_id = helper_->mock_render_process_id(); |
| 1166 helper_->context()->RemoveAllProviderHostsForProcess(process_id); |
| 1167 helper_->context()->embedded_worker_registry()->RemoveChildProcessSender( |
| 1168 process_id); |
| 1169 base::RunLoop().RunUntilIdle(); |
| 1170 |
| 1171 // Callback completed. |
| 1172 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1173 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 1174 |
| 1175 // Request already failed, calling finsh should return false. |
| 1176 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 1177 } |
| 1178 |
| 1179 TEST_F(ServiceWorkerVersionWithMojoTest, MojoService) { |
| 1180 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1181 |
| 1182 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1183 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1184 base::RunLoop().RunUntilIdle(); |
| 1185 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1186 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1187 |
| 1188 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 1189 int request_id = version_->StartRequest( |
| 1190 ServiceWorkerMetrics::EventType::SYNC, |
| 1191 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 1192 base::WeakPtr<TestMojoService> service = |
| 1193 version_->GetMojoServiceForRequest<TestMojoService>(request_id); |
| 1194 service->DoSomething(runner->QuitClosure()); |
| 1195 runner->Run(); |
| 1196 |
| 1197 // Mojo service does exist in worker, so error callback should not have been |
| 1198 // called and FinishRequest should return true. |
| 1199 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1200 EXPECT_TRUE(version_->FinishRequest(request_id)); |
| 1201 } |
| 1202 |
| 1203 TEST_F(ServiceWorkerVersionTest, NonExistentMojoService) { |
| 1204 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1205 |
| 1206 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1207 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
| 1208 base::RunLoop().RunUntilIdle(); |
| 1209 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1210 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 1211 |
| 1212 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 1213 int request_id = version_->StartRequest( |
| 1214 ServiceWorkerMetrics::EventType::SYNC, |
| 1215 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 1216 base::WeakPtr<TestMojoService> service = |
| 1217 version_->GetMojoServiceForRequest<TestMojoService>(request_id); |
| 1218 service->DoSomething(runner->QuitClosure()); |
| 1219 runner->Run(); |
| 1220 |
| 1221 // Mojo service doesn't exist in worker, so error callback should have been |
| 1222 // called and FinishRequest should return false. |
| 1223 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1224 EXPECT_FALSE(version_->FinishRequest(request_id)); |
| 1225 } |
| 1226 |
| 1058 } // namespace content | 1227 } // namespace content |
| OLD | NEW |