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

Side by Side Diff: chrome/browser/conflicts/module_database_win_unittest.cc

Issue 2576843002: [win] Create ModuleDatabase and ModuleEventSinkImpl. (Closed)
Patch Set: Moar comments, fix typos. 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/conflicts/module_database_win.h"
6
7 #include <algorithm>
8
9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "base/threading/simple_thread.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace {
18
19 // A simple mechanism for running a single task on a separate thread.
20 class SingleTaskRunner : public base::SimpleThread {
21 public:
22 explicit SingleTaskRunner(const base::Closure& task)
grt (UTC plus 2) 2016/12/22 14:19:06 pass by value and std::move below?
chrisha 2017/01/03 21:34:48 Done.
23 : base::SimpleThread("SingleTaskRunner"), task_(task) {}
24
25 // Runs the provided task and exits.
26 void Run() override { task_.Run(); }
27
28 private:
29 base::Closure task_;
30 DISALLOW_COPY_AND_ASSIGN(SingleTaskRunner);
31 };
32
33 // Launches a thread and runs a single task on it.
34 void RunTask(const base::Closure& task) {
grt (UTC plus 2) 2016/12/22 14:19:06 pass by value and std::move below?
chrisha 2017/01/03 21:34:48 Done.
35 SingleTaskRunner task_runner(task);
36 task_runner.Start();
37 task_runner.Join();
38 }
39
40 const uint32_t kPid1 = 1234u;
grt (UTC plus 2) 2016/12/22 14:19:06 nit: constexpr all of these
chrisha 2017/01/03 21:34:48 Done.
41 const uint32_t kPid2 = 2345u;
42
43 const uint64_t kCreateTime1 = 1234u;
44 const uint64_t kCreateTime2 = 2345u;
45
46 const wchar_t kDll1[] = L"dummy.dll";
47 const wchar_t kDll2[] = L"foo.dll";
48
49 const size_t kSize1 = 100 * 4096;
50 const size_t kSize2 = 20 * 4096;
51
52 const uint32_t kTime1 = 0xDEADBEEF;
53 const uint32_t kTime2 = 0xBAADF00D;
54
55 uintptr_t kGoodAddress1 = 0x04000000u;
56 uintptr_t kGoodAddress2 = 0x05000000u;
57
58 } // namespace
59
60 class TestModuleDatabase : ModuleDatabase {
61 public:
62 // Types.
63 using ModuleDatabase::ModuleId;
64 using ModuleDatabase::ModuleLoadAddresses;
65
66 // Constants.
67 using ModuleDatabase::kInvalidIndex;
68
69 // Functions.
70 using ModuleDatabase::FindLoadAddressIndexById;
71 using ModuleDatabase::FindLoadAddressIndexByAddress;
72 using ModuleDatabase::InsertLoadAddress;
73 using ModuleDatabase::RemoveLoadAddressById;
74 using ModuleDatabase::RemoveLoadAddressByIndex;
75 };
76
77 class ModuleDatabaseTest : public testing::Test {
78 protected:
79 ModuleDatabaseTest()
80 : dll1_(kDll1),
81 dll2_(kDll2),
82 message_loop_(base::MakeUnique<base::MessageLoop>()),
83 module_database_(
84 base::MakeUnique<ModuleDatabase>(message_loop_->task_runner())) {}
85
86 void RunLoopUntilIdle() { base::RunLoop().RunUntilIdle(); }
87
88 const ModuleDatabase::ModuleSet& modules() {
89 return module_database_->modules_;
90 }
91
92 const ModuleDatabase::ProcessSet& processes() {
93 return module_database_->processes_;
94 }
95
96 static uint32_t ProcessTypeToBit(content::ProcessType process_type) {
97 return ModuleDatabase::ProcessTypeToBit(process_type);
98 }
99
100 // Counts the occurrences of the given |module_id| in the given collection of
101 // |load_addresses|.
102 static size_t ModuleIdCount(
103 ModuleDatabase::ModuleId module_id,
104 const ModuleDatabase::ModuleLoadAddresses& load_addresses) {
105 size_t count = 0;
grt (UTC plus 2) 2016/12/22 14:19:06 nit: std::count_if(load_addresses.begin(), load_ad
chrisha 2017/01/03 21:34:48 Done.
106 for (const auto& load_address : load_addresses) {
107 if (load_address.first == module_id)
108 ++count;
109 }
110 return count;
111 }
112
113 protected:
114 const base::FilePath dll1_;
115 const base::FilePath dll2_;
116
117 std::unique_ptr<base::MessageLoop> message_loop_;
grt (UTC plus 2) 2016/12/22 14:19:06 iwyu <memory>
chrisha 2017/01/03 21:34:48 Done.
118 std::unique_ptr<ModuleDatabase> module_database_;
119
120 private:
121 DISALLOW_COPY_AND_ASSIGN(ModuleDatabaseTest);
122 };
123
124 TEST_F(ModuleDatabaseTest, LoadAddressVectorOperations) {
125 using TMD = TestModuleDatabase;
126 TestModuleDatabase::ModuleLoadAddresses la;
127
128 // Finds should fail in an empty collection.
129 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
130 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x04000000, la));
131
132 // A first insert should work. Don't start with ModuleId 0 so that later
133 // inserts can insert that module.
134 TMD::InsertLoadAddress(10, 0x04000000, &la);
135 EXPECT_EQ(1u, la.size());
136 EXPECT_EQ(10, la[0].first);
137 EXPECT_EQ(0x04000000u, la[0].second);
138
139 // Finds should work.
140 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
141 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x03000000, la));
142 EXPECT_EQ(0u, TMD::FindLoadAddressIndexById(10, la));
143 EXPECT_EQ(0u, TMD::FindLoadAddressIndexByAddress(0x04000000, la));
144
145 // A second insert should work. This is the new max so should be at the end
146 // of the collection.
147 TMD::InsertLoadAddress(12, 0x06000000, &la);
148 EXPECT_EQ(2u, la.size());
149 EXPECT_EQ(10, la[0].first);
150 EXPECT_EQ(0x04000000u, la[0].second);
151 EXPECT_EQ(12, la[1].first);
152 EXPECT_EQ(0x06000000u, la[1].second);
153
154 // Finds should work.
155 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
156 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x03000000, la));
157 EXPECT_EQ(0u, TMD::FindLoadAddressIndexById(10, la));
158 EXPECT_EQ(0u, TMD::FindLoadAddressIndexByAddress(0x04000000, la));
159 EXPECT_EQ(1u, TMD::FindLoadAddressIndexById(12, la));
160 EXPECT_EQ(1u, TMD::FindLoadAddressIndexByAddress(0x06000000, la));
161
162 // Another insert should work. This is not the new max, so a swap should
163 // happen to keep the maximum element at the end of the collection.
164 TMD::InsertLoadAddress(11, 0x05000000, &la);
165 EXPECT_EQ(3u, la.size());
166 EXPECT_EQ(10, la[0].first);
167 EXPECT_EQ(0x04000000u, la[0].second);
168 EXPECT_EQ(11, la[1].first);
169 EXPECT_EQ(0x05000000u, la[1].second);
170 EXPECT_EQ(12, la[2].first);
171 EXPECT_EQ(0x06000000u, la[2].second);
172
173 // An insert of an existing module should work, but simply overwrite the
174 // load address.
175 TMD::InsertLoadAddress(11, 0x0F000000, &la);
176 EXPECT_EQ(3u, la.size());
177 EXPECT_EQ(11, la[1].first);
178 EXPECT_EQ(0x0F000000u, la[1].second);
179 TMD::InsertLoadAddress(11, 0x05000000, &la);
180 EXPECT_EQ(3u, la.size());
181 EXPECT_EQ(11, la[1].first);
182 EXPECT_EQ(0x05000000u, la[1].second);
183
184 // Finds should work.
185 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
186 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x03000000, la));
187 EXPECT_EQ(0u, TMD::FindLoadAddressIndexById(10, la));
188 EXPECT_EQ(0u, TMD::FindLoadAddressIndexByAddress(0x04000000, la));
189 EXPECT_EQ(1u, TMD::FindLoadAddressIndexById(11, la));
190 EXPECT_EQ(1u, TMD::FindLoadAddressIndexByAddress(0x05000000, la));
191 EXPECT_EQ(2u, TMD::FindLoadAddressIndexById(12, la));
192 EXPECT_EQ(2u, TMD::FindLoadAddressIndexByAddress(0x06000000, la));
193
194 // Do some inserts of lower modules IDs. This ensures that we'll have some
195 // higher module IDs in the vector before some lower modules IDs, for testing
196 // the deletion logic.
197 TMD::InsertLoadAddress(3, 0x07000000, &la);
198 TMD::InsertLoadAddress(4, 0x08000000, &la);
199 TMD::InsertLoadAddress(5, 0x09000000, &la);
200 EXPECT_EQ(6u, la.size());
201 EXPECT_EQ(10, la[0].first);
202 EXPECT_EQ(0x04000000u, la[0].second);
203 EXPECT_EQ(11, la[1].first);
204 EXPECT_EQ(0x05000000u, la[1].second);
205 EXPECT_EQ(3, la[2].first);
206 EXPECT_EQ(0x07000000u, la[2].second);
207 EXPECT_EQ(4, la[3].first);
208 EXPECT_EQ(0x08000000u, la[3].second);
209 EXPECT_EQ(5, la[4].first);
210 EXPECT_EQ(0x09000000u, la[4].second);
211 EXPECT_EQ(12, la[5].first);
212 EXPECT_EQ(0x06000000u, la[5].second);
213
214 // Remove an element that isn't in the second last position. The second last
215 // element should be swapped into its position, and the last element moved
216 // to the second last place.
217 TMD::RemoveLoadAddressByIndex(2, &la);
218 EXPECT_EQ(5u, la.size());
219 EXPECT_EQ(10, la[0].first);
220 EXPECT_EQ(0x04000000u, la[0].second);
221 EXPECT_EQ(11, la[1].first);
222 EXPECT_EQ(0x05000000u, la[1].second);
223 EXPECT_EQ(5, la[2].first);
224 EXPECT_EQ(0x09000000u, la[2].second);
225 EXPECT_EQ(4, la[3].first);
226 EXPECT_EQ(0x08000000u, la[3].second);
227 EXPECT_EQ(12, la[4].first);
228 EXPECT_EQ(0x06000000u, la[4].second);
229
230 // Remove the second last element. Only the last element should move.
231 TMD::RemoveLoadAddressByIndex(3, &la);
232 EXPECT_EQ(4u, la.size());
233 EXPECT_EQ(10, la[0].first);
234 EXPECT_EQ(0x04000000u, la[0].second);
235 EXPECT_EQ(11, la[1].first);
236 EXPECT_EQ(0x05000000u, la[1].second);
237 EXPECT_EQ(5, la[2].first);
238 EXPECT_EQ(0x09000000u, la[2].second);
239 EXPECT_EQ(12, la[3].first);
240 EXPECT_EQ(0x06000000u, la[3].second);
241
242 // Remove the last element. The new maximum should be found moved to the
243 // end.
244 TMD::RemoveLoadAddressByIndex(3, &la);
245 EXPECT_EQ(3u, la.size());
246 EXPECT_EQ(10, la[0].first);
247 EXPECT_EQ(0x04000000u, la[0].second);
248 EXPECT_EQ(5, la[1].first);
249 EXPECT_EQ(0x09000000u, la[1].second);
250 EXPECT_EQ(11, la[2].first);
251 EXPECT_EQ(0x05000000u, la[2].second);
252
253 // Remove the last element by ModuleId. The remaining modules should be
254 // swapped.
255 TMD::RemoveLoadAddressById(11, &la);
256 EXPECT_EQ(2u, la.size());
257 EXPECT_EQ(5, la[0].first);
258 EXPECT_EQ(0x09000000u, la[0].second);
259 EXPECT_EQ(10, la[1].first);
260 EXPECT_EQ(0x04000000u, la[1].second);
261
262 // Remove the first element by ModuleId.
263 TMD::RemoveLoadAddressById(5, &la);
264 EXPECT_EQ(1u, la.size());
265 EXPECT_EQ(10, la[0].first);
266 EXPECT_EQ(0x04000000u, la[0].second);
267
268 // Remove the only remaining element.
269 TMD::RemoveLoadAddressByIndex(0, &la);
270 EXPECT_TRUE(la.empty());
271 }
272
273 TEST_F(ModuleDatabaseTest, LoadAddressVectorStressTest) {
274 using TMD = TestModuleDatabase;
275 TestModuleDatabase::ModuleLoadAddresses la;
276
277 for (size_t n = 1; n < 200; ++n) {
278 // Will keep track of which elements have been inserted.
279 std::vector<bool> inserted(n);
grt (UTC plus 2) 2016/12/22 14:19:06 iwyu <vector>
chrisha 2017/01/03 21:34:48 Done.
280 size_t inserted_count = 0;
281
282 // Generate a shuffled list of IDs. This will be the insertion order.
283 // More insertions than elements will occur so that rewrites occur.,
284 std::vector<TMD::ModuleId> ids(11 * n / 10);
285 for (size_t i = 0; i < 11 * n / 10; ++i)
286 ids[i] = i % n;
287 std::random_shuffle(ids.begin(), ids.end());
288
289 // Do the insertions.
290 for (auto id : ids) {
291 if (!inserted[id]) {
292 inserted[id] = true;
293 ++inserted_count;
294 }
295
296 // Generate a load address. The load address bakes in the index so that
297 // searching by load address is easy.
298 uintptr_t load_address = static_cast<uintptr_t>(id) << 16;
299
300 // Do the insertion.
301 TMD::InsertLoadAddress(id, load_address, &la);
302 EXPECT_EQ(inserted_count, la.size());
303 }
304
305 // Validate that every element is there, via both search mechanisms.
306 for (size_t id = 0; id < n; ++id) {
307 uintptr_t load_address = static_cast<uintptr_t>(id) << 16;
308 size_t index1 = TMD::FindLoadAddressIndexById(id, la);
309 size_t index2 = TMD::FindLoadAddressIndexByAddress(load_address, la);
310 EXPECT_NE(TMD::kInvalidIndex, index1);
311 EXPECT_EQ(index1, index2);
312 }
313
314 // Generate the deletion order.
315 ids.resize(n);
316 for (size_t i = 0; i < ids.size(); ++i)
317 ids[i] = i;
318 std::random_shuffle(ids.begin(), ids.end());
319
320 // Do the deletions.
321 for (auto id : ids) {
322 --inserted_count;
323 TMD::RemoveLoadAddressById(id, &la);
324 EXPECT_EQ(inserted_count, la.size());
325 }
326 }
327 }
328
329 TEST_F(ModuleDatabaseTest, TasksAreBounced) {
330 // Run a task on the current thread. This should not be bounced, so no
331 // task should be scheduled on the task runner.
332 module_database_->OnProcessStarted(kPid1, kCreateTime1,
333 content::PROCESS_TYPE_BROWSER);
334 EXPECT_TRUE(message_loop_->IsIdleForTesting());
335 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
336 kGoodAddress1);
337 EXPECT_TRUE(message_loop_->IsIdleForTesting());
338 module_database_->OnProcessEnded(kPid1, kCreateTime1);
339 EXPECT_TRUE(message_loop_->IsIdleForTesting());
340
341 // Indicate another process start on this thread. This call can't be
342 // bounced.
343 module_database_->OnProcessStarted(kPid2, kCreateTime2,
344 content::PROCESS_TYPE_BROWSER);
345
346 // Run similar tasks on another thread. These should be bounced.
347 RunTask(base::Bind(&ModuleDatabase::OnModuleLoad,
348 base::Unretained(module_database_.get()), kPid2,
349 kCreateTime2, dll1_, kSize1, kTime1, kGoodAddress1));
350 EXPECT_FALSE(message_loop_->IsIdleForTesting());
351 RunLoopUntilIdle();
352
353 RunTask(base::Bind(&ModuleDatabase::OnProcessEnded,
354 base::Unretained(module_database_.get()), kPid2,
355 kCreateTime2));
356 EXPECT_FALSE(message_loop_->IsIdleForTesting());
357 RunLoopUntilIdle();
358 }
359
360 TEST_F(ModuleDatabaseTest, EventsWithoutProcessIgnore) {
361 EXPECT_EQ(0u, modules().size());
362 EXPECT_EQ(0u, processes().size());
363
364 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
365 kGoodAddress1);
366
367 EXPECT_EQ(0u, modules().size());
368 EXPECT_EQ(0u, processes().size());
369 }
370
371 TEST_F(ModuleDatabaseTest, OrphanedUnloadIgnored) {
372 EXPECT_EQ(0u, modules().size());
373 EXPECT_EQ(0u, processes().size());
374
375 // Start a process.
376 module_database_->OnProcessStarted(kPid1, kCreateTime1,
377 content::PROCESS_TYPE_BROWSER);
378 EXPECT_EQ(0u, modules().size());
379 EXPECT_EQ(1u, processes().size());
380 auto p1 = processes().begin();
381 EXPECT_EQ(kPid1, p1->process_id);
382 EXPECT_EQ(kCreateTime1, p1->creation_time);
383 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
384 EXPECT_EQ(0u, p1->loaded_modules.size());
385 EXPECT_EQ(0u, p1->unloaded_modules.size());
386
387 // Indicate a module unload. This should do nothing because there's no
388 // corresponding module.
389 module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress1);
390 EXPECT_EQ(0u, modules().size());
391 EXPECT_EQ(1u, processes().size());
392 EXPECT_EQ(0u, p1->loaded_modules.size());
393 EXPECT_EQ(0u, p1->unloaded_modules.size());
394 }
395
396 TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
397 EXPECT_EQ(0u, modules().size());
398 EXPECT_EQ(0u, processes().size());
399
400 // Start a process.
401 module_database_->OnProcessStarted(kPid1, kCreateTime1,
402 content::PROCESS_TYPE_BROWSER);
403 EXPECT_EQ(0u, modules().size());
404 EXPECT_EQ(1u, processes().size());
405 auto p1 = processes().begin();
406 EXPECT_EQ(kPid1, p1->process_id);
407 EXPECT_EQ(kCreateTime1, p1->creation_time);
408 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
409 EXPECT_EQ(0u, p1->loaded_modules.size());
410 EXPECT_EQ(0u, p1->unloaded_modules.size());
411
412 // Load a module.
413 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
414 kGoodAddress1);
415 EXPECT_EQ(1u, modules().size());
416 EXPECT_EQ(1u, processes().size());
417
418 // Ensure that the process and module sets are up to date.
419 auto m1 = modules().begin();
420 EXPECT_EQ(dll1_, m1->module_path);
421 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m1->process_types);
422 EXPECT_EQ(kPid1, p1->process_id);
423 EXPECT_EQ(kCreateTime1, p1->creation_time);
424 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
425 EXPECT_EQ(1u, p1->loaded_modules.size());
426 EXPECT_EQ(0u, p1->unloaded_modules.size());
427 EXPECT_EQ(1u, ModuleIdCount(m1->module_id, p1->loaded_modules));
428
429 // Provide a redundant load message for that module.
430 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
431 kGoodAddress1);
432 EXPECT_EQ(1u, modules().size());
433 EXPECT_EQ(1u, processes().size());
434
435 // Ensure that the process and module sets haven't changed.
436 EXPECT_EQ(dll1_, m1->module_path);
437 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m1->process_types);
438 EXPECT_EQ(kPid1, p1->process_id);
439 EXPECT_EQ(kCreateTime1, p1->creation_time);
440 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
441 EXPECT_EQ(1u, p1->loaded_modules.size());
442 EXPECT_EQ(0u, p1->unloaded_modules.size());
443 EXPECT_EQ(1u, ModuleIdCount(m1->module_id, p1->loaded_modules));
444
445 // Load a second module into the process.
446 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll2_, kSize2, kTime2,
447 kGoodAddress2);
448 EXPECT_EQ(2u, modules().size());
449 EXPECT_EQ(1u, processes().size());
450
451 // Ensure that the process and module sets are up to date.
452 auto m2 = modules().rbegin();
453 EXPECT_EQ(dll2_, m2->module_path);
454 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m2->process_types);
455 EXPECT_EQ(kPid1, p1->process_id);
456 EXPECT_EQ(kCreateTime1, p1->creation_time);
457 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
458 EXPECT_EQ(2u, p1->loaded_modules.size());
459 EXPECT_EQ(0u, p1->unloaded_modules.size());
460 EXPECT_EQ(1u, ModuleIdCount(m1->module_id, p1->loaded_modules));
461 EXPECT_EQ(1u, ModuleIdCount(m2->module_id, p1->loaded_modules));
462
463 // Unload the second module.
464 module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress2);
465 EXPECT_EQ(2u, modules().size());
466 EXPECT_EQ(1u, processes().size());
467
468 // Ensure that the process and module sets are up to date.
469 EXPECT_EQ(dll2_, m2->module_path);
470 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m2->process_types);
471 EXPECT_EQ(kPid1, p1->process_id);
472 EXPECT_EQ(kCreateTime1, p1->creation_time);
473 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->process_type);
474 EXPECT_EQ(1u, p1->loaded_modules.size());
475 EXPECT_EQ(1u, p1->unloaded_modules.size());
476 EXPECT_EQ(1u, ModuleIdCount(m1->module_id, p1->loaded_modules));
477 EXPECT_EQ(1u, ModuleIdCount(m2->module_id, p1->unloaded_modules));
478
479 // Start a process.
480 module_database_->OnProcessStarted(kPid2, kCreateTime2,
481 content::PROCESS_TYPE_RENDERER);
482 EXPECT_EQ(2u, modules().size());
483 EXPECT_EQ(2u, processes().size());
484 auto p2 = processes().rbegin();
485 EXPECT_EQ(kPid2, p2->process_id);
486 EXPECT_EQ(kCreateTime2, p2->creation_time);
487 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->process_type);
488 EXPECT_EQ(0u, p2->loaded_modules.size());
489 EXPECT_EQ(0u, p2->unloaded_modules.size());
490
491 // Load the dummy.dll in the second process as well.
492 module_database_->OnModuleLoad(kPid2, kCreateTime2, dll1_, kSize1, kTime1,
493 kGoodAddress1);
494 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
495 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
496 m1->process_types);
497 EXPECT_EQ(kPid2, p2->process_id);
498 EXPECT_EQ(kCreateTime2, p2->creation_time);
499 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->process_type);
500 EXPECT_EQ(1u, p2->loaded_modules.size());
501 EXPECT_EQ(0u, p2->unloaded_modules.size());
502 EXPECT_EQ(1u, ModuleIdCount(m1->module_id, p2->loaded_modules));
503
504 // End the second process without an explicit unload. This invalidates |p2|.
505 module_database_->OnProcessEnded(kPid2, kCreateTime2);
506 EXPECT_EQ(2u, modules().size());
507 EXPECT_EQ(1u, processes().size());
508 EXPECT_EQ(kPid1, p1->process_id);
509 EXPECT_EQ(kCreateTime1, p1->creation_time);
510 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
511 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
512 m1->process_types);
513 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m2->process_types);
514
515 // End the first process without an explicit unload. This invalidates |p1|.
516 module_database_->OnProcessEnded(kPid1, kCreateTime1);
517 EXPECT_EQ(2u, modules().size());
518 EXPECT_EQ(0u, processes().size());
519 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
520 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
521 m1->process_types);
522 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), m2->process_types);
523 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698