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