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

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: rockot nits Created 4 years, 11 months 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 <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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | content/public/test/mock_render_process_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698