Index: content/browser/service_worker/service_worker_version_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc |
index e52f698de13e452329dfe5a3c21e25ad34c57ec4..d124999bb5efbc725599cbf242dfd69affa054ad 100644 |
--- a/content/browser/service_worker/service_worker_version_unittest.cc |
+++ b/content/browser/service_worker/service_worker_version_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "content/browser/service_worker/service_worker_utils.h" |
#include "content/browser/service_worker/service_worker_version.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
+#include "content/public/test/test_utils.h" |
#include "testing/gtest/include/gtest/gtest.h" |
// IPC messages for testing --------------------------------------------------- |
@@ -31,12 +32,10 @@ namespace content { |
namespace { |
-static const int kRenderProcessId = 1; |
- |
class MessageReceiver : public EmbeddedWorkerTestHelper { |
public: |
MessageReceiver() |
- : EmbeddedWorkerTestHelper(base::FilePath(), kRenderProcessId), |
+ : EmbeddedWorkerTestHelper(base::FilePath()), |
current_embedded_worker_id_(0) {} |
~MessageReceiver() override {} |
@@ -178,7 +177,8 @@ class ServiceWorkerVersionTest : public testing::Test { |
ASSERT_EQ(SERVICE_WORKER_OK, status); |
// Simulate adding one process to the pattern. |
- helper_->SimulateAddProcessToPattern(pattern_, kRenderProcessId); |
+ helper_->SimulateAddProcessToPattern(pattern_, |
+ helper_->mock_render_process_id()); |
ASSERT_TRUE(helper_->context()->process_manager() |
->PatternHasProcessToRun(pattern_)); |
} |
@@ -265,16 +265,23 @@ TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); |
+ scoped_refptr<MessageLoopRunner> runner1(new MessageLoopRunner); |
+ scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); |
EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
- base::RunLoop().RunUntilIdle(); |
+ runner1->Run(); |
+ runner2->Run(); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
// Call StartWorker() after it's started. |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); |
- base::RunLoop().RunUntilIdle(); |
+ runner1 = new MessageLoopRunner(); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status3, runner1->QuitClosure())); |
+ runner1->Run(); |
// All should just succeed. |
EXPECT_EQ(SERVICE_WORKER_OK, status1); |
@@ -284,11 +291,16 @@ TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
// Call StopWorker() multiple times. |
status1 = SERVICE_WORKER_ERROR_FAILED; |
status2 = SERVICE_WORKER_ERROR_FAILED; |
- version_->StopWorker(CreateReceiverOnCurrentThread(&status1)); |
- version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); |
+ runner1 = new MessageLoopRunner; |
+ runner2 = new MessageLoopRunner; |
+ version_->StopWorker( |
+ CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
+ version_->StopWorker( |
+ CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); |
EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); |
- base::RunLoop().RunUntilIdle(); |
+ runner1->Run(); |
+ runner2->Run(); |
EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
// All StopWorker should just succeed. |
@@ -299,11 +311,14 @@ TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
status1 = SERVICE_WORKER_ERROR_FAILED; |
status2 = SERVICE_WORKER_ERROR_FAILED; |
status3 = SERVICE_WORKER_ERROR_FAILED; |
+ runner1 = new MessageLoopRunner(); |
+ scoped_refptr<MessageLoopRunner> runner3(new MessageLoopRunner()); |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); |
EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
- base::RunLoop().RunUntilIdle(); |
+ runner1->Run(); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
// Call StopWorker() |
@@ -311,10 +326,11 @@ TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); |
// And try calling StartWorker while StopWorker is in queue. |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status3, runner3->QuitClosure())); |
EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); |
- base::RunLoop().RunUntilIdle(); |
+ runner3->Run(); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
// All should just succeed. |
@@ -328,9 +344,11 @@ TEST_F(ServiceWorkerVersionTest, DispatchEventToStoppedWorker) { |
// Dispatch an event without starting the worker. |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
- version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchInstallEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
// The worker should be now started. |
@@ -338,10 +356,12 @@ TEST_F(ServiceWorkerVersionTest, DispatchEventToStoppedWorker) { |
// Stop the worker, and then dispatch an event immediately after that. |
status = SERVICE_WORKER_ERROR_FAILED; |
+ runner = new MessageLoopRunner; |
ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; |
version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); |
- version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchInstallEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, stop_status); |
// Dispatch an event should return SERVICE_WORKER_OK since the worker |
@@ -355,9 +375,11 @@ TEST_F(ServiceWorkerVersionTest, DispatchEventToStoppedWorker) { |
TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) { |
// Start worker. |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
- base::RunLoop().RunUntilIdle(); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
@@ -380,14 +402,16 @@ TEST_F(ServiceWorkerVersionTest, InstallAndWaitCompletion) { |
// Dispatch an install event. |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
+ version_->DispatchInstallEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
// Wait for the completion. |
bool status_change_called = false; |
version_->RegisterStatusChangeCallback( |
base::Bind(&VerifyCalled, &status_change_called)); |
- base::RunLoop().RunUntilIdle(); |
+ runner->Run(); |
// Version's status must not have changed during installation. |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
@@ -400,14 +424,16 @@ TEST_F(ServiceWorkerVersionTest, ActivateAndWaitCompletion) { |
// Dispatch an activate event. |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->DispatchActivateEvent(CreateReceiverOnCurrentThread(&status)); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
+ version_->DispatchActivateEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
// Wait for the completion. |
bool status_change_called = false; |
version_->RegisterStatusChangeCallback( |
base::Bind(&VerifyCalled, &status_change_called)); |
- base::RunLoop().RunUntilIdle(); |
+ runner->Run(); |
// Version's status must not have changed during activation. |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
@@ -449,8 +475,10 @@ TEST_F(ServiceWorkerVersionTest, IdleTimeout) { |
// Verify the timer is running after the worker is started. |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
EXPECT_FALSE(version_->idle_time_.is_null()); |
@@ -458,14 +486,18 @@ TEST_F(ServiceWorkerVersionTest, IdleTimeout) { |
// The idle time should be reset if the worker is restarted without |
// controllee. |
status = SERVICE_WORKER_ERROR_FAILED; |
+ runner = new MessageLoopRunner; |
version_->idle_time_ -= kOneSecond; |
base::TimeTicks idle_time = version_->idle_time_; |
- version_->StopWorker(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ version_->StopWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
status = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ runner = new MessageLoopRunner; |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
EXPECT_LT(idle_time, version_->idle_time_); |
@@ -510,7 +542,9 @@ TEST_F(ServiceWorkerVersionTest, IdleTimeout) { |
TEST_F(ServiceWorkerVersionTest, SetDevToolsAttached) { |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
ASSERT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
@@ -532,7 +566,7 @@ TEST_F(ServiceWorkerVersionTest, SetDevToolsAttached) { |
EXPECT_FALSE(version_->start_time_.is_null()); |
EXPECT_TRUE(version_->skip_recording_startup_time_); |
- base::RunLoop().RunUntilIdle(); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
} |
@@ -541,9 +575,11 @@ TEST_F(ServiceWorkerVersionTest, StoppingBeforeDestruct) { |
RunningStateListener listener; |
version_->AddListener(&listener); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
- version_->StartWorker(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ version_->StartWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); |
@@ -556,12 +592,14 @@ TEST_F(ServiceWorkerVersionTest, StoppingBeforeDestruct) { |
TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
registration_->SetActiveVersion(version_); |
registration_->set_last_update_check(base::Time::Now()); |
- version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
- std::string()); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchPushEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
+ std::string()); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->stale_time_.is_null()); |
@@ -572,11 +610,13 @@ TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { |
TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
registration_->SetInstallingVersion(version_); |
registration_->set_last_update_check(GetYesterday()); |
- version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchInstallEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->stale_time_.is_null()); |
@@ -588,19 +628,23 @@ TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
// Starting the worker marks it as stale. |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
registration_->SetActiveVersion(version_); |
registration_->set_last_update_check(GetYesterday()); |
- version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
- std::string()); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchPushEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
+ std::string()); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_FALSE(version_->stale_time_.is_null()); |
EXPECT_FALSE(version_->update_timer_.IsRunning()); |
// Update is actually scheduled after the worker stops. |
- version_->StopWorker(CreateReceiverOnCurrentThread(&status)); |
- base::RunLoop().RunUntilIdle(); |
+ runner = new MessageLoopRunner; |
+ version_->StopWorker( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->stale_time_.is_null()); |
EXPECT_TRUE(version_->update_timer_.IsRunning()); |
@@ -611,12 +655,14 @@ TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { |
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
// Start a fresh worker. |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
registration_->SetActiveVersion(version_); |
registration_->set_last_update_check(base::Time::Now()); |
- version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), |
- std::string()); |
- base::RunLoop().RunUntilIdle(); |
+ version_->DispatchPushEvent( |
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure()), |
+ std::string()); |
+ runner->Run(); |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
EXPECT_TRUE(version_->stale_time_.is_null()); |