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

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: dont use std::queue::swap 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
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ReceiveFetchResult(ServiceWorkerStatusCode* status,
83 ServiceWorkerStatusCode actual_status,
84 ServiceWorkerFetchEventResult actual_result,
85 const ServiceWorkerResponse& response) {
86 *status = actual_status;
87 }
88
81 // A specialized listener class to receive test messages from a worker. 89 // A specialized listener class to receive test messages from a worker.
82 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener { 90 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener {
83 public: 91 public:
84 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance) 92 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance)
85 : instance_(instance) { 93 : instance_(instance) {
86 instance_->AddListener(this); 94 instance_->AddListener(this);
87 } 95 }
88 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); } 96 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); }
89 97
90 void OnStarted() override { NOTREACHED(); } 98 void OnStarted() override { NOTREACHED(); }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 : ServiceWorkerVersionTest() {} 199 : ServiceWorkerVersionTest() {}
192 200
193 scoped_ptr<MessageReceiver> GetMessageReceiver() override { 201 scoped_ptr<MessageReceiver> GetMessageReceiver() override {
194 return make_scoped_ptr(new MessageReceiverDisallowStart()); 202 return make_scoped_ptr(new MessageReceiverDisallowStart());
195 } 203 }
196 204
197 private: 205 private:
198 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerFailToStartTest); 206 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerFailToStartTest);
199 }; 207 };
200 208
209 class MessageReceiverDisallowFetch : public MessageReceiver {
210 public:
211 MessageReceiverDisallowFetch() : MessageReceiver() {}
212 ~MessageReceiverDisallowFetch() override {}
213
214 void OnFetchEvent(int embedded_worker_id,
215 int request_id,
216 const ServiceWorkerFetchRequest& request) override {
217 // Do nothing.
218 }
219
220 private:
221 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowFetch);
222 };
223
224 class ServiceWorkerWaitForeverInFetchTest : public ServiceWorkerVersionTest {
225 protected:
226 ServiceWorkerWaitForeverInFetchTest() : ServiceWorkerVersionTest() {}
227
228 scoped_ptr<MessageReceiver> GetMessageReceiver() override {
229 return make_scoped_ptr(new MessageReceiverDisallowFetch());
230 }
231
232 private:
233 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest);
234 };
235
201 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { 236 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) {
202 // Call StartWorker() multiple times. 237 // Call StartWorker() multiple times.
203 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; 238 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED;
204 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; 239 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED;
205 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; 240 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED;
206 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); 241 version_->StartWorker(CreateReceiverOnCurrentThread(&status1));
207 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); 242 version_->StartWorker(CreateReceiverOnCurrentThread(&status2));
208 243
209 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); 244 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status());
210 base::RunLoop().RunUntilIdle(); 245 base::RunLoop().RunUntilIdle();
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 version_->SetDevToolsAttached(false); 495 version_->SetDevToolsAttached(false);
461 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); 496 EXPECT_TRUE(version_->timeout_timer_.IsRunning());
462 EXPECT_FALSE(version_->start_time_.is_null()); 497 EXPECT_FALSE(version_->start_time_.is_null());
463 EXPECT_TRUE(version_->skip_recording_startup_time_); 498 EXPECT_TRUE(version_->skip_recording_startup_time_);
464 499
465 base::RunLoop().RunUntilIdle(); 500 base::RunLoop().RunUntilIdle();
466 EXPECT_EQ(SERVICE_WORKER_OK, status); 501 EXPECT_EQ(SERVICE_WORKER_OK, status);
467 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); 502 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
468 } 503 }
469 504
505 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) {
506 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
507
508 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
509 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(),
510 base::Bind(&base::DoNothing),
511 base::Bind(&ReceiveFetchResult, &status));
512 base::RunLoop().RunUntilIdle();
513
514 // Callback has not completed yet.
515 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status);
516 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
517
518 // Simulate timeout.
519 EXPECT_TRUE(version_->timeout_timer_.IsRunning());
520 version_->SetAllRequestTimes(
521 base::TimeTicks::Now() -
522 base::TimeDelta::FromMinutes(
523 ServiceWorkerVersion::kRequestTimeoutMinutes + 1));
524 version_->timeout_timer_.user_task().Run();
525 base::RunLoop().RunUntilIdle();
526 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status);
527 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
528 }
529
470 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) { 530 TEST_F(ServiceWorkerFailToStartTest, RendererCrash) {
471 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value 531 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
472 version_->StartWorker( 532 version_->StartWorker(
473 CreateReceiverOnCurrentThread(&status)); 533 CreateReceiverOnCurrentThread(&status));
474 base::RunLoop().RunUntilIdle(); 534 base::RunLoop().RunUntilIdle();
475 535
476 // Callback has not completed yet. 536 // Callback has not completed yet.
477 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); 537 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status);
478 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); 538 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status());
479 539
(...skipping 29 matching lines...) Expand all
509 base::TimeTicks::Now() - 569 base::TimeTicks::Now() -
510 base::TimeDelta::FromMinutes( 570 base::TimeDelta::FromMinutes(
511 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); 571 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1);
512 version_->timeout_timer_.user_task().Run(); 572 version_->timeout_timer_.user_task().Run();
513 base::RunLoop().RunUntilIdle(); 573 base::RunLoop().RunUntilIdle();
514 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); 574 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status);
515 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); 575 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
516 } 576 }
517 577
518 } // namespace content 578 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698