Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: content/browser/service_worker/service_worker_process_manager_unittest.cc

Issue 2569963002: MemoryCoordinator checks if ServiceWorker exists on the suspending process (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 const int kEmbeddedWorkerId2 = 200; 131 const int kEmbeddedWorkerId2 = 200;
132 const int kEmbeddedWorkerId3 = 300; 132 const int kEmbeddedWorkerId3 = 300;
133 GURL scope1("http://example.com/scope1"); 133 GURL scope1("http://example.com/scope1");
134 GURL scope2("http://example.com/scope2"); 134 GURL scope2("http://example.com/scope2");
135 135
136 // Set up mock renderer process hosts. 136 // Set up mock renderer process hosts.
137 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost()); 137 std::unique_ptr<MockRenderProcessHost> host1(CreateRenderProcessHost());
138 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost()); 138 std::unique_ptr<MockRenderProcessHost> host2(CreateRenderProcessHost());
139 process_manager_->AddProcessReferenceToPattern(scope1, host1->GetID()); 139 process_manager_->AddProcessReferenceToPattern(scope1, host1->GetID());
140 process_manager_->AddProcessReferenceToPattern(scope2, host2->GetID()); 140 process_manager_->AddProcessReferenceToPattern(scope2, host2->GetID());
141 ASSERT_EQ(0, host1->worker_ref_count()); 141 ASSERT_EQ(0u, host1->GetWorkerRefCount());
142 ASSERT_EQ(0, host2->worker_ref_count()); 142 ASSERT_EQ(0u, host2->GetWorkerRefCount());
143 143
144 std::map<int, ServiceWorkerProcessManager::ProcessInfo>& instance_info = 144 std::map<int, ServiceWorkerProcessManager::ProcessInfo>& instance_info =
145 process_manager_->instance_info_; 145 process_manager_->instance_info_;
146 146
147 // (1) Allocate a process to a worker. 147 // (1) Allocate a process to a worker.
148 base::RunLoop run_loop1; 148 base::RunLoop run_loop1;
149 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 149 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
150 int process_id = -10; 150 int process_id = -10;
151 bool is_new_process = true; 151 bool is_new_process = true;
152 process_manager_->AllocateWorkerProcess( 152 process_manager_->AllocateWorkerProcess(
153 kEmbeddedWorkerId1, scope1, script_url_, 153 kEmbeddedWorkerId1, scope1, script_url_,
154 true /* can_use_existing_process */, 154 true /* can_use_existing_process */,
155 base::Bind(&DidAllocateWorkerProcess, run_loop1.QuitClosure(), &status, 155 base::Bind(&DidAllocateWorkerProcess, run_loop1.QuitClosure(), &status,
156 &process_id, &is_new_process)); 156 &process_id, &is_new_process));
157 run_loop1.Run(); 157 run_loop1.Run();
158 158
159 // An existing process should be allocated to the worker. 159 // An existing process should be allocated to the worker.
160 EXPECT_EQ(SERVICE_WORKER_OK, status); 160 EXPECT_EQ(SERVICE_WORKER_OK, status);
161 EXPECT_EQ(host1->GetID(), process_id); 161 EXPECT_EQ(host1->GetID(), process_id);
162 EXPECT_FALSE(is_new_process); 162 EXPECT_FALSE(is_new_process);
163 EXPECT_EQ(1, host1->worker_ref_count()); 163 EXPECT_EQ(1u, host1->GetWorkerRefCount());
164 EXPECT_EQ(0, host2->worker_ref_count()); 164 EXPECT_EQ(0u, host2->GetWorkerRefCount());
165 EXPECT_EQ(1u, instance_info.size()); 165 EXPECT_EQ(1u, instance_info.size());
166 std::map<int, ServiceWorkerProcessManager::ProcessInfo>::iterator found = 166 std::map<int, ServiceWorkerProcessManager::ProcessInfo>::iterator found =
167 instance_info.find(kEmbeddedWorkerId1); 167 instance_info.find(kEmbeddedWorkerId1);
168 ASSERT_TRUE(found != instance_info.end()); 168 ASSERT_TRUE(found != instance_info.end());
169 EXPECT_EQ(host1->GetID(), found->second.process_id); 169 EXPECT_EQ(host1->GetID(), found->second.process_id);
170 170
171 // (2) Allocate a process to another worker whose scope is the same with the 171 // (2) Allocate a process to another worker whose scope is the same with the
172 // first worker. 172 // first worker.
173 base::RunLoop run_loop2; 173 base::RunLoop run_loop2;
174 status = SERVICE_WORKER_ERROR_MAX_VALUE; 174 status = SERVICE_WORKER_ERROR_MAX_VALUE;
175 process_id = -10; 175 process_id = -10;
176 is_new_process = true; 176 is_new_process = true;
177 process_manager_->AllocateWorkerProcess( 177 process_manager_->AllocateWorkerProcess(
178 kEmbeddedWorkerId2, scope1, script_url_, 178 kEmbeddedWorkerId2, scope1, script_url_,
179 true /* can_use_existing_process */, 179 true /* can_use_existing_process */,
180 base::Bind(&DidAllocateWorkerProcess, run_loop2.QuitClosure(), &status, 180 base::Bind(&DidAllocateWorkerProcess, run_loop2.QuitClosure(), &status,
181 &process_id, &is_new_process)); 181 &process_id, &is_new_process));
182 run_loop2.Run(); 182 run_loop2.Run();
183 183
184 // The same process should be allocated to the second worker. 184 // The same process should be allocated to the second worker.
185 EXPECT_EQ(SERVICE_WORKER_OK, status); 185 EXPECT_EQ(SERVICE_WORKER_OK, status);
186 EXPECT_EQ(host1->GetID(), process_id); 186 EXPECT_EQ(host1->GetID(), process_id);
187 EXPECT_FALSE(is_new_process); 187 EXPECT_FALSE(is_new_process);
188 EXPECT_EQ(2, host1->worker_ref_count()); 188 EXPECT_EQ(2u, host1->GetWorkerRefCount());
189 EXPECT_EQ(0, host2->worker_ref_count()); 189 EXPECT_EQ(0u, host2->GetWorkerRefCount());
190 EXPECT_EQ(2u, instance_info.size()); 190 EXPECT_EQ(2u, instance_info.size());
191 found = instance_info.find(kEmbeddedWorkerId2); 191 found = instance_info.find(kEmbeddedWorkerId2);
192 ASSERT_TRUE(found != instance_info.end()); 192 ASSERT_TRUE(found != instance_info.end());
193 EXPECT_EQ(host1->GetID(), found->second.process_id); 193 EXPECT_EQ(host1->GetID(), found->second.process_id);
194 194
195 // (3) Allocate a process to a third worker whose scope is different from 195 // (3) Allocate a process to a third worker whose scope is different from
196 // other workers. 196 // other workers.
197 base::RunLoop run_loop3; 197 base::RunLoop run_loop3;
198 status = SERVICE_WORKER_ERROR_MAX_VALUE; 198 status = SERVICE_WORKER_ERROR_MAX_VALUE;
199 process_id = -10; 199 process_id = -10;
200 is_new_process = true; 200 is_new_process = true;
201 process_manager_->AllocateWorkerProcess( 201 process_manager_->AllocateWorkerProcess(
202 kEmbeddedWorkerId3, scope2, script_url_, 202 kEmbeddedWorkerId3, scope2, script_url_,
203 true /* can_use_existing_process */, 203 true /* can_use_existing_process */,
204 base::Bind(&DidAllocateWorkerProcess, run_loop3.QuitClosure(), &status, 204 base::Bind(&DidAllocateWorkerProcess, run_loop3.QuitClosure(), &status,
205 &process_id, &is_new_process)); 205 &process_id, &is_new_process));
206 run_loop3.Run(); 206 run_loop3.Run();
207 207
208 // A different existing process should be allocated to the third worker. 208 // A different existing process should be allocated to the third worker.
209 EXPECT_EQ(SERVICE_WORKER_OK, status); 209 EXPECT_EQ(SERVICE_WORKER_OK, status);
210 EXPECT_EQ(host2->GetID(), process_id); 210 EXPECT_EQ(host2->GetID(), process_id);
211 EXPECT_FALSE(is_new_process); 211 EXPECT_FALSE(is_new_process);
212 EXPECT_EQ(2, host1->worker_ref_count()); 212 EXPECT_EQ(2u, host1->GetWorkerRefCount());
213 EXPECT_EQ(1, host2->worker_ref_count()); 213 EXPECT_EQ(1u, host2->GetWorkerRefCount());
214 EXPECT_EQ(3u, instance_info.size()); 214 EXPECT_EQ(3u, instance_info.size());
215 found = instance_info.find(kEmbeddedWorkerId3); 215 found = instance_info.find(kEmbeddedWorkerId3);
216 ASSERT_TRUE(found != instance_info.end()); 216 ASSERT_TRUE(found != instance_info.end());
217 EXPECT_EQ(host2->GetID(), found->second.process_id); 217 EXPECT_EQ(host2->GetID(), found->second.process_id);
218 218
219 // The instance map should be updated by process release. 219 // The instance map should be updated by process release.
220 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId3); 220 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId3);
221 EXPECT_EQ(2, host1->worker_ref_count()); 221 EXPECT_EQ(2u, host1->GetWorkerRefCount());
222 EXPECT_EQ(0, host2->worker_ref_count()); 222 EXPECT_EQ(0u, host2->GetWorkerRefCount());
223 EXPECT_EQ(2u, instance_info.size()); 223 EXPECT_EQ(2u, instance_info.size());
224 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId1)); 224 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId1));
225 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2)); 225 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2));
226 226
227 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId1); 227 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId1);
228 EXPECT_EQ(1, host1->worker_ref_count()); 228 EXPECT_EQ(1u, host1->GetWorkerRefCount());
229 EXPECT_EQ(0, host2->worker_ref_count()); 229 EXPECT_EQ(0u, host2->GetWorkerRefCount());
230 EXPECT_EQ(1u, instance_info.size()); 230 EXPECT_EQ(1u, instance_info.size());
231 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2)); 231 EXPECT_TRUE(base::ContainsKey(instance_info, kEmbeddedWorkerId2));
232 232
233 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId2); 233 process_manager_->ReleaseWorkerProcess(kEmbeddedWorkerId2);
234 EXPECT_EQ(0, host1->worker_ref_count()); 234 EXPECT_EQ(0u, host1->GetWorkerRefCount());
235 EXPECT_EQ(0, host2->worker_ref_count()); 235 EXPECT_EQ(0u, host2->GetWorkerRefCount());
236 EXPECT_TRUE(instance_info.empty()); 236 EXPECT_TRUE(instance_info.empty());
237 } 237 }
238 238
239 TEST_P(ServiceWorkerProcessManagerTestP, AllocateWorkerProcess_InShutdown) { 239 TEST_P(ServiceWorkerProcessManagerTestP, AllocateWorkerProcess_InShutdown) {
240 process_manager_->Shutdown(); 240 process_manager_->Shutdown();
241 ASSERT_TRUE(process_manager_->IsShutdown()); 241 ASSERT_TRUE(process_manager_->IsShutdown());
242 242
243 base::RunLoop run_loop; 243 base::RunLoop run_loop;
244 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 244 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
245 int process_id = -10; 245 int process_id = -10;
246 bool is_new_process = true; 246 bool is_new_process = true;
247 process_manager_->AllocateWorkerProcess( 247 process_manager_->AllocateWorkerProcess(
248 1, pattern_, script_url_, true /* can_use_existing_process */, 248 1, pattern_, script_url_, true /* can_use_existing_process */,
249 base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status, 249 base::Bind(&DidAllocateWorkerProcess, run_loop.QuitClosure(), &status,
250 &process_id, &is_new_process)); 250 &process_id, &is_new_process));
251 run_loop.Run(); 251 run_loop.Run();
252 252
253 // Allocating a process in shutdown should abort. 253 // Allocating a process in shutdown should abort.
254 EXPECT_EQ(SERVICE_WORKER_ERROR_ABORT, status); 254 EXPECT_EQ(SERVICE_WORKER_ERROR_ABORT, status);
255 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, process_id); 255 EXPECT_EQ(ChildProcessHost::kInvalidUniqueID, process_id);
256 EXPECT_FALSE(is_new_process); 256 EXPECT_FALSE(is_new_process);
257 EXPECT_TRUE(process_manager_->instance_info_.empty()); 257 EXPECT_TRUE(process_manager_->instance_info_.empty());
258 } 258 }
259 259
260 INSTANTIATE_TEST_CASE_P(ServiceWorkerProcessManagerTest, 260 INSTANTIATE_TEST_CASE_P(ServiceWorkerProcessManagerTest,
261 ServiceWorkerProcessManagerTestP, 261 ServiceWorkerProcessManagerTestP,
262 testing::Bool()); 262 testing::Bool());
263 263
264 } // namespace content 264 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698