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 "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_utils.h" | 13 #include "content/browser/service_worker/service_worker_utils.h" |
14 #include "content/browser/service_worker/service_worker_version.h" | 14 #include "content/browser/service_worker/service_worker_version.h" |
15 #include "content/public/test/test_browser_thread_bundle.h" | 15 #include "content/public/test/test_browser_thread_bundle.h" |
| 16 #include "content/public/test/test_utils.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
17 | 18 |
18 // IPC messages for testing --------------------------------------------------- | 19 // IPC messages for testing --------------------------------------------------- |
19 | 20 |
20 #define IPC_MESSAGE_IMPL | 21 #define IPC_MESSAGE_IMPL |
21 #include "ipc/ipc_message_macros.h" | 22 #include "ipc/ipc_message_macros.h" |
22 | 23 |
23 #define IPC_MESSAGE_START TestMsgStart | 24 #define IPC_MESSAGE_START TestMsgStart |
24 | 25 |
25 IPC_MESSAGE_CONTROL0(TestMsg_Message); | 26 IPC_MESSAGE_CONTROL0(TestMsg_Message); |
26 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int); | 27 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int); |
27 | 28 |
28 // --------------------------------------------------------------------------- | 29 // --------------------------------------------------------------------------- |
29 | 30 |
30 namespace content { | 31 namespace content { |
31 | 32 |
32 namespace { | 33 namespace { |
33 | 34 |
34 static const int kRenderProcessId = 1; | |
35 | |
36 class MessageReceiver : public EmbeddedWorkerTestHelper { | 35 class MessageReceiver : public EmbeddedWorkerTestHelper { |
37 public: | 36 public: |
38 MessageReceiver() | 37 MessageReceiver() |
39 : EmbeddedWorkerTestHelper(base::FilePath(), kRenderProcessId), | 38 : EmbeddedWorkerTestHelper(base::FilePath()), |
40 current_embedded_worker_id_(0) {} | 39 current_embedded_worker_id_(0) {} |
41 ~MessageReceiver() override {} | 40 ~MessageReceiver() override {} |
42 | 41 |
43 bool OnMessageToWorker(int thread_id, | 42 bool OnMessageToWorker(int thread_id, |
44 int embedded_worker_id, | 43 int embedded_worker_id, |
45 const IPC::Message& message) override { | 44 const IPC::Message& message) override { |
46 if (EmbeddedWorkerTestHelper::OnMessageToWorker( | 45 if (EmbeddedWorkerTestHelper::OnMessageToWorker( |
47 thread_id, embedded_worker_id, message)) { | 46 thread_id, embedded_worker_id, message)) { |
48 return true; | 47 return true; |
49 } | 48 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 base::RunLoop().RunUntilIdle(); | 170 base::RunLoop().RunUntilIdle(); |
172 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 171 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
173 helper_->context()->storage()->StoreRegistration( | 172 helper_->context()->storage()->StoreRegistration( |
174 registration_.get(), | 173 registration_.get(), |
175 version_.get(), | 174 version_.get(), |
176 CreateReceiverOnCurrentThread(&status)); | 175 CreateReceiverOnCurrentThread(&status)); |
177 base::RunLoop().RunUntilIdle(); | 176 base::RunLoop().RunUntilIdle(); |
178 ASSERT_EQ(SERVICE_WORKER_OK, status); | 177 ASSERT_EQ(SERVICE_WORKER_OK, status); |
179 | 178 |
180 // Simulate adding one process to the pattern. | 179 // Simulate adding one process to the pattern. |
181 helper_->SimulateAddProcessToPattern(pattern_, kRenderProcessId); | 180 helper_->SimulateAddProcessToPattern(pattern_, |
| 181 helper_->mock_render_process_id()); |
182 ASSERT_TRUE(helper_->context()->process_manager() | 182 ASSERT_TRUE(helper_->context()->process_manager() |
183 ->PatternHasProcessToRun(pattern_)); | 183 ->PatternHasProcessToRun(pattern_)); |
184 } | 184 } |
185 | 185 |
186 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() { | 186 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() { |
187 return make_scoped_ptr(new MessageReceiver()); | 187 return make_scoped_ptr(new MessageReceiver()); |
188 } | 188 } |
189 | 189 |
190 void TearDown() override { | 190 void TearDown() override { |
191 version_ = 0; | 191 version_ = 0; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 | 258 |
259 private: | 259 private: |
260 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); | 260 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWaitForeverInFetchTest); |
261 }; | 261 }; |
262 | 262 |
263 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { | 263 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
264 // Call StartWorker() multiple times. | 264 // Call StartWorker() multiple times. |
265 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | 265 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
266 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | 266 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
267 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; | 267 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; |
268 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); | 268 scoped_refptr<MessageLoopRunner> runner1(new MessageLoopRunner); |
269 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); | 269 scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner); |
| 270 version_->StartWorker( |
| 271 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
| 272 version_->StartWorker( |
| 273 CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); |
270 | 274 |
271 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 275 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
272 base::RunLoop().RunUntilIdle(); | 276 runner1->Run(); |
| 277 runner2->Run(); |
273 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 278 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
274 | 279 |
275 // Call StartWorker() after it's started. | 280 // Call StartWorker() after it's started. |
276 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); | 281 runner1 = new MessageLoopRunner(); |
277 base::RunLoop().RunUntilIdle(); | 282 version_->StartWorker( |
| 283 CreateReceiverOnCurrentThread(&status3, runner1->QuitClosure())); |
| 284 runner1->Run(); |
278 | 285 |
279 // All should just succeed. | 286 // All should just succeed. |
280 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 287 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
281 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 288 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
282 EXPECT_EQ(SERVICE_WORKER_OK, status3); | 289 EXPECT_EQ(SERVICE_WORKER_OK, status3); |
283 | 290 |
284 // Call StopWorker() multiple times. | 291 // Call StopWorker() multiple times. |
285 status1 = SERVICE_WORKER_ERROR_FAILED; | 292 status1 = SERVICE_WORKER_ERROR_FAILED; |
286 status2 = SERVICE_WORKER_ERROR_FAILED; | 293 status2 = SERVICE_WORKER_ERROR_FAILED; |
287 version_->StopWorker(CreateReceiverOnCurrentThread(&status1)); | 294 runner1 = new MessageLoopRunner; |
288 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); | 295 runner2 = new MessageLoopRunner; |
| 296 version_->StopWorker( |
| 297 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
| 298 version_->StopWorker( |
| 299 CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); |
289 | 300 |
290 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); | 301 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); |
291 base::RunLoop().RunUntilIdle(); | 302 runner1->Run(); |
| 303 runner2->Run(); |
292 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 304 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
293 | 305 |
294 // All StopWorker should just succeed. | 306 // All StopWorker should just succeed. |
295 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 307 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
296 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 308 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
297 | 309 |
298 // Start worker again. | 310 // Start worker again. |
299 status1 = SERVICE_WORKER_ERROR_FAILED; | 311 status1 = SERVICE_WORKER_ERROR_FAILED; |
300 status2 = SERVICE_WORKER_ERROR_FAILED; | 312 status2 = SERVICE_WORKER_ERROR_FAILED; |
301 status3 = SERVICE_WORKER_ERROR_FAILED; | 313 status3 = SERVICE_WORKER_ERROR_FAILED; |
| 314 runner1 = new MessageLoopRunner(); |
| 315 scoped_refptr<MessageLoopRunner> runner3(new MessageLoopRunner()); |
302 | 316 |
303 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); | 317 version_->StartWorker( |
| 318 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
304 | 319 |
305 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 320 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
306 base::RunLoop().RunUntilIdle(); | 321 runner1->Run(); |
307 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 322 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
308 | 323 |
309 // Call StopWorker() | 324 // Call StopWorker() |
310 status2 = SERVICE_WORKER_ERROR_FAILED; | 325 status2 = SERVICE_WORKER_ERROR_FAILED; |
311 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); | 326 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); |
312 | 327 |
313 // And try calling StartWorker while StopWorker is in queue. | 328 // And try calling StartWorker while StopWorker is in queue. |
314 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); | 329 version_->StartWorker( |
| 330 CreateReceiverOnCurrentThread(&status3, runner3->QuitClosure())); |
315 | 331 |
316 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); | 332 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); |
317 base::RunLoop().RunUntilIdle(); | 333 runner3->Run(); |
318 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 334 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
319 | 335 |
320 // All should just succeed. | 336 // All should just succeed. |
321 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 337 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
322 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 338 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
323 EXPECT_EQ(SERVICE_WORKER_OK, status3); | 339 EXPECT_EQ(SERVICE_WORKER_OK, status3); |
324 } | 340 } |
325 | 341 |
326 TEST_F(ServiceWorkerVersionTest, DispatchEventToStoppedWorker) { | 342 TEST_F(ServiceWorkerVersionTest, DispatchEventToStoppedWorker) { |
327 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 343 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
328 | 344 |
329 // Dispatch an event without starting the worker. | 345 // Dispatch an event without starting the worker. |
330 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 346 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 347 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
331 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 348 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
332 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); | 349 version_->DispatchInstallEvent( |
333 base::RunLoop().RunUntilIdle(); | 350 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 351 runner->Run(); |
334 EXPECT_EQ(SERVICE_WORKER_OK, status); | 352 EXPECT_EQ(SERVICE_WORKER_OK, status); |
335 | 353 |
336 // The worker should be now started. | 354 // The worker should be now started. |
337 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 355 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
338 | 356 |
339 // Stop the worker, and then dispatch an event immediately after that. | 357 // Stop the worker, and then dispatch an event immediately after that. |
340 status = SERVICE_WORKER_ERROR_FAILED; | 358 status = SERVICE_WORKER_ERROR_FAILED; |
| 359 runner = new MessageLoopRunner; |
341 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; | 360 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; |
342 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); | 361 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); |
343 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); | 362 version_->DispatchInstallEvent( |
344 base::RunLoop().RunUntilIdle(); | 363 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 364 runner->Run(); |
345 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); | 365 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); |
346 | 366 |
347 // Dispatch an event should return SERVICE_WORKER_OK since the worker | 367 // Dispatch an event should return SERVICE_WORKER_OK since the worker |
348 // should have been restarted to dispatch the event. | 368 // should have been restarted to dispatch the event. |
349 EXPECT_EQ(SERVICE_WORKER_OK, status); | 369 EXPECT_EQ(SERVICE_WORKER_OK, status); |
350 | 370 |
351 // The worker should be now started again. | 371 // The worker should be now started again. |
352 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 372 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
353 } | 373 } |
354 | 374 |
355 TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) { | 375 TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) { |
356 // Start worker. | 376 // Start worker. |
357 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 377 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
358 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 378 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 379 version_->StartWorker( |
| 380 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
359 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 381 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
360 base::RunLoop().RunUntilIdle(); | 382 runner->Run(); |
361 EXPECT_EQ(SERVICE_WORKER_OK, status); | 383 EXPECT_EQ(SERVICE_WORKER_OK, status); |
362 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 384 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
363 | 385 |
364 MessageReceiverFromWorker receiver(version_->embedded_worker()); | 386 MessageReceiverFromWorker receiver(version_->embedded_worker()); |
365 | 387 |
366 // Simulate sending some dummy values from the worker. | 388 // Simulate sending some dummy values from the worker. |
367 helper_->SimulateSendValueToBrowser( | 389 helper_->SimulateSendValueToBrowser( |
368 version_->embedded_worker()->embedded_worker_id(), 555); | 390 version_->embedded_worker()->embedded_worker_id(), 555); |
369 helper_->SimulateSendValueToBrowser( | 391 helper_->SimulateSendValueToBrowser( |
370 version_->embedded_worker()->embedded_worker_id(), 777); | 392 version_->embedded_worker()->embedded_worker_id(), 777); |
371 | 393 |
372 // Verify the receiver received the values. | 394 // Verify the receiver received the values. |
373 ASSERT_EQ(2U, receiver.received_values().size()); | 395 ASSERT_EQ(2U, receiver.received_values().size()); |
374 EXPECT_EQ(555, receiver.received_values()[0]); | 396 EXPECT_EQ(555, receiver.received_values()[0]); |
375 EXPECT_EQ(777, receiver.received_values()[1]); | 397 EXPECT_EQ(777, receiver.received_values()[1]); |
376 } | 398 } |
377 | 399 |
378 TEST_F(ServiceWorkerVersionTest, InstallAndWaitCompletion) { | 400 TEST_F(ServiceWorkerVersionTest, InstallAndWaitCompletion) { |
379 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 401 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
380 | 402 |
381 // Dispatch an install event. | 403 // Dispatch an install event. |
382 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 404 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
383 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); | 405 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 406 version_->DispatchInstallEvent( |
| 407 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
384 | 408 |
385 // Wait for the completion. | 409 // Wait for the completion. |
386 bool status_change_called = false; | 410 bool status_change_called = false; |
387 version_->RegisterStatusChangeCallback( | 411 version_->RegisterStatusChangeCallback( |
388 base::Bind(&VerifyCalled, &status_change_called)); | 412 base::Bind(&VerifyCalled, &status_change_called)); |
389 | 413 |
390 base::RunLoop().RunUntilIdle(); | 414 runner->Run(); |
391 | 415 |
392 // Version's status must not have changed during installation. | 416 // Version's status must not have changed during installation. |
393 EXPECT_EQ(SERVICE_WORKER_OK, status); | 417 EXPECT_EQ(SERVICE_WORKER_OK, status); |
394 EXPECT_FALSE(status_change_called); | 418 EXPECT_FALSE(status_change_called); |
395 EXPECT_EQ(ServiceWorkerVersion::INSTALLING, version_->status()); | 419 EXPECT_EQ(ServiceWorkerVersion::INSTALLING, version_->status()); |
396 } | 420 } |
397 | 421 |
398 TEST_F(ServiceWorkerVersionTest, ActivateAndWaitCompletion) { | 422 TEST_F(ServiceWorkerVersionTest, ActivateAndWaitCompletion) { |
399 version_->SetStatus(ServiceWorkerVersion::ACTIVATING); | 423 version_->SetStatus(ServiceWorkerVersion::ACTIVATING); |
400 | 424 |
401 // Dispatch an activate event. | 425 // Dispatch an activate event. |
402 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 426 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
403 version_->DispatchActivateEvent(CreateReceiverOnCurrentThread(&status)); | 427 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 428 version_->DispatchActivateEvent( |
| 429 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
404 | 430 |
405 // Wait for the completion. | 431 // Wait for the completion. |
406 bool status_change_called = false; | 432 bool status_change_called = false; |
407 version_->RegisterStatusChangeCallback( | 433 version_->RegisterStatusChangeCallback( |
408 base::Bind(&VerifyCalled, &status_change_called)); | 434 base::Bind(&VerifyCalled, &status_change_called)); |
409 | 435 |
410 base::RunLoop().RunUntilIdle(); | 436 runner->Run(); |
411 | 437 |
412 // Version's status must not have changed during activation. | 438 // Version's status must not have changed during activation. |
413 EXPECT_EQ(SERVICE_WORKER_OK, status); | 439 EXPECT_EQ(SERVICE_WORKER_OK, status); |
414 EXPECT_FALSE(status_change_called); | 440 EXPECT_FALSE(status_change_called); |
415 EXPECT_EQ(ServiceWorkerVersion::ACTIVATING, version_->status()); | 441 EXPECT_EQ(ServiceWorkerVersion::ACTIVATING, version_->status()); |
416 } | 442 } |
417 | 443 |
418 TEST_F(ServiceWorkerVersionTest, RepeatedlyObserveStatusChanges) { | 444 TEST_F(ServiceWorkerVersionTest, RepeatedlyObserveStatusChanges) { |
419 EXPECT_EQ(ServiceWorkerVersion::NEW, version_->status()); | 445 EXPECT_EQ(ServiceWorkerVersion::NEW, version_->status()); |
420 | 446 |
(...skipping 21 matching lines...) Expand all Loading... |
442 // Used to reliably test when the idle time gets reset regardless of clock | 468 // Used to reliably test when the idle time gets reset regardless of clock |
443 // granularity. | 469 // granularity. |
444 const base::TimeDelta kOneSecond = base::TimeDelta::FromSeconds(1); | 470 const base::TimeDelta kOneSecond = base::TimeDelta::FromSeconds(1); |
445 | 471 |
446 // Verify the timer is not running when version initializes its status. | 472 // Verify the timer is not running when version initializes its status. |
447 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 473 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
448 EXPECT_FALSE(version_->timeout_timer_.IsRunning()); | 474 EXPECT_FALSE(version_->timeout_timer_.IsRunning()); |
449 | 475 |
450 // Verify the timer is running after the worker is started. | 476 // Verify the timer is running after the worker is started. |
451 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 477 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
452 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 478 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
453 base::RunLoop().RunUntilIdle(); | 479 version_->StartWorker( |
| 480 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 481 runner->Run(); |
454 EXPECT_EQ(SERVICE_WORKER_OK, status); | 482 EXPECT_EQ(SERVICE_WORKER_OK, status); |
455 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 483 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
456 EXPECT_FALSE(version_->idle_time_.is_null()); | 484 EXPECT_FALSE(version_->idle_time_.is_null()); |
457 | 485 |
458 // The idle time should be reset if the worker is restarted without | 486 // The idle time should be reset if the worker is restarted without |
459 // controllee. | 487 // controllee. |
460 status = SERVICE_WORKER_ERROR_FAILED; | 488 status = SERVICE_WORKER_ERROR_FAILED; |
| 489 runner = new MessageLoopRunner; |
461 version_->idle_time_ -= kOneSecond; | 490 version_->idle_time_ -= kOneSecond; |
462 base::TimeTicks idle_time = version_->idle_time_; | 491 base::TimeTicks idle_time = version_->idle_time_; |
463 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | 492 version_->StopWorker( |
464 base::RunLoop().RunUntilIdle(); | 493 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 494 runner->Run(); |
465 EXPECT_EQ(SERVICE_WORKER_OK, status); | 495 EXPECT_EQ(SERVICE_WORKER_OK, status); |
466 status = SERVICE_WORKER_ERROR_FAILED; | 496 status = SERVICE_WORKER_ERROR_FAILED; |
467 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 497 runner = new MessageLoopRunner; |
468 base::RunLoop().RunUntilIdle(); | 498 version_->StartWorker( |
| 499 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 500 runner->Run(); |
469 EXPECT_EQ(SERVICE_WORKER_OK, status); | 501 EXPECT_EQ(SERVICE_WORKER_OK, status); |
470 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 502 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
471 EXPECT_LT(idle_time, version_->idle_time_); | 503 EXPECT_LT(idle_time, version_->idle_time_); |
472 | 504 |
473 // Adding a controllee resets the idle time. | 505 // Adding a controllee resets the idle time. |
474 version_->idle_time_ -= kOneSecond; | 506 version_->idle_time_ -= kOneSecond; |
475 idle_time = version_->idle_time_; | 507 idle_time = version_->idle_time_; |
476 scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( | 508 scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( |
477 33 /* dummy render process id */, MSG_ROUTING_NONE /* render_frame_id */, | 509 33 /* dummy render process id */, MSG_ROUTING_NONE /* render_frame_id */, |
478 1 /* dummy provider_id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 510 1 /* dummy provider_id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
(...skipping 24 matching lines...) Expand all Loading... |
503 CreateReceiverOnCurrentThread(&status)); | 535 CreateReceiverOnCurrentThread(&status)); |
504 base::RunLoop().RunUntilIdle(); | 536 base::RunLoop().RunUntilIdle(); |
505 MessagePortService::GetInstance()->Destroy(ports[0].id); | 537 MessagePortService::GetInstance()->Destroy(ports[0].id); |
506 | 538 |
507 EXPECT_EQ(SERVICE_WORKER_OK, status); | 539 EXPECT_EQ(SERVICE_WORKER_OK, status); |
508 EXPECT_LT(idle_time, version_->idle_time_); | 540 EXPECT_LT(idle_time, version_->idle_time_); |
509 } | 541 } |
510 | 542 |
511 TEST_F(ServiceWorkerVersionTest, SetDevToolsAttached) { | 543 TEST_F(ServiceWorkerVersionTest, SetDevToolsAttached) { |
512 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 544 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
513 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 545 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 546 version_->StartWorker( |
| 547 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
514 | 548 |
515 ASSERT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); | 549 ASSERT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
516 | 550 |
517 ASSERT_TRUE(version_->timeout_timer_.IsRunning()); | 551 ASSERT_TRUE(version_->timeout_timer_.IsRunning()); |
518 ASSERT_FALSE(version_->start_time_.is_null()); | 552 ASSERT_FALSE(version_->start_time_.is_null()); |
519 ASSERT_FALSE(version_->skip_recording_startup_time_); | 553 ASSERT_FALSE(version_->skip_recording_startup_time_); |
520 | 554 |
521 // Simulate DevTools is attached. This should deactivate the timer for start | 555 // Simulate DevTools is attached. This should deactivate the timer for start |
522 // timeout, but not stop the timer itself. | 556 // timeout, but not stop the timer itself. |
523 version_->SetDevToolsAttached(true); | 557 version_->SetDevToolsAttached(true); |
524 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 558 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
525 EXPECT_TRUE(version_->start_time_.is_null()); | 559 EXPECT_TRUE(version_->start_time_.is_null()); |
526 EXPECT_TRUE(version_->skip_recording_startup_time_); | 560 EXPECT_TRUE(version_->skip_recording_startup_time_); |
527 | 561 |
528 // Simulate DevTools is detached. This should reactivate the timer for start | 562 // Simulate DevTools is detached. This should reactivate the timer for start |
529 // timeout. | 563 // timeout. |
530 version_->SetDevToolsAttached(false); | 564 version_->SetDevToolsAttached(false); |
531 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 565 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
532 EXPECT_FALSE(version_->start_time_.is_null()); | 566 EXPECT_FALSE(version_->start_time_.is_null()); |
533 EXPECT_TRUE(version_->skip_recording_startup_time_); | 567 EXPECT_TRUE(version_->skip_recording_startup_time_); |
534 | 568 |
535 base::RunLoop().RunUntilIdle(); | 569 runner->Run(); |
536 EXPECT_EQ(SERVICE_WORKER_OK, status); | 570 EXPECT_EQ(SERVICE_WORKER_OK, status); |
537 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 571 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
538 } | 572 } |
539 | 573 |
540 TEST_F(ServiceWorkerVersionTest, StoppingBeforeDestruct) { | 574 TEST_F(ServiceWorkerVersionTest, StoppingBeforeDestruct) { |
541 RunningStateListener listener; | 575 RunningStateListener listener; |
542 version_->AddListener(&listener); | 576 version_->AddListener(&listener); |
543 | 577 |
| 578 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
544 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 579 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
545 version_->StartWorker(CreateReceiverOnCurrentThread(&status)); | 580 version_->StartWorker( |
546 base::RunLoop().RunUntilIdle(); | 581 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 582 runner->Run(); |
547 EXPECT_EQ(SERVICE_WORKER_OK, status); | 583 EXPECT_EQ(SERVICE_WORKER_OK, status); |
548 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); | 584 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
549 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); | 585 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); |
550 | 586 |
551 version_ = nullptr; | 587 version_ = nullptr; |
552 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); | 588 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); |
553 } | 589 } |
554 | 590 |
555 // Test that update isn't triggered for a non-stale worker. | 591 // Test that update isn't triggered for a non-stale worker. |
556 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { | 592 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { |
557 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 593 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
558 | 594 |
| 595 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
559 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 596 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
560 registration_->SetActiveVersion(version_); | 597 registration_->SetActiveVersion(version_); |
561 registration_->set_last_update_check(base::Time::Now()); | 598 registration_->set_last_update_check(base::Time::Now()); |
562 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 599 version_->DispatchPushEvent( |
563 std::string()); | 600 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
564 base::RunLoop().RunUntilIdle(); | 601 std::string()); |
| 602 runner->Run(); |
565 | 603 |
566 EXPECT_EQ(SERVICE_WORKER_OK, status); | 604 EXPECT_EQ(SERVICE_WORKER_OK, status); |
567 EXPECT_TRUE(version_->stale_time_.is_null()); | 605 EXPECT_TRUE(version_->stale_time_.is_null()); |
568 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 606 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
569 } | 607 } |
570 | 608 |
571 // Test that update isn't triggered for a non-active worker. | 609 // Test that update isn't triggered for a non-active worker. |
572 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { | 610 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { |
573 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 611 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
574 | 612 |
| 613 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
575 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 614 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
576 registration_->SetInstallingVersion(version_); | 615 registration_->SetInstallingVersion(version_); |
577 registration_->set_last_update_check(GetYesterday()); | 616 registration_->set_last_update_check(GetYesterday()); |
578 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); | 617 version_->DispatchInstallEvent( |
579 base::RunLoop().RunUntilIdle(); | 618 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 619 runner->Run(); |
580 | 620 |
581 EXPECT_EQ(SERVICE_WORKER_OK, status); | 621 EXPECT_EQ(SERVICE_WORKER_OK, status); |
582 EXPECT_TRUE(version_->stale_time_.is_null()); | 622 EXPECT_TRUE(version_->stale_time_.is_null()); |
583 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 623 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
584 } | 624 } |
585 | 625 |
586 // Test that staleness is detected when starting a worker. | 626 // Test that staleness is detected when starting a worker. |
587 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { | 627 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { |
588 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 628 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
589 | 629 |
590 // Starting the worker marks it as stale. | 630 // Starting the worker marks it as stale. |
| 631 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
591 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 632 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
592 registration_->SetActiveVersion(version_); | 633 registration_->SetActiveVersion(version_); |
593 registration_->set_last_update_check(GetYesterday()); | 634 registration_->set_last_update_check(GetYesterday()); |
594 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 635 version_->DispatchPushEvent( |
595 std::string()); | 636 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
596 base::RunLoop().RunUntilIdle(); | 637 std::string()); |
| 638 runner->Run(); |
597 EXPECT_EQ(SERVICE_WORKER_OK, status); | 639 EXPECT_EQ(SERVICE_WORKER_OK, status); |
598 EXPECT_FALSE(version_->stale_time_.is_null()); | 640 EXPECT_FALSE(version_->stale_time_.is_null()); |
599 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 641 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
600 | 642 |
601 // Update is actually scheduled after the worker stops. | 643 // Update is actually scheduled after the worker stops. |
602 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | 644 runner = new MessageLoopRunner; |
603 base::RunLoop().RunUntilIdle(); | 645 version_->StopWorker( |
| 646 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 647 runner->Run(); |
604 EXPECT_EQ(SERVICE_WORKER_OK, status); | 648 EXPECT_EQ(SERVICE_WORKER_OK, status); |
605 EXPECT_TRUE(version_->stale_time_.is_null()); | 649 EXPECT_TRUE(version_->stale_time_.is_null()); |
606 EXPECT_TRUE(version_->update_timer_.IsRunning()); | 650 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
607 } | 651 } |
608 | 652 |
609 // Test that staleness is detected on a running worker. | 653 // Test that staleness is detected on a running worker. |
610 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { | 654 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { |
611 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 655 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
612 | 656 |
613 // Start a fresh worker. | 657 // Start a fresh worker. |
| 658 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
614 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 659 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
615 registration_->SetActiveVersion(version_); | 660 registration_->SetActiveVersion(version_); |
616 registration_->set_last_update_check(base::Time::Now()); | 661 registration_->set_last_update_check(base::Time::Now()); |
617 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), | 662 version_->DispatchPushEvent( |
618 std::string()); | 663 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
619 base::RunLoop().RunUntilIdle(); | 664 std::string()); |
| 665 runner->Run(); |
620 EXPECT_EQ(SERVICE_WORKER_OK, status); | 666 EXPECT_EQ(SERVICE_WORKER_OK, status); |
621 EXPECT_TRUE(version_->stale_time_.is_null()); | 667 EXPECT_TRUE(version_->stale_time_.is_null()); |
622 | 668 |
623 // Simulate it running for a day. It will be marked stale. | 669 // Simulate it running for a day. It will be marked stale. |
624 registration_->set_last_update_check(GetYesterday()); | 670 registration_->set_last_update_check(GetYesterday()); |
625 version_->OnTimeoutTimer(); | 671 version_->OnTimeoutTimer(); |
626 EXPECT_FALSE(version_->stale_time_.is_null()); | 672 EXPECT_FALSE(version_->stale_time_.is_null()); |
627 EXPECT_FALSE(version_->update_timer_.IsRunning()); | 673 EXPECT_FALSE(version_->update_timer_.IsRunning()); |
628 | 674 |
629 // Simulate it running for past the wait threshold. The update will be | 675 // Simulate it running for past the wait threshold. The update will be |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 base::TimeTicks::Now() - | 787 base::TimeTicks::Now() - |
742 base::TimeDelta::FromMinutes( | 788 base::TimeDelta::FromMinutes( |
743 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); | 789 ServiceWorkerVersion::kStartWorkerTimeoutMinutes + 1); |
744 version_->timeout_timer_.user_task().Run(); | 790 version_->timeout_timer_.user_task().Run(); |
745 base::RunLoop().RunUntilIdle(); | 791 base::RunLoop().RunUntilIdle(); |
746 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 792 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); |
747 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); | 793 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
748 } | 794 } |
749 | 795 |
750 } // namespace content | 796 } // namespace content |
OLD | NEW |