Index: content/browser/service_worker/embedded_worker_instance_mojo_unittest.cc |
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_mojo_unittest.cc |
similarity index 86% |
copy from content/browser/service_worker/embedded_worker_instance_unittest.cc |
copy to content/browser/service_worker/embedded_worker_instance_mojo_unittest.cc |
index 09dfb22b9d35162918b4dbe5403e23683cc6c181..02ab1d33134879dfb675fe340e43380e0698edbe 100644 |
--- a/content/browser/service_worker/embedded_worker_instance_unittest.cc |
+++ b/content/browser/service_worker/embedded_worker_instance_mojo_unittest.cc |
@@ -26,14 +26,19 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using ::testing::_; |
using ::testing::Eq; |
using ::testing::Field; |
+using ::testing::Invoke; |
using ::testing::Pointee; |
+using ::testing::Return; |
namespace content { |
namespace { |
+void NoOpStatusCallback(ServiceWorkerStatusCode code) {} |
+ |
void SaveStatusAndCall(ServiceWorkerStatusCode* out, |
const base::Closure& callback, |
ServiceWorkerStatusCode status) { |
@@ -59,10 +64,10 @@ bool IsMojoForServiceWorkerEnabled() { |
} // namespace |
-class EmbeddedWorkerInstanceTest : public testing::Test, |
- public EmbeddedWorkerInstance::Listener { |
+class MojoEmbeddedWorkerInstanceTest : public testing::Test, |
horo
2016/09/05 08:05:57
You can use TEST_P instead of duplicating tests.
S
shimazu
2016/09/06 08:53:59
I didn't know that. Tried it.
|
+ public EmbeddedWorkerInstance::Listener { |
protected: |
- EmbeddedWorkerInstanceTest() |
+ MojoEmbeddedWorkerInstanceTest() |
: thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} |
enum EventType { |
@@ -100,13 +105,16 @@ class EmbeddedWorkerInstanceTest : public testing::Test, |
bool OnMessageReceived(const IPC::Message& message) override { return false; } |
void SetUp() override { |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kMojoServiceWorker); |
helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath())); |
} |
void TearDown() override { helper_.reset(); } |
ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker, |
- int id, const GURL& pattern, |
+ int id, |
+ const GURL& pattern, |
const GURL& url) { |
ServiceWorkerStatusCode status; |
base::RunLoop run_loop; |
@@ -127,27 +135,18 @@ class EmbeddedWorkerInstanceTest : public testing::Test, |
IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); } |
- TestBrowserThreadBundle thread_bundle_; |
- std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
- std::vector<EventLog> events_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); |
-}; |
- |
-class MojoEmbeddedWorkerInstanceTest : public EmbeddedWorkerInstanceTest { |
- protected: |
- void SetUp() override { |
- base::CommandLine::ForCurrentProcess()->AppendSwitch( |
- switches::kMojoServiceWorker); |
- EmbeddedWorkerInstanceTest::SetUp(); |
- } |
- |
std::vector<std::unique_ptr< |
EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient>>* |
mock_instance_clients() { |
return helper_->mock_instance_clients(); |
} |
+ |
+ TestBrowserThreadBundle thread_bundle_; |
+ std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
+ std::vector<EventLog> events_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MojoEmbeddedWorkerInstanceTest); |
}; |
// A helper to simulate the start worker sequence is stalled in a worker |
@@ -179,62 +178,6 @@ class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper { |
bool force_stall_in_start_ = true; |
}; |
-class FailToSendIPCHelper : public EmbeddedWorkerTestHelper { |
- public: |
- FailToSendIPCHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} |
- ~FailToSendIPCHelper() override {} |
- |
- bool Send(IPC::Message* message) override { |
- delete message; |
- return false; |
- } |
-}; |
- |
-TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) { |
- std::unique_ptr<EmbeddedWorkerInstance> worker = |
- embedded_worker_registry()->CreateWorker(); |
- EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
- |
- const int64_t service_worker_version_id = 55L; |
- const GURL pattern("http://example.com/"); |
- const GURL url("http://example.com/worker.js"); |
- |
- // Simulate adding one process to the pattern. |
- helper_->SimulateAddProcessToPattern(pattern, |
- helper_->mock_render_process_id()); |
- |
- // Start should succeed. |
- ServiceWorkerStatusCode status; |
- base::RunLoop run_loop; |
- std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params = |
- CreateStartParams(service_worker_version_id, pattern, url); |
- worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
- run_loop.QuitClosure())); |
- EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
- run_loop.Run(); |
- EXPECT_EQ(SERVICE_WORKER_OK, status); |
- |
- // The 'WorkerStarted' message should have been sent by |
- // EmbeddedWorkerTestHelper. |
- EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); |
- EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); |
- |
- // Stop the worker. |
- EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop()); |
- EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status()); |
- base::RunLoop().RunUntilIdle(); |
- |
- // The 'WorkerStopped' message should have been sent by |
- // EmbeddedWorkerTestHelper. |
- EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
- |
- // Verify that we've sent two messages to start and terminate the worker. |
- ASSERT_TRUE( |
- ipc_sink()->GetUniqueMessageMatching(EmbeddedWorkerMsg_StartWorker::ID)); |
- ASSERT_TRUE(ipc_sink()->GetUniqueMessageMatching( |
- EmbeddedWorkerMsg_StopWorker::ID)); |
-} |
- |
TEST_F(MojoEmbeddedWorkerInstanceTest, StartAndStop) { |
using mojom::EmbeddedWorkerStartWorkerParams; |
@@ -252,7 +195,7 @@ TEST_F(MojoEmbeddedWorkerInstanceTest, StartAndStop) { |
helper_->SimulateAddProcessToPattern(pattern, |
helper_->mock_render_process_id()); |
- // Check if StartWorker will be called via mojo IPC. |
+ // Check if StartWorker/StopWorker will be called via mojo IPC. |
helper_->PrepareMockInstanceClients(1); |
ASSERT_EQ(mock_instance_clients()->size(), 1UL); |
EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient* instance_client = |
@@ -267,6 +210,7 @@ TEST_F(MojoEmbeddedWorkerInstanceTest, StartAndStop) { |
Pointee( |
Field(&EmbeddedWorkerStartWorkerParams::script_url, Eq(url)))))) |
.Times(1); |
+ EXPECT_CALL(*instance_client, MockStopWorker(_)).Times(1); |
// Start should succeed. |
ServiceWorkerStatusCode status; |
@@ -289,18 +233,16 @@ TEST_F(MojoEmbeddedWorkerInstanceTest, StartAndStop) { |
EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status()); |
base::RunLoop().RunUntilIdle(); |
- // The 'WorkerStopped' message should have been sent by |
+ // Callback passed by mojo IPC should have been called by |
// EmbeddedWorkerTestHelper. |
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
- |
- // Ckeck if StopWorker has been sent via chromium IPC. |
- ASSERT_TRUE( |
- ipc_sink()->GetUniqueMessageMatching(EmbeddedWorkerMsg_StopWorker::ID)); |
} |
// Test that a worker that failed twice will use a new render process |
// on the next attempt. |
-TEST_F(EmbeddedWorkerInstanceTest, ForceNewProcess) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, ForceNewProcess) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
std::unique_ptr<EmbeddedWorkerInstance> worker = |
embedded_worker_registry()->CreateWorker(); |
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
@@ -364,7 +306,9 @@ TEST_F(EmbeddedWorkerInstanceTest, ForceNewProcess) { |
} |
} |
-TEST_F(EmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
std::unique_ptr<EmbeddedWorkerInstance> worker = |
embedded_worker_registry()->CreateWorker(); |
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
@@ -411,7 +355,9 @@ TEST_F(EmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) { |
// Test that the removal of a worker from the registry doesn't remove |
// other workers in the same process. |
-TEST_F(EmbeddedWorkerInstanceTest, RemoveWorkerInSharedProcess) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, RemoveWorkerInSharedProcess) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
std::unique_ptr<EmbeddedWorkerInstance> worker1 = |
embedded_worker_registry()->CreateWorker(); |
std::unique_ptr<EmbeddedWorkerInstance> worker2 = |
@@ -466,7 +412,9 @@ TEST_F(EmbeddedWorkerInstanceTest, RemoveWorkerInSharedProcess) { |
worker2->Stop(); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, DetachDuringProcessAllocation) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, DetachDuringProcessAllocation) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL scope("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -497,7 +445,9 @@ TEST_F(EmbeddedWorkerInstanceTest, DetachDuringProcessAllocation) { |
EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, DetachAfterSendingStartWorkerMessage) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, DetachAfterSendingStartWorkerMessage) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL scope("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -536,7 +486,9 @@ TEST_F(EmbeddedWorkerInstanceTest, DetachAfterSendingStartWorkerMessage) { |
EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, StopDuringProcessAllocation) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, StopDuringProcessAllocation) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL scope("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -565,7 +517,6 @@ TEST_F(EmbeddedWorkerInstanceTest, StopDuringProcessAllocation) { |
// "PROCESS_ALLOCATED" event should not be recorded. |
ASSERT_EQ(1u, events_.size()); |
EXPECT_EQ(DETACHED, events_[0].type); |
- EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status); |
events_.clear(); |
// Restart the worker. |
@@ -586,7 +537,9 @@ TEST_F(EmbeddedWorkerInstanceTest, StopDuringProcessAllocation) { |
worker->Stop(); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, StopDuringPausedAfterDownload) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, StopDuringPausedAfterDownload) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL scope("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -617,7 +570,9 @@ TEST_F(EmbeddedWorkerInstanceTest, StopDuringPausedAfterDownload) { |
EmbeddedWorkerMsg_ResumeAfterDownload::ID)); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL scope("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -678,7 +633,9 @@ TEST_F(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) { |
worker->Stop(); |
} |
-TEST_F(EmbeddedWorkerInstanceTest, Detach) { |
+TEST_F(MojoEmbeddedWorkerInstanceTest, Detach) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
const int64_t version_id = 55L; |
const GURL pattern("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
@@ -709,35 +666,74 @@ TEST_F(EmbeddedWorkerInstanceTest, Detach) { |
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); |
} |
-// Test for when sending the start IPC failed. |
-TEST_F(EmbeddedWorkerInstanceTest, FailToSendStartIPC) { |
- helper_.reset(new FailToSendIPCHelper()); |
+// Test for when sending the start IPC failed: sudden shutdown of remote process |
+TEST_F(MojoEmbeddedWorkerInstanceTest, RemoveRemoteInterface) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
const int64_t version_id = 55L; |
const GURL pattern("http://example.com/"); |
const GURL url("http://example.com/worker.js"); |
+ // Let StartWorker fail; binding is discarded in the middle of IPC |
+ helper_->PrepareMockInstanceClients(1); |
+ ASSERT_EQ(mock_instance_clients()->size(), 1UL); |
+ EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient* instance_client = |
+ mock_instance_clients()->at(0).get(); |
+ EXPECT_CALL(*instance_client, MockStartWorker(_)) |
+ .WillOnce(WithoutArgs( |
+ Invoke([this]() { helper_->mock_instance_clients()->clear(); }))); |
+ |
std::unique_ptr<EmbeddedWorkerInstance> worker = |
embedded_worker_registry()->CreateWorker(); |
helper_->SimulateAddProcessToPattern(pattern, |
helper_->mock_render_process_id()); |
- ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
worker->AddListener(this); |
// Attempt to start the worker. |
- base::RunLoop run_loop; |
std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( |
CreateStartParams(version_id, pattern, url)); |
- worker->Start(std::move(params), base::Bind(&SaveStatusAndCall, &status, |
- run_loop.QuitClosure())); |
- run_loop.Run(); |
+ worker->Start(std::move(params), base::Bind(&NoOpStatusCallback)); |
+ base::RunLoop().RunUntilIdle(); |
- // The callback should have run, and we should have got an OnStopped message. |
- EXPECT_EQ(SERVICE_WORKER_ERROR_IPC_FAILED, status); |
- ASSERT_EQ(2u, events_.size()); |
+ // Worker should handle the sudden shutdown as detach. |
+ ASSERT_EQ(3u, events_.size()); |
EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
- EXPECT_EQ(STOPPED, events_[1].type); |
- EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[1].status); |
+ EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
+ EXPECT_EQ(DETACHED, events_[2].type); |
+ EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); |
+} |
+ |
+// Test for when sending the start IPC failed: connection failure |
+TEST_F(MojoEmbeddedWorkerInstanceTest, FailToSendStartIPC) { |
+ ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
+ |
+ const int64_t version_id = 55L; |
+ const GURL pattern("http://example.com/"); |
+ const GURL url("http://example.com/worker.js"); |
+ |
+ // Let StartWorker fail; mojo IPC fails to connect to a remote interface. |
+ helper_->PrepareMockInstanceClients(1); |
+ ASSERT_EQ(mock_instance_clients()->size(), 1UL); |
+ mock_instance_clients()->at(0).reset(); |
+ |
+ std::unique_ptr<EmbeddedWorkerInstance> worker = |
+ embedded_worker_registry()->CreateWorker(); |
+ helper_->SimulateAddProcessToPattern(pattern, |
+ helper_->mock_render_process_id()); |
+ worker->AddListener(this); |
+ |
+ // Attempt to start the worker. |
+ std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( |
+ CreateStartParams(version_id, pattern, url)); |
+ worker->Start(std::move(params), base::Bind(&NoOpStatusCallback)); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Worker should handle the failure of binding as detach. |
+ ASSERT_EQ(3u, events_.size()); |
+ EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); |
+ EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); |
+ EXPECT_EQ(DETACHED, events_[2].type); |
+ EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[2].status); |
} |
} // namespace content |