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

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

Issue 1264333002: First step to refactor ServiceWorkerVersion to make event dispatching more modular. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years 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 "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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698