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

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

Issue 1027113002: Service Worker: Add a timeout for inflight requests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: event Created 5 years, 9 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/run_loop.h" 6 #include "base/run_loop.h"
7 #include "content/browser/service_worker/embedded_worker_registry.h" 7 #include "content/browser/service_worker/embedded_worker_registry.h"
8 #include "content/browser/service_worker/embedded_worker_test_helper.h" 8 #include "content/browser/service_worker/embedded_worker_test_helper.h"
9 #include "content/browser/service_worker/service_worker_context_core.h" 9 #include "content/browser/service_worker/service_worker_context_core.h"
10 #include "content/browser/service_worker/service_worker_registration.h" 10 #include "content/browser/service_worker/service_worker_registration.h"
11 #include "content/browser/service_worker/service_worker_test_utils.h" 11 #include "content/browser/service_worker/service_worker_test_utils.h"
12 #include "content/browser/service_worker/service_worker_utils.h"
12 #include "content/browser/service_worker/service_worker_version.h" 13 #include "content/browser/service_worker/service_worker_version.h"
13 #include "content/public/test/test_browser_thread_bundle.h" 14 #include "content/public/test/test_browser_thread_bundle.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 // IPC messages for testing --------------------------------------------------- 17 // IPC messages for testing ---------------------------------------------------
17 18
18 #define IPC_MESSAGE_IMPL 19 #define IPC_MESSAGE_IMPL
19 #include "ipc/ipc_message_macros.h" 20 #include "ipc/ipc_message_macros.h"
20 21
21 #define IPC_MESSAGE_START TestMsgStart 22 #define IPC_MESSAGE_START TestMsgStart
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 *called = true; 72 *called = true;
72 } 73 }
73 74
74 void ObserveStatusChanges(ServiceWorkerVersion* version, 75 void ObserveStatusChanges(ServiceWorkerVersion* version,
75 std::vector<ServiceWorkerVersion::Status>* statuses) { 76 std::vector<ServiceWorkerVersion::Status>* statuses) {
76 statuses->push_back(version->status()); 77 statuses->push_back(version->status());
77 version->RegisterStatusChangeCallback( 78 version->RegisterStatusChangeCallback(
78 base::Bind(&ObserveStatusChanges, base::Unretained(version), statuses)); 79 base::Bind(&ObserveStatusChanges, base::Unretained(version), statuses));
79 } 80 }
80 81
82 void NoOp() {
kinuko 2015/03/25 04:18:04 base::DoNothing() ?
falken 2015/03/25 06:10:01 Yep, I was looking for that.
83 }
84
85 void ReceiveFetchResult(ServiceWorkerStatusCode* status,
86 ServiceWorkerStatusCode actual_status,
87 ServiceWorkerFetchEventResult actual_result,
88 const ServiceWorkerResponse& response) {
89 *status = actual_status;
90 }
91
81 // A specialized listener class to receive test messages from a worker. 92 // A specialized listener class to receive test messages from a worker.
82 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener { 93 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener {
83 public: 94 public:
84 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance) 95 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance)
85 : instance_(instance) { 96 : instance_(instance) {
86 instance_->AddListener(this); 97 instance_->AddListener(this);
87 } 98 }
88 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); } 99 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); }
89 100
90 void OnStarted() override { NOTREACHED(); } 101 void OnStarted() override { NOTREACHED(); }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 : ServiceWorkerVersionTest() {} 202 : ServiceWorkerVersionTest() {}
192 203
193 scoped_ptr<MessageReceiver> GetMessageReceiver() override { 204 scoped_ptr<MessageReceiver> GetMessageReceiver() override {
194 return make_scoped_ptr(new MessageReceiverDisallowStart()); 205 return make_scoped_ptr(new MessageReceiverDisallowStart());
195 } 206 }
196 207
197 private: 208 private:
198 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerFailToStartTest); 209 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerFailToStartTest);
199 }; 210 };
200 211
212 class MessageReceiverDisallowFetch : public MessageReceiver {
213 public:
214 MessageReceiverDisallowFetch() : MessageReceiver() {}
215 ~MessageReceiverDisallowFetch() override {}
216
217 void OnFetchEvent(int embedded_worker_id,
218 int request_id,
219 const ServiceWorkerFetchRequest& request) override {
220 // Do nothing.
221 }
222
223 private:
224 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowFetch);
225 };
226
227 class ServiceWorkerWaitForeverInFetchTest : public ServiceWorkerVersionTest {
228 protected:
229 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {}
230
231 scoped_ptr<MessageReceiver> GetMessageReceiver() override {
232 return make_scoped_ptr(new MessageReceiverDisallowFetch());
233 }
234
235 private:
236 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest);
237 };
238
201 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { 239 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) {
202 // Call StartWorker() multiple times. 240 // Call StartWorker() multiple times.
203 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; 241 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED;
204 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; 242 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED;
205 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; 243 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED;
206 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); 244 version_->StartWorker(CreateReceiverOnCurrentThread(&status1));
207 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); 245 version_->StartWorker(CreateReceiverOnCurrentThread(&status2));
208 246
209 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); 247 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status());
210 base::RunLoop().RunUntilIdle(); 248 base::RunLoop().RunUntilIdle();
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 version_->SetDevToolsAttached(false); 498 version_->SetDevToolsAttached(false);
461 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); 499 EXPECT_TRUE(version_->timeout_timer_.IsRunning());
462 EXPECT_FALSE(version_->start_time_.is_null()); 500 EXPECT_FALSE(version_->start_time_.is_null());
463 EXPECT_TRUE(version_->skip_recording_startup_time_); 501 EXPECT_TRUE(version_->skip_recording_startup_time_);
464 502
465 base::RunLoop().RunUntilIdle(); 503 base::RunLoop().RunUntilIdle();
466 EXPECT_EQ(SERVICE_WORKER_OK, status); 504 EXPECT_EQ(SERVICE_WORKER_OK, status);
467 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); 505 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
468 } 506 }
469 507
508 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) {
509 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
510
511 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
512 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), base::Bind(&NoOp),
513 base::Bind(&ReceiveFetchResult, &status));
514 base::RunLoop().RunUntilIdle();
515
516 // Callback has not completed yet.
517 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status);
518 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
519
520 // Simulate timeout.
521 EXPECT_TRUE(version_->timeout_timer_.IsRunning());
522 version_->SetAllRequestTimes(
523 base::TimeTicks::Now() -
524 base::TimeDelta::FromMinutes(
525 ServiceWorkerVersion::kRequestTimeoutMinutes + 1));
526 version_->timeout_timer_.user_task().Run();
527 base::RunLoop().RunUntilIdle();
528 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status);
529 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
530 }
531
470 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { 532 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) {
471 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value 533 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
472 version_->StartWorker( 534 version_->StartWorker(
473 CreateReceiverOnCurrentThread(&status)); 535 CreateReceiverOnCurrentThread(&status));
474 base::RunLoop().RunUntilIdle(); 536 base::RunLoop().RunUntilIdle();
475 537
476 // Callback has not completed yet. 538 // Callback has not completed yet.
477 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); 539 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status);
478 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); 540 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status());
479 541
(...skipping 29 matching lines...) Expand all
509 base::TimeTicks::Now() - 571 base::TimeTicks::Now() -
510 base::TimeDelta::FromMinutes( 572 base::TimeDelta::FromMinutes(
511 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); 573 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1);
512 version_->timeout_timer_.user_task().Run(); 574 version_->timeout_timer_.user_task().Run();
513 base::RunLoop().RunUntilIdle(); 575 base::RunLoop().RunUntilIdle();
514 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); 576 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status);
515 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); 577 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
516 } 578 }
517 579
518 } // namespace content 580 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698