| 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 |