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

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

Issue 2721503003: Add ModuleInspector (Closed)
Patch Set: merge Created 3 years, 9 months 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "chrome/browser/conflicts/module_database_win.h" 5 #include "chrome/browser/conflicts/module_database_win.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 13 #include "base/run_loop.h"
15 #include "base/strings/utf_string_conversions.h" 14 #include "base/test/scoped_task_scheduler.h"
15 #include "base/threading/sequenced_task_runner_handle.h"
16 #include "base/threading/simple_thread.h" 16 #include "base/threading/simple_thread.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 18
19 namespace { 19 namespace {
20 20
21 // A simple mechanism for running a single task on a separate thread. 21 // A simple mechanism for running a single task on a separate thread.
22 class SingleTaskRunner : public base::SimpleThread { 22 class SingleTaskRunner : public base::SimpleThread {
23 public: 23 public:
24 explicit SingleTaskRunner(base::Closure task) 24 explicit SingleTaskRunner(base::Closure task)
25 : base::SimpleThread("SingleTaskRunner"), task_(std::move(task)) {} 25 : base::SimpleThread("SingleTaskRunner"), task_(std::move(task)) {}
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 using ModuleDatabase::InsertLoadAddress; 73 using ModuleDatabase::InsertLoadAddress;
74 using ModuleDatabase::RemoveLoadAddressById; 74 using ModuleDatabase::RemoveLoadAddressById;
75 using ModuleDatabase::RemoveLoadAddressByIndex; 75 using ModuleDatabase::RemoveLoadAddressByIndex;
76 }; 76 };
77 77
78 class ModuleDatabaseTest : public testing::Test { 78 class ModuleDatabaseTest : public testing::Test {
79 protected: 79 protected:
80 ModuleDatabaseTest() 80 ModuleDatabaseTest()
81 : dll1_(kDll1), 81 : dll1_(kDll1),
82 dll2_(kDll2), 82 dll2_(kDll2),
83 message_loop_(base::MakeUnique<base::MessageLoop>()), 83 module_database_(base::MakeUnique<ModuleDatabase>(
84 module_database_( 84 base::SequencedTaskRunnerHandle::Get())) {}
85 base::MakeUnique<ModuleDatabase>(message_loop_->task_runner())) {}
86
87 void RunLoopUntilIdle() { base::RunLoop().RunUntilIdle(); }
88 85
89 const ModuleDatabase::ModuleMap& modules() { 86 const ModuleDatabase::ModuleMap& modules() {
90 return module_database_->modules_; 87 return module_database_->modules_;
91 } 88 }
92 89
93 const ModuleDatabase::ProcessMap& processes() { 90 const ModuleDatabase::ProcessMap& processes() {
94 return module_database_->processes_; 91 return module_database_->processes_;
95 } 92 }
96 93
94 ModuleDatabase* module_database() { return module_database_.get(); }
95
97 static uint32_t ProcessTypeToBit(content::ProcessType process_type) { 96 static uint32_t ProcessTypeToBit(content::ProcessType process_type) {
98 return ModuleDatabase::ProcessTypeToBit(process_type); 97 return ModuleDatabase::ProcessTypeToBit(process_type);
99 } 98 }
100 99
101 // Counts the occurrences of the given |module_id| in the given collection of 100 // Counts the occurrences of the given |module_id| in the given collection of
102 // |load_addresses|. 101 // |load_addresses|.
103 static size_t ModuleIdCount( 102 static size_t ModuleIdCount(
104 ModuleId module_id, 103 ModuleId module_id,
105 const ModuleDatabase::ModuleLoadAddresses& load_addresses) { 104 const ModuleDatabase::ModuleLoadAddresses& load_addresses) {
106 return std::count_if( 105 return std::count_if(
107 load_addresses.begin(), load_addresses.end(), 106 load_addresses.begin(), load_addresses.end(),
108 [module_id](const auto& x) { return module_id == x.first; }); 107 [module_id](const auto& x) { return module_id == x.first; });
109 } 108 }
110 109
111 protected:
112 const base::FilePath dll1_; 110 const base::FilePath dll1_;
113 const base::FilePath dll2_; 111 const base::FilePath dll2_;
114 112
115 std::unique_ptr<base::MessageLoop> message_loop_; 113 private:
114 // Must be before |module_database_|.
115 base::test::ScopedTaskScheduler scoped_task_scheduler_;
116
116 std::unique_ptr<ModuleDatabase> module_database_; 117 std::unique_ptr<ModuleDatabase> module_database_;
117 118
118 private:
119 DISALLOW_COPY_AND_ASSIGN(ModuleDatabaseTest); 119 DISALLOW_COPY_AND_ASSIGN(ModuleDatabaseTest);
120 }; 120 };
121 121
122 TEST_F(ModuleDatabaseTest, LoadAddressVectorOperations) { 122 TEST_F(ModuleDatabaseTest, LoadAddressVectorOperations) {
123 using TMD = TestModuleDatabase; 123 using TMD = TestModuleDatabase;
124 TestModuleDatabase::ModuleLoadAddresses la; 124 TMD::ModuleLoadAddresses la;
125 125
126 // Finds should fail in an empty collection. 126 // Finds should fail in an empty collection.
127 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la)); 127 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
128 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x04000000, la)); 128 EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0x04000000, la));
129 129
130 // A first insert should work. Don't start with ModuleId 0 so that later 130 // A first insert should work. Don't start with ModuleId 0 so that later
131 // inserts can insert that module. 131 // inserts can insert that module.
132 TMD::InsertLoadAddress(10, 0x04000000, &la); 132 TMD::InsertLoadAddress(10, 0x04000000, &la);
133 EXPECT_EQ(1u, la.size()); 133 EXPECT_EQ(1u, la.size());
134 EXPECT_EQ(10, la[0].first); 134 EXPECT_EQ(10, la[0].first);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 EXPECT_EQ(10, la[0].first); 263 EXPECT_EQ(10, la[0].first);
264 EXPECT_EQ(0x04000000u, la[0].second); 264 EXPECT_EQ(0x04000000u, la[0].second);
265 265
266 // Remove the only remaining element. 266 // Remove the only remaining element.
267 TMD::RemoveLoadAddressByIndex(0, &la); 267 TMD::RemoveLoadAddressByIndex(0, &la);
268 EXPECT_TRUE(la.empty()); 268 EXPECT_TRUE(la.empty());
269 } 269 }
270 270
271 TEST_F(ModuleDatabaseTest, LoadAddressVectorStressTest) { 271 TEST_F(ModuleDatabaseTest, LoadAddressVectorStressTest) {
272 using TMD = TestModuleDatabase; 272 using TMD = TestModuleDatabase;
273 TestModuleDatabase::ModuleLoadAddresses la; 273 TMD::ModuleLoadAddresses la;
274 274
275 for (size_t n = 1; n < 200; ++n) { 275 for (size_t n = 1; n < 200; ++n) {
276 // Will keep track of which elements have been inserted. 276 // Will keep track of which elements have been inserted.
277 std::vector<bool> inserted(n); 277 std::vector<bool> inserted(n);
278 size_t inserted_count = 0; 278 size_t inserted_count = 0;
279 279
280 // Generate a shuffled list of IDs. This will be the insertion order. 280 // Generate a shuffled list of IDs. This will be the insertion order.
281 // More insertions than elements will occur so that rewrites occur., 281 // More insertions than elements will occur so that rewrites occur.,
282 std::vector<ModuleId> ids(11 * n / 10); 282 std::vector<ModuleId> ids(11 * n / 10);
283 for (size_t i = 0; i < 11 * n / 10; ++i) 283 for (size_t i = 0; i < 11 * n / 10; ++i)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 // Do the deletions. 318 // Do the deletions.
319 for (auto id : ids) { 319 for (auto id : ids) {
320 --inserted_count; 320 --inserted_count;
321 TMD::RemoveLoadAddressById(id, &la); 321 TMD::RemoveLoadAddressById(id, &la);
322 EXPECT_EQ(inserted_count, la.size()); 322 EXPECT_EQ(inserted_count, la.size());
323 } 323 }
324 } 324 }
325 } 325 }
326 326
327 TEST_F(ModuleDatabaseTest, TasksAreBounced) { 327 TEST_F(ModuleDatabaseTest, TasksAreBounced) {
328 // Run a task on the current thread. This should not be bounced, so no 328 // Run a task on the current thread. This should not be bounced, so their
329 // task should be scheduled on the task runner. 329 // results should be immediately available.
330 module_database_->OnProcessStarted(kPid1, kCreateTime1, 330 module_database()->OnProcessStarted(kPid1, kCreateTime1,
331 content::PROCESS_TYPE_BROWSER); 331 content::PROCESS_TYPE_BROWSER);
332 EXPECT_TRUE(message_loop_->IsIdleForTesting()); 332 EXPECT_EQ(1u, processes().size());
333 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1, 333 module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
334 kGoodAddress1); 334 kGoodAddress1);
335 EXPECT_TRUE(message_loop_->IsIdleForTesting()); 335 EXPECT_EQ(1u, modules().size());
336 module_database_->OnProcessEnded(kPid1, kCreateTime1); 336 module_database()->OnProcessEnded(kPid1, kCreateTime1);
337 EXPECT_TRUE(message_loop_->IsIdleForTesting()); 337 EXPECT_EQ(0u, processes().size());
338 338
339 // Indicate another process start on this thread. This call can't be 339 // Indicate another process start on this thread. This call can't be
340 // bounced. 340 // bounced.
341 module_database_->OnProcessStarted(kPid2, kCreateTime2, 341 module_database()->OnProcessStarted(kPid2, kCreateTime2,
342 content::PROCESS_TYPE_BROWSER); 342 content::PROCESS_TYPE_BROWSER);
343 EXPECT_EQ(1u, processes().size());
343 344
344 // Run similar tasks on another thread. These should be bounced. 345 // Run similar tasks on another thread with another module. These should be
346 // bounced.
345 RunTask(base::Bind(&ModuleDatabase::OnModuleLoad, 347 RunTask(base::Bind(&ModuleDatabase::OnModuleLoad,
346 base::Unretained(module_database_.get()), kPid2, 348 base::Unretained(module_database()), kPid2, kCreateTime2,
347 kCreateTime2, dll1_, kSize1, kTime1, kGoodAddress1)); 349 dll2_, kSize1, kTime1, kGoodAddress1));
348 EXPECT_FALSE(message_loop_->IsIdleForTesting()); 350 EXPECT_EQ(1u, modules().size());
349 RunLoopUntilIdle(); 351 base::RunLoop().RunUntilIdle();
352 EXPECT_EQ(2u, modules().size());
350 353
351 RunTask(base::Bind(&ModuleDatabase::OnProcessEnded, 354 RunTask(base::Bind(&ModuleDatabase::OnProcessEnded,
352 base::Unretained(module_database_.get()), kPid2, 355 base::Unretained(module_database()), kPid2, kCreateTime2));
353 kCreateTime2)); 356 EXPECT_EQ(1u, processes().size());
354 EXPECT_FALSE(message_loop_->IsIdleForTesting()); 357 base::RunLoop().RunUntilIdle();
355 RunLoopUntilIdle(); 358 EXPECT_EQ(0u, processes().size());
356 } 359 }
357 360
358 TEST_F(ModuleDatabaseTest, EventsWithoutProcessIgnore) { 361 TEST_F(ModuleDatabaseTest, EventsWithoutProcessIgnore) {
359 EXPECT_EQ(0u, modules().size()); 362 EXPECT_EQ(0u, modules().size());
360 EXPECT_EQ(0u, processes().size()); 363 EXPECT_EQ(0u, processes().size());
361 364
362 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1, 365 module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
363 kGoodAddress1); 366 kGoodAddress1);
364 367
365 EXPECT_EQ(0u, modules().size()); 368 EXPECT_EQ(0u, modules().size());
366 EXPECT_EQ(0u, processes().size()); 369 EXPECT_EQ(0u, processes().size());
367 } 370 }
368 371
369 TEST_F(ModuleDatabaseTest, OrphanedUnloadIgnored) { 372 TEST_F(ModuleDatabaseTest, OrphanedUnloadIgnored) {
370 EXPECT_EQ(0u, modules().size()); 373 EXPECT_EQ(0u, modules().size());
371 EXPECT_EQ(0u, processes().size()); 374 EXPECT_EQ(0u, processes().size());
372 375
373 // Start a process. 376 // Start a process.
374 module_database_->OnProcessStarted(kPid1, kCreateTime1, 377 module_database()->OnProcessStarted(kPid1, kCreateTime1,
375 content::PROCESS_TYPE_BROWSER); 378 content::PROCESS_TYPE_BROWSER);
376 EXPECT_EQ(0u, modules().size()); 379 EXPECT_EQ(0u, modules().size());
377 EXPECT_EQ(1u, processes().size()); 380 EXPECT_EQ(1u, processes().size());
378 auto p1 = processes().begin(); 381 auto p1 = processes().begin();
379 EXPECT_EQ(kPid1, p1->first.process_id); 382 EXPECT_EQ(kPid1, p1->first.process_id);
380 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 383 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
381 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 384 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
382 EXPECT_EQ(0u, p1->second.loaded_modules.size()); 385 EXPECT_EQ(0u, p1->second.loaded_modules.size());
383 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 386 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
384 387
385 // Indicate a module unload. This should do nothing because there's no 388 // Indicate a module unload. This should do nothing because there's no
386 // corresponding module. 389 // corresponding module.
387 module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress1); 390 module_database()->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress1);
388 EXPECT_EQ(0u, modules().size()); 391 EXPECT_EQ(0u, modules().size());
389 EXPECT_EQ(1u, processes().size()); 392 EXPECT_EQ(1u, processes().size());
390 EXPECT_EQ(0u, p1->second.loaded_modules.size()); 393 EXPECT_EQ(0u, p1->second.loaded_modules.size());
391 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 394 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
392 } 395 }
393 396
394 TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) { 397 TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
395 EXPECT_EQ(0u, modules().size()); 398 EXPECT_EQ(0u, modules().size());
396 EXPECT_EQ(0u, processes().size()); 399 EXPECT_EQ(0u, processes().size());
397 400
398 // Start a process. 401 // Start a process.
399 module_database_->OnProcessStarted(kPid1, kCreateTime1, 402 module_database()->OnProcessStarted(kPid1, kCreateTime1,
400 content::PROCESS_TYPE_BROWSER); 403 content::PROCESS_TYPE_BROWSER);
401 EXPECT_EQ(0u, modules().size()); 404 EXPECT_EQ(0u, modules().size());
402 EXPECT_EQ(1u, processes().size()); 405 EXPECT_EQ(1u, processes().size());
403 auto p1 = processes().begin(); 406 auto p1 = processes().begin();
404 EXPECT_EQ(kPid1, p1->first.process_id); 407 EXPECT_EQ(kPid1, p1->first.process_id);
405 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 408 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
406 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 409 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
407 EXPECT_EQ(0u, p1->second.loaded_modules.size()); 410 EXPECT_EQ(0u, p1->second.loaded_modules.size());
408 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 411 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
409 412
410 // Load a module. 413 // Load a module.
411 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1, 414 module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
412 kGoodAddress1); 415 kGoodAddress1);
413 EXPECT_EQ(1u, modules().size()); 416 EXPECT_EQ(1u, modules().size());
414 EXPECT_EQ(1u, processes().size()); 417 EXPECT_EQ(1u, processes().size());
415 418
416 // Ensure that the process and module sets are up to date. 419 // Ensure that the process and module sets are up to date.
417 auto m1 = modules().begin(); 420 auto m1 = modules().begin();
418 EXPECT_EQ(dll1_, m1->first.module_path); 421 EXPECT_EQ(dll1_, m1->first.module_path);
419 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 422 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
420 m1->second.process_types); 423 m1->second.process_types);
421 EXPECT_EQ(kPid1, p1->first.process_id); 424 EXPECT_EQ(kPid1, p1->first.process_id);
422 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 425 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
423 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 426 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
424 EXPECT_EQ(1u, p1->second.loaded_modules.size()); 427 EXPECT_EQ(1u, p1->second.loaded_modules.size());
425 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 428 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
426 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules)); 429 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
427 430
428 // Provide a redundant load message for that module. 431 // Provide a redundant load message for that module.
429 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1, 432 module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
430 kGoodAddress1); 433 kGoodAddress1);
431 EXPECT_EQ(1u, modules().size()); 434 EXPECT_EQ(1u, modules().size());
432 EXPECT_EQ(1u, processes().size()); 435 EXPECT_EQ(1u, processes().size());
433 436
434 // Ensure that the process and module sets haven't changed. 437 // Ensure that the process and module sets haven't changed.
435 EXPECT_EQ(dll1_, m1->first.module_path); 438 EXPECT_EQ(dll1_, m1->first.module_path);
436 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 439 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
437 m1->second.process_types); 440 m1->second.process_types);
438 EXPECT_EQ(kPid1, p1->first.process_id); 441 EXPECT_EQ(kPid1, p1->first.process_id);
439 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 442 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
440 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 443 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
441 EXPECT_EQ(1u, p1->second.loaded_modules.size()); 444 EXPECT_EQ(1u, p1->second.loaded_modules.size());
442 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 445 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
443 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules)); 446 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
444 447
445 // Load a second module into the process. 448 // Load a second module into the process.
446 module_database_->OnModuleLoad(kPid1, kCreateTime1, dll2_, kSize2, kTime2, 449 module_database()->OnModuleLoad(kPid1, kCreateTime1, dll2_, kSize2, kTime2,
447 kGoodAddress2); 450 kGoodAddress2);
448 EXPECT_EQ(2u, modules().size()); 451 EXPECT_EQ(2u, modules().size());
449 EXPECT_EQ(1u, processes().size()); 452 EXPECT_EQ(1u, processes().size());
450 453
451 // Ensure that the process and module sets are up to date. 454 // Ensure that the process and module sets are up to date.
452 auto m2 = modules().rbegin(); 455 auto m2 = modules().rbegin();
453 EXPECT_EQ(dll2_, m2->first.module_path); 456 EXPECT_EQ(dll2_, m2->first.module_path);
454 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 457 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
455 m2->second.process_types); 458 m2->second.process_types);
456 EXPECT_EQ(kPid1, p1->first.process_id); 459 EXPECT_EQ(kPid1, p1->first.process_id);
457 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 460 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
458 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 461 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
459 EXPECT_EQ(2u, p1->second.loaded_modules.size()); 462 EXPECT_EQ(2u, p1->second.loaded_modules.size());
460 EXPECT_EQ(0u, p1->second.unloaded_modules.size()); 463 EXPECT_EQ(0u, p1->second.unloaded_modules.size());
461 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules)); 464 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
462 EXPECT_EQ(1u, ModuleIdCount(m2->first.module_id, p1->second.loaded_modules)); 465 EXPECT_EQ(1u, ModuleIdCount(m2->first.module_id, p1->second.loaded_modules));
463 466
464 // Unload the second module. 467 // Unload the second module.
465 module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress2); 468 module_database()->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress2);
466 EXPECT_EQ(2u, modules().size()); 469 EXPECT_EQ(2u, modules().size());
467 EXPECT_EQ(1u, processes().size()); 470 EXPECT_EQ(1u, processes().size());
468 471
469 // Ensure that the process and module sets are up to date. 472 // Ensure that the process and module sets are up to date.
470 EXPECT_EQ(dll2_, m2->first.module_path); 473 EXPECT_EQ(dll2_, m2->first.module_path);
471 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 474 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
472 m2->second.process_types); 475 m2->second.process_types);
473 EXPECT_EQ(kPid1, p1->first.process_id); 476 EXPECT_EQ(kPid1, p1->first.process_id);
474 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 477 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
475 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type); 478 EXPECT_EQ(content::PROCESS_TYPE_BROWSER, p1->first.process_type);
476 EXPECT_EQ(1u, p1->second.loaded_modules.size()); 479 EXPECT_EQ(1u, p1->second.loaded_modules.size());
477 EXPECT_EQ(1u, p1->second.unloaded_modules.size()); 480 EXPECT_EQ(1u, p1->second.unloaded_modules.size());
478 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules)); 481 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
479 EXPECT_EQ(1u, 482 EXPECT_EQ(1u,
480 ModuleIdCount(m2->first.module_id, p1->second.unloaded_modules)); 483 ModuleIdCount(m2->first.module_id, p1->second.unloaded_modules));
481 484
482 // Start a process. 485 // Start a process.
483 module_database_->OnProcessStarted(kPid2, kCreateTime2, 486 module_database()->OnProcessStarted(kPid2, kCreateTime2,
484 content::PROCESS_TYPE_RENDERER); 487 content::PROCESS_TYPE_RENDERER);
485 EXPECT_EQ(2u, modules().size()); 488 EXPECT_EQ(2u, modules().size());
486 EXPECT_EQ(2u, processes().size()); 489 EXPECT_EQ(2u, processes().size());
487 auto p2 = processes().rbegin(); 490 auto p2 = processes().rbegin();
488 EXPECT_EQ(kPid2, p2->first.process_id); 491 EXPECT_EQ(kPid2, p2->first.process_id);
489 EXPECT_EQ(kCreateTime2, p2->first.creation_time); 492 EXPECT_EQ(kCreateTime2, p2->first.creation_time);
490 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->first.process_type); 493 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->first.process_type);
491 EXPECT_EQ(0u, p2->second.loaded_modules.size()); 494 EXPECT_EQ(0u, p2->second.loaded_modules.size());
492 EXPECT_EQ(0u, p2->second.unloaded_modules.size()); 495 EXPECT_EQ(0u, p2->second.unloaded_modules.size());
493 496
494 // Load the dummy.dll in the second process as well. 497 // Load the dummy.dll in the second process as well.
495 module_database_->OnModuleLoad(kPid2, kCreateTime2, dll1_, kSize1, kTime1, 498 module_database()->OnModuleLoad(kPid2, kCreateTime2, dll1_, kSize1, kTime1,
496 kGoodAddress1); 499 kGoodAddress1);
497 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) | 500 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
498 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER), 501 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
499 m1->second.process_types); 502 m1->second.process_types);
500 EXPECT_EQ(kPid2, p2->first.process_id); 503 EXPECT_EQ(kPid2, p2->first.process_id);
501 EXPECT_EQ(kCreateTime2, p2->first.creation_time); 504 EXPECT_EQ(kCreateTime2, p2->first.creation_time);
502 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->first.process_type); 505 EXPECT_EQ(content::PROCESS_TYPE_RENDERER, p2->first.process_type);
503 EXPECT_EQ(1u, p2->second.loaded_modules.size()); 506 EXPECT_EQ(1u, p2->second.loaded_modules.size());
504 EXPECT_EQ(0u, p2->second.unloaded_modules.size()); 507 EXPECT_EQ(0u, p2->second.unloaded_modules.size());
505 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p2->second.loaded_modules)); 508 EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p2->second.loaded_modules));
506 509
507 // End the second process without an explicit unload. This invalidates |p2|. 510 // End the second process without an explicit unload. This invalidates |p2|.
508 module_database_->OnProcessEnded(kPid2, kCreateTime2); 511 module_database()->OnProcessEnded(kPid2, kCreateTime2);
509 EXPECT_EQ(2u, modules().size()); 512 EXPECT_EQ(2u, modules().size());
510 EXPECT_EQ(1u, processes().size()); 513 EXPECT_EQ(1u, processes().size());
511 EXPECT_EQ(kPid1, p1->first.process_id); 514 EXPECT_EQ(kPid1, p1->first.process_id);
512 EXPECT_EQ(kCreateTime1, p1->first.creation_time); 515 EXPECT_EQ(kCreateTime1, p1->first.creation_time);
513 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) | 516 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
514 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER), 517 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
515 m1->second.process_types); 518 m1->second.process_types);
516 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 519 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
517 m2->second.process_types); 520 m2->second.process_types);
518 521
519 // End the first process without an explicit unload. This invalidates |p1|. 522 // End the first process without an explicit unload. This invalidates |p1|.
520 module_database_->OnProcessEnded(kPid1, kCreateTime1); 523 module_database()->OnProcessEnded(kPid1, kCreateTime1);
521 EXPECT_EQ(2u, modules().size()); 524 EXPECT_EQ(2u, modules().size());
522 EXPECT_EQ(0u, processes().size()); 525 EXPECT_EQ(0u, processes().size());
523 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) | 526 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
524 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER), 527 ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
525 m1->second.process_types); 528 m1->second.process_types);
526 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER), 529 EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER),
527 m2->second.process_types); 530 m2->second.process_types);
528 } 531 }
OLDNEW
« no previous file with comments | « chrome/browser/conflicts/module_database_win.cc ('k') | chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698