| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_process_manager.h" | 5 #include "content/browser/service_worker/service_worker_process_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 std::unique_ptr<TestBrowserContext> browser_context_; | 63 std::unique_ptr<TestBrowserContext> browser_context_; |
| 64 std::unique_ptr<ServiceWorkerProcessManager> process_manager_; | 64 std::unique_ptr<ServiceWorkerProcessManager> process_manager_; |
| 65 GURL pattern_; | 65 GURL pattern_; |
| 66 GURL script_url_; | 66 GURL script_url_; |
| 67 | 67 |
| 68 private: | 68 private: |
| 69 content::TestBrowserThreadBundle thread_bundle_; | 69 content::TestBrowserThreadBundle thread_bundle_; |
| 70 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProcessManagerTest); | 70 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProcessManagerTest); |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 class ServiceWorkerProcessManagerTestP | 73 TEST_F(ServiceWorkerProcessManagerTest, SortProcess) { |
| 74 : public MojoServiceWorkerTestP<ServiceWorkerProcessManagerTest> {}; | |
| 75 | |
| 76 TEST_P(ServiceWorkerProcessManagerTestP, SortProcess) { | |
| 77 // Process 1 has 2 refs, 2 has 3 refs and 3 has 1 ref. | 74 // Process 1 has 2 refs, 2 has 3 refs and 3 has 1 ref. |
| 78 process_manager_->AddProcessReferenceToPattern(pattern_, 1); | 75 process_manager_->AddProcessReferenceToPattern(pattern_, 1); |
| 79 process_manager_->AddProcessReferenceToPattern(pattern_, 1); | 76 process_manager_->AddProcessReferenceToPattern(pattern_, 1); |
| 80 process_manager_->AddProcessReferenceToPattern(pattern_, 2); | 77 process_manager_->AddProcessReferenceToPattern(pattern_, 2); |
| 81 process_manager_->AddProcessReferenceToPattern(pattern_, 2); | 78 process_manager_->AddProcessReferenceToPattern(pattern_, 2); |
| 82 process_manager_->AddProcessReferenceToPattern(pattern_, 2); | 79 process_manager_->AddProcessReferenceToPattern(pattern_, 2); |
| 83 process_manager_->AddProcessReferenceToPattern(pattern_, 3); | 80 process_manager_->AddProcessReferenceToPattern(pattern_, 3); |
| 84 | 81 |
| 85 // Process 2 has the biggest # of references and it should be chosen. | 82 // Process 2 has the biggest # of references and it should be chosen. |
| 86 EXPECT_THAT(process_manager_->SortProcessesForPattern(pattern_), | 83 EXPECT_THAT(process_manager_->SortProcessesForPattern(pattern_), |
| 87 testing::ElementsAre(2, 1, 3)); | 84 testing::ElementsAre(2, 1, 3)); |
| 88 | 85 |
| 89 process_manager_->RemoveProcessReferenceFromPattern(pattern_, 1); | 86 process_manager_->RemoveProcessReferenceFromPattern(pattern_, 1); |
| 90 process_manager_->RemoveProcessReferenceFromPattern(pattern_, 1); | 87 process_manager_->RemoveProcessReferenceFromPattern(pattern_, 1); |
| 91 // Scores for each process: 2 : 3, 3 : 1, process 1 is removed. | 88 // Scores for each process: 2 : 3, 3 : 1, process 1 is removed. |
| 92 EXPECT_THAT(process_manager_->SortProcessesForPattern(pattern_), | 89 EXPECT_THAT(process_manager_->SortProcessesForPattern(pattern_), |
| 93 testing::ElementsAre(2, 3)); | 90 testing::ElementsAre(2, 3)); |
| 94 } | 91 } |
| 95 | 92 |
| 96 TEST_P(ServiceWorkerProcessManagerTestP, FindAvailableProcess) { | 93 TEST_F(ServiceWorkerProcessManagerTest, FindAvailableProcess) { |
| 97 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost()); | 94 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost()); |
| 98 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost()); | 95 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost()); |
| 99 std::unique_ptr<MockRenderProcessHost> host3(CreateRenderProcessHost()); | 96 std::unique_ptr<MockRenderProcessHost> host3(CreateRenderProcessHost()); |
| 100 | 97 |
| 101 // Process 1 has 2 refs, 2 has 3 refs and 3 has 1 ref. | 98 // Process 1 has 2 refs, 2 has 3 refs and 3 has 1 ref. |
| 102 process_manager_->AddProcessReferenceToPattern(pattern_, host1->GetID()); | 99 process_manager_->AddProcessReferenceToPattern(pattern_, host1->GetID()); |
| 103 process_manager_->AddProcessReferenceToPattern(pattern_, host1->GetID()); | 100 process_manager_->AddProcessReferenceToPattern(pattern_, host1->GetID()); |
| 104 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); | 101 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); |
| 105 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); | 102 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); |
| 106 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); | 103 process_manager_->AddProcessReferenceToPattern(pattern_, host2->GetID()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 118 // refcount should be chosen. | 115 // refcount should be chosen. |
| 119 host1->set_is_process_backgrounded(true); | 116 host1->set_is_process_backgrounded(true); |
| 120 host3->set_is_process_backgrounded(true); | 117 host3->set_is_process_backgrounded(true); |
| 121 EXPECT_EQ(host2->GetID(), process_manager_->FindAvailableProcess(pattern_)); | 118 EXPECT_EQ(host2->GetID(), process_manager_->FindAvailableProcess(pattern_)); |
| 122 | 119 |
| 123 // Process 3 should be chosen because it is the only foreground process. | 120 // Process 3 should be chosen because it is the only foreground process. |
| 124 host3->set_is_process_backgrounded(false); | 121 host3->set_is_process_backgrounded(false); |
| 125 EXPECT_EQ(host3->GetID(), process_manager_->FindAvailableProcess(pattern_)); | 122 EXPECT_EQ(host3->GetID(), process_manager_->FindAvailableProcess(pattern_)); |
| 126 } | 123 } |
| 127 | 124 |
| 128 TEST_P(ServiceWorkerProcessManagerTestP, | 125 TEST_F(ServiceWorkerProcessManagerTest, |
| 129 AllocateWorkerProcess_FindAvailableProcess) { | 126 AllocateWorkerProcess_FindAvailableProcess) { |
| 130 const int kEmbeddedWorkerId1 = 100; | 127 const int kEmbeddedWorkerId1 = 100; |
| 131 const int kEmbeddedWorkerId2 = 200; | 128 const int kEmbeddedWorkerId2 = 200; |
| 132 const int kEmbeddedWorkerId3 = 300; | 129 const int kEmbeddedWorkerId3 = 300; |
| 133 GURL scope1("http://example.com/scope1"); | 130 GURL scope1("http://example.com/scope1"); |
| 134 GURL scope2("http://example.com/scope2"); | 131 GURL scope2("http://example.com/scope2"); |
| 135 | 132 |
| 136 // Set up mock renderer process hosts. | 133 // Set up mock renderer process hosts. |
| 137 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost()); | 134 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost()); |
| 138 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost()); | 135 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost()); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 EXPECT_EQ(0u, host2->GetWorkerRefCount()); | 226 EXPECT_EQ(0u, host2->GetWorkerRefCount()); |
| 230 EXPECT_EQ(1u, instance_info.size()); | 227 EXPECT_EQ(1u, instance_info.size()); |
| 231 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2)); | 228 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2)); |
| 232 | 229 |
| 233 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId2); | 230 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId2); |
| 234 EXPECT_EQ(0u, host1->GetWorkerRefCount()); | 231 EXPECT_EQ(0u, host1->GetWorkerRefCount()); |
| 235 EXPECT_EQ(0u, host2->GetWorkerRefCount()); | 232 EXPECT_EQ(0u, host2->GetWorkerRefCount()); |
| 236 EXPECT_TRUE(instance_info.empty()); | 233 EXPECT_TRUE(instance_info.empty()); |
| 237 } | 234 } |
| 238 | 235 |
| 239 TEST_P(ServiceWorkerProcessManagerTestP, AllocateWorkerProcess_InShutdown) { | 236 TEST_F(ServiceWorkerProcessManagerTest, AllocateWorkerProcess_InShutdown) { |
| 240 process_manager_->Shutdown(); | 237 process_manager_->Shutdown(); |
| 241 ASSERT_TRUE(process_manager_->IsShutdown()); | 238 ASSERT_TRUE(process_manager_->IsShutdown()); |
| 242 | 239 |
| 243 base::RunLoop run_loop; | 240 base::RunLoop run_loop; |
| 244 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | 241 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
| 245 int process_id = -10; | 242 int process_id = -10; |
| 246 bool is_new_process = true; | 243 bool is_new_process = true; |
| 247 process_manager_->AllocateWorkerProcess( | 244 process_manager_->AllocateWorkerProcess( |
| 248 1, pattern_, script_url_, true /* can_use_existing_process */, | 245 1, pattern_, script_url_, true /* can_use_existing_process */, |
| 249 base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status, | 246 base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status, |
| 250 &process_id, &is_new_process)); | 247 &process_id, &is_new_process)); |
| 251 run_loop.Run(); | 248 run_loop.Run(); |
| 252 | 249 |
| 253 // Allocating a process in shutdown should abort. | 250 // Allocating a process in shutdown should abort. |
| 254 EXPECT_EQ(SERVICE_WORKER_ERROR_ABORT, status); | 251 EXPECT_EQ(SERVICE_WORKER_ERROR_ABORT, status); |
| 255 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, process_id); | 252 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, process_id); |
| 256 EXPECT_FALSE(is_new_process); | 253 EXPECT_FALSE(is_new_process); |
| 257 EXPECT_TRUE(process_manager_->instance_info_.empty()); | 254 EXPECT_TRUE(process_manager_->instance_info_.empty()); |
| 258 } | 255 } |
| 259 | 256 |
| 260 INSTANTIATE_TEST_CASE_P(ServiceWorkerProcessManagerTest, | |
| 261 ServiceWorkerProcessManagerTestP, | |
| 262 testing::Bool()); | |
| 263 | |
| 264 } // namespace content | 257 } // namespace content |
| OLD | NEW |