| Index: chrome/browser/conflicts/module_database_win_unittest.cc
|
| diff --git a/chrome/browser/conflicts/module_database_win_unittest.cc b/chrome/browser/conflicts/module_database_win_unittest.cc
|
| index 0b4555b4a55acf87b892a3f619efa452e3617f55..a6157f78574ce4145cc68d777c7b5253df0a9cdb 100644
|
| --- a/chrome/browser/conflicts/module_database_win_unittest.cc
|
| +++ b/chrome/browser/conflicts/module_database_win_unittest.cc
|
| @@ -10,9 +10,9 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/memory/ptr_util.h"
|
| -#include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| +#include "base/test/scoped_task_scheduler.h"
|
| +#include "base/threading/sequenced_task_runner_handle.h"
|
| #include "base/threading/simple_thread.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -80,11 +80,8 @@ class ModuleDatabaseTest : public testing::Test {
|
| ModuleDatabaseTest()
|
| : dll1_(kDll1),
|
| dll2_(kDll2),
|
| - message_loop_(base::MakeUnique<base::MessageLoop>()),
|
| - module_database_(
|
| - base::MakeUnique<ModuleDatabase>(message_loop_->task_runner())) {}
|
| -
|
| - void RunLoopUntilIdle() { base::RunLoop().RunUntilIdle(); }
|
| + module_database_(base::MakeUnique<ModuleDatabase>(
|
| + base::SequencedTaskRunnerHandle::Get())) {}
|
|
|
| const ModuleDatabase::ModuleMap& modules() {
|
| return module_database_->modules_;
|
| @@ -94,6 +91,8 @@ class ModuleDatabaseTest : public testing::Test {
|
| return module_database_->processes_;
|
| }
|
|
|
| + ModuleDatabase* module_database() { return module_database_.get(); }
|
| +
|
| static uint32_t ProcessTypeToBit(content::ProcessType process_type) {
|
| return ModuleDatabase::ProcessTypeToBit(process_type);
|
| }
|
| @@ -108,20 +107,21 @@ class ModuleDatabaseTest : public testing::Test {
|
| [module_id](const auto& x) { return module_id == x.first; });
|
| }
|
|
|
| - protected:
|
| const base::FilePath dll1_;
|
| const base::FilePath dll2_;
|
|
|
| - std::unique_ptr<base::MessageLoop> message_loop_;
|
| + private:
|
| + // Must be before |module_database_|.
|
| + base::test::ScopedTaskScheduler scoped_task_scheduler_;
|
| +
|
| std::unique_ptr<ModuleDatabase> module_database_;
|
|
|
| - private:
|
| DISALLOW_COPY_AND_ASSIGN(ModuleDatabaseTest);
|
| };
|
|
|
| TEST_F(ModuleDatabaseTest, LoadAddressVectorOperations) {
|
| using TMD = TestModuleDatabase;
|
| - TestModuleDatabase::ModuleLoadAddresses la;
|
| + TMD::ModuleLoadAddresses la;
|
|
|
| // Finds should fail in an empty collection.
|
| EXPECT_EQ(TMD::kInvalidIndex, TMD::FindLoadAddressIndexById(0, la));
|
| @@ -270,7 +270,7 @@ TEST_F(ModuleDatabaseTest, LoadAddressVectorOperations) {
|
|
|
| TEST_F(ModuleDatabaseTest, LoadAddressVectorStressTest) {
|
| using TMD = TestModuleDatabase;
|
| - TestModuleDatabase::ModuleLoadAddresses la;
|
| + TMD::ModuleLoadAddresses la;
|
|
|
| for (size_t n = 1; n < 200; ++n) {
|
| // Will keep track of which elements have been inserted.
|
| @@ -325,42 +325,45 @@ TEST_F(ModuleDatabaseTest, LoadAddressVectorStressTest) {
|
| }
|
|
|
| TEST_F(ModuleDatabaseTest, TasksAreBounced) {
|
| - // Run a task on the current thread. This should not be bounced, so no
|
| - // task should be scheduled on the task runner.
|
| - module_database_->OnProcessStarted(kPid1, kCreateTime1,
|
| - content::PROCESS_TYPE_BROWSER);
|
| - EXPECT_TRUE(message_loop_->IsIdleForTesting());
|
| - module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| - kGoodAddress1);
|
| - EXPECT_TRUE(message_loop_->IsIdleForTesting());
|
| - module_database_->OnProcessEnded(kPid1, kCreateTime1);
|
| - EXPECT_TRUE(message_loop_->IsIdleForTesting());
|
| + // Run a task on the current thread. This should not be bounced, so their
|
| + // results should be immediately available.
|
| + module_database()->OnProcessStarted(kPid1, kCreateTime1,
|
| + content::PROCESS_TYPE_BROWSER);
|
| + EXPECT_EQ(1u, processes().size());
|
| + module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| + kGoodAddress1);
|
| + EXPECT_EQ(1u, modules().size());
|
| + module_database()->OnProcessEnded(kPid1, kCreateTime1);
|
| + EXPECT_EQ(0u, processes().size());
|
|
|
| // Indicate another process start on this thread. This call can't be
|
| // bounced.
|
| - module_database_->OnProcessStarted(kPid2, kCreateTime2,
|
| - content::PROCESS_TYPE_BROWSER);
|
| + module_database()->OnProcessStarted(kPid2, kCreateTime2,
|
| + content::PROCESS_TYPE_BROWSER);
|
| + EXPECT_EQ(1u, processes().size());
|
|
|
| - // Run similar tasks on another thread. These should be bounced.
|
| + // Run similar tasks on another thread with another module. These should be
|
| + // bounced.
|
| RunTask(base::Bind(&ModuleDatabase::OnModuleLoad,
|
| - base::Unretained(module_database_.get()), kPid2,
|
| - kCreateTime2, dll1_, kSize1, kTime1, kGoodAddress1));
|
| - EXPECT_FALSE(message_loop_->IsIdleForTesting());
|
| - RunLoopUntilIdle();
|
| + base::Unretained(module_database()), kPid2, kCreateTime2,
|
| + dll2_, kSize1, kTime1, kGoodAddress1));
|
| + EXPECT_EQ(1u, modules().size());
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(2u, modules().size());
|
|
|
| RunTask(base::Bind(&ModuleDatabase::OnProcessEnded,
|
| - base::Unretained(module_database_.get()), kPid2,
|
| - kCreateTime2));
|
| - EXPECT_FALSE(message_loop_->IsIdleForTesting());
|
| - RunLoopUntilIdle();
|
| + base::Unretained(module_database()), kPid2, kCreateTime2));
|
| + EXPECT_EQ(1u, processes().size());
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(0u, processes().size());
|
| }
|
|
|
| TEST_F(ModuleDatabaseTest, EventsWithoutProcessIgnore) {
|
| EXPECT_EQ(0u, modules().size());
|
| EXPECT_EQ(0u, processes().size());
|
|
|
| - module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| - kGoodAddress1);
|
| + module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| + kGoodAddress1);
|
|
|
| EXPECT_EQ(0u, modules().size());
|
| EXPECT_EQ(0u, processes().size());
|
| @@ -371,8 +374,8 @@ TEST_F(ModuleDatabaseTest, OrphanedUnloadIgnored) {
|
| EXPECT_EQ(0u, processes().size());
|
|
|
| // Start a process.
|
| - module_database_->OnProcessStarted(kPid1, kCreateTime1,
|
| - content::PROCESS_TYPE_BROWSER);
|
| + module_database()->OnProcessStarted(kPid1, kCreateTime1,
|
| + content::PROCESS_TYPE_BROWSER);
|
| EXPECT_EQ(0u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
| auto p1 = processes().begin();
|
| @@ -384,7 +387,7 @@ TEST_F(ModuleDatabaseTest, OrphanedUnloadIgnored) {
|
|
|
| // Indicate a module unload. This should do nothing because there's no
|
| // corresponding module.
|
| - module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress1);
|
| + module_database()->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress1);
|
| EXPECT_EQ(0u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
| EXPECT_EQ(0u, p1->second.loaded_modules.size());
|
| @@ -396,8 +399,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(0u, processes().size());
|
|
|
| // Start a process.
|
| - module_database_->OnProcessStarted(kPid1, kCreateTime1,
|
| - content::PROCESS_TYPE_BROWSER);
|
| + module_database()->OnProcessStarted(kPid1, kCreateTime1,
|
| + content::PROCESS_TYPE_BROWSER);
|
| EXPECT_EQ(0u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
| auto p1 = processes().begin();
|
| @@ -408,8 +411,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(0u, p1->second.unloaded_modules.size());
|
|
|
| // Load a module.
|
| - module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| - kGoodAddress1);
|
| + module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| + kGoodAddress1);
|
| EXPECT_EQ(1u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
|
|
| @@ -426,8 +429,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
|
|
|
| // Provide a redundant load message for that module.
|
| - module_database_->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| - kGoodAddress1);
|
| + module_database()->OnModuleLoad(kPid1, kCreateTime1, dll1_, kSize1, kTime1,
|
| + kGoodAddress1);
|
| EXPECT_EQ(1u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
|
|
| @@ -443,8 +446,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p1->second.loaded_modules));
|
|
|
| // Load a second module into the process.
|
| - module_database_->OnModuleLoad(kPid1, kCreateTime1, dll2_, kSize2, kTime2,
|
| - kGoodAddress2);
|
| + module_database()->OnModuleLoad(kPid1, kCreateTime1, dll2_, kSize2, kTime2,
|
| + kGoodAddress2);
|
| EXPECT_EQ(2u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
|
|
| @@ -462,7 +465,7 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(1u, ModuleIdCount(m2->first.module_id, p1->second.loaded_modules));
|
|
|
| // Unload the second module.
|
| - module_database_->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress2);
|
| + module_database()->OnModuleUnload(kPid1, kCreateTime1, kGoodAddress2);
|
| EXPECT_EQ(2u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
|
|
| @@ -480,8 +483,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| ModuleIdCount(m2->first.module_id, p1->second.unloaded_modules));
|
|
|
| // Start a process.
|
| - module_database_->OnProcessStarted(kPid2, kCreateTime2,
|
| - content::PROCESS_TYPE_RENDERER);
|
| + module_database()->OnProcessStarted(kPid2, kCreateTime2,
|
| + content::PROCESS_TYPE_RENDERER);
|
| EXPECT_EQ(2u, modules().size());
|
| EXPECT_EQ(2u, processes().size());
|
| auto p2 = processes().rbegin();
|
| @@ -492,8 +495,8 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(0u, p2->second.unloaded_modules.size());
|
|
|
| // Load the dummy.dll in the second process as well.
|
| - module_database_->OnModuleLoad(kPid2, kCreateTime2, dll1_, kSize1, kTime1,
|
| - kGoodAddress1);
|
| + module_database()->OnModuleLoad(kPid2, kCreateTime2, dll1_, kSize1, kTime1,
|
| + kGoodAddress1);
|
| EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
|
| ProcessTypeToBit(content::PROCESS_TYPE_RENDERER),
|
| m1->second.process_types);
|
| @@ -505,7 +508,7 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| EXPECT_EQ(1u, ModuleIdCount(m1->first.module_id, p2->second.loaded_modules));
|
|
|
| // End the second process without an explicit unload. This invalidates |p2|.
|
| - module_database_->OnProcessEnded(kPid2, kCreateTime2);
|
| + module_database()->OnProcessEnded(kPid2, kCreateTime2);
|
| EXPECT_EQ(2u, modules().size());
|
| EXPECT_EQ(1u, processes().size());
|
| EXPECT_EQ(kPid1, p1->first.process_id);
|
| @@ -517,7 +520,7 @@ TEST_F(ModuleDatabaseTest, DatabaseIsConsistent) {
|
| m2->second.process_types);
|
|
|
| // End the first process without an explicit unload. This invalidates |p1|.
|
| - module_database_->OnProcessEnded(kPid1, kCreateTime1);
|
| + module_database()->OnProcessEnded(kPid1, kCreateTime1);
|
| EXPECT_EQ(2u, modules().size());
|
| EXPECT_EQ(0u, processes().size());
|
| EXPECT_EQ(ProcessTypeToBit(content::PROCESS_TYPE_BROWSER) |
|
|
|