Chromium Code Reviews| Index: content/browser/service_worker/service_worker_process_manager_unittest.cc |
| diff --git a/content/browser/service_worker/service_worker_process_manager_unittest.cc b/content/browser/service_worker/service_worker_process_manager_unittest.cc |
| index ee6ea1046a1bc44f46a63c58c5cb342cfb0ca059..8e276f62b68e5d0668b5c2dbf477e9a7d05c695d 100644 |
| --- a/content/browser/service_worker/service_worker_process_manager_unittest.cc |
| +++ b/content/browser/service_worker/service_worker_process_manager_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include "base/macros.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/run_loop.h" |
| +#include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/service_worker/service_worker_test_utils.h" |
| #include "content/common/service_worker/embedded_worker_settings.h" |
| #include "content/public/common/child_process_host.h" |
| @@ -48,11 +49,16 @@ class ServiceWorkerProcessManagerTest : public testing::Test { |
| new ServiceWorkerProcessManager(browser_context_.get())); |
| pattern_ = GURL("http://www.example.com/"); |
| script_url_ = GURL("http://www.example.com/sw.js"); |
| + render_process_host_factory_.reset(new MockRenderProcessHostFactory()); |
| + RenderProcessHostImpl::set_render_process_host_factory( |
| + render_process_host_factory_.get()); |
| } |
| void TearDown() override { |
| process_manager_->Shutdown(); |
| process_manager_.reset(); |
| + RenderProcessHostImpl::set_render_process_host_factory(nullptr); |
| + render_process_host_factory_.reset(); |
| } |
| std::unique_ptr<MockRenderProcessHost> CreateRenderProcessHost() { |
| @@ -66,6 +72,7 @@ class ServiceWorkerProcessManagerTest : public testing::Test { |
| GURL script_url_; |
| private: |
| + std::unique_ptr<MockRenderProcessHostFactory> render_process_host_factory_; |
| content::TestBrowserThreadBundle thread_bundle_; |
| DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProcessManagerTest); |
| }; |
| @@ -233,6 +240,97 @@ TEST_F(ServiceWorkerProcessManagerTest, |
| EXPECT_TRUE(instance_info.empty()); |
| } |
| +TEST_F(ServiceWorkerProcessManagerTest, |
| + AllocateWorkerProcess_WithProcessReuse) { |
| + const int kEmbeddedWorkerId = 100; |
| + const GURL kSiteUrl = GURL("http://example.com"); |
| + |
| + // Create a process that is hosting a frame with URL |patter_|. |
|
falken
2017/06/07 00:12:22
|pattern_|
|
| + std::unique_ptr<MockRenderProcessHost> host(CreateRenderProcessHost()); |
| + RenderProcessHostImpl::AddFrameWithSite(browser_context_.get(), host.get(), |
| + kSiteUrl); |
| + |
| + std::map<int, ServiceWorkerProcessManager::ProcessInfo>& instance_info = |
| + process_manager_->instance_info_; |
| + EXPECT_TRUE(instance_info.empty()); |
| + |
| + // Allocate a process to a worker, when process reuse is authorized. |
| + base::RunLoop run_loop; |
| + ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
| + int process_id = -10; |
| + bool is_new_process = false; |
| + process_manager_->AllocateWorkerProcess( |
| + kEmbeddedWorkerId, pattern_, script_url_, |
| + true /* can_use_existing_process */, |
| + base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status, |
| + &process_id, &is_new_process)); |
| + run_loop.Run(); |
| + |
| + // An existing process should be allocated to the worker. |
| + EXPECT_EQ(SERVICE_WORKER_OK, status); |
| + EXPECT_EQ(host->GetID(), process_id); |
| + EXPECT_TRUE(is_new_process); |
| + EXPECT_EQ(1u, host->GetWorkerRefCount()); |
| + EXPECT_EQ(1u, instance_info.size()); |
| + std::map<int, ServiceWorkerProcessManager::ProcessInfo>::iterator found = |
| + instance_info.find(kEmbeddedWorkerId); |
| + ASSERT_TRUE(found != instance_info.end()); |
| + EXPECT_EQ(host->GetID(), found->second.process_id); |
| + |
| + // Release the process. |
| + process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId); |
| + EXPECT_EQ(0u, host->GetWorkerRefCount()); |
| + EXPECT_TRUE(instance_info.empty()); |
| + |
| + RenderProcessHostImpl::RemoveFrameWithSite(browser_context_.get(), host.get(), |
| + kSiteUrl); |
| +} |
| + |
| +TEST_F(ServiceWorkerProcessManagerTest, |
| + AllocateWorkerProcess_WithoutProcessReuse) { |
| + const int kEmbeddedWorkerId = 100; |
| + const GURL kSiteUrl = GURL("http://example.com"); |
| + |
| + // Create a process that is hosting a frame with URL |patter_|. |
|
falken
2017/06/07 00:12:22
ditto
|
| + std::unique_ptr<MockRenderProcessHost> host(CreateRenderProcessHost()); |
| + RenderProcessHostImpl::AddFrameWithSite(browser_context_.get(), host.get(), |
| + kSiteUrl); |
| + |
| + std::map<int, ServiceWorkerProcessManager::ProcessInfo>& instance_info = |
| + process_manager_->instance_info_; |
| + EXPECT_TRUE(instance_info.empty()); |
| + |
| + // Allocate a process to a worker, when process reuse is authorized. |
| + base::RunLoop run_loop; |
| + ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
| + int process_id = -10; |
| + bool is_new_process = false; |
| + process_manager_->AllocateWorkerProcess( |
| + kEmbeddedWorkerId, pattern_, script_url_, |
| + false /* can_use_existing_process */, |
| + base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status, |
| + &process_id, &is_new_process)); |
| + run_loop.Run(); |
| + |
| + // An new process should be allocated to the worker. |
|
falken
2017/06/07 00:12:22
nit: A new
|
| + EXPECT_EQ(SERVICE_WORKER_OK, status); |
| + EXPECT_NE(host->GetID(), process_id); |
| + EXPECT_TRUE(is_new_process); |
| + EXPECT_EQ(0u, host->GetWorkerRefCount()); |
| + EXPECT_EQ(1u, instance_info.size()); |
| + std::map<int, ServiceWorkerProcessManager::ProcessInfo>::iterator found = |
| + instance_info.find(kEmbeddedWorkerId); |
| + ASSERT_TRUE(found != instance_info.end()); |
| + EXPECT_NE(host->GetID(), found->second.process_id); |
| + |
| + // Release the process. |
| + process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId); |
| + EXPECT_TRUE(instance_info.empty()); |
| + |
| + RenderProcessHostImpl::RemoveFrameWithSite(browser_context_.get(), host.get(), |
| + kSiteUrl); |
| +} |
| + |
| TEST_F(ServiceWorkerProcessManagerTest, AllocateWorkerProcess_InShutdown) { |
| process_manager_->Shutdown(); |
| ASSERT_TRUE(process_manager_->IsShutdown()); |