Chromium Code Reviews| Index: content/browser/service_worker/embedded_worker_instance_unittest.cc |
| diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc |
| index f2df6b57612e8242b411fa28ae93d1757f9ebd2b..09dfb22b9d35162918b4dbe5403e23683cc6c181 100644 |
| --- a/content/browser/service_worker/embedded_worker_instance_unittest.cc |
| +++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include <utility> |
| #include <vector> |
| +#include "base/command_line.h" |
| #include "base/macros.h" |
| #include "base/run_loop.h" |
| #include "base/stl_util.h" |
| @@ -16,12 +17,19 @@ |
| #include "content/browser/service_worker/embedded_worker_test_helper.h" |
| #include "content/browser/service_worker/service_worker_context_core.h" |
| #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| +#include "content/common/service_worker/embedded_worker.mojom.h" |
| #include "content/common/service_worker/embedded_worker_messages.h" |
| #include "content/public/common/child_process_host.h" |
| +#include "content/public/common/content_switches.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| +#include "mojo/public/cpp/bindings/strong_binding.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| +using ::testing::Eq; |
| +using ::testing::Field; |
| +using ::testing::Pointee; |
| + |
| namespace content { |
| namespace { |
| @@ -44,6 +52,11 @@ CreateStartParams(int version_id, const GURL& scope, const GURL& script_url) { |
| return params; |
| } |
| +bool IsMojoForServiceWorkerEnabled() { |
| + return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kMojoServiceWorker); |
| +} |
| + |
| } // namespace |
| class EmbeddedWorkerInstanceTest : public testing::Test, |
| @@ -122,6 +135,21 @@ class EmbeddedWorkerInstanceTest : public testing::Test, |
| 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(); |
| + } |
| +}; |
| + |
| // A helper to simulate the start worker sequence is stalled in a worker |
| // process. |
| class StalledInStartWorkerHelper : public EmbeddedWorkerTestHelper { |
| @@ -207,6 +235,69 @@ TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) { |
| EmbeddedWorkerMsg_StopWorker::ID)); |
| } |
| +TEST_F(MojoEmbeddedWorkerInstanceTest, StartAndStop) { |
| + using mojom::EmbeddedWorkerStartWorkerParams; |
| + |
| + ASSERT_TRUE(IsMojoForServiceWorkerEnabled()); |
| + |
| + 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()); |
| + |
| + // Check if StartWorker will be called via mojo 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(AllOf( |
| + Pointee( |
| + Field(&EmbeddedWorkerStartWorkerParams::service_worker_version_id, |
| + Eq(service_worker_version_id))), |
| + Pointee(Field(&EmbeddedWorkerStartWorkerParams::scope, Eq(pattern))), |
| + Pointee( |
| + Field(&EmbeddedWorkerStartWorkerParams::script_url, Eq(url)))))) |
| + .Times(1); |
|
falken
2016/09/07 05:01:42
Sorry I got to this late. gmock is fairly discoura
shimazu
2016/09/12 06:28:19
Oops, I didn't know that...
The only use case of g
|
| + |
| + // 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()); |
| + |
| + // 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) { |