| Index: chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
|
| diff --git a/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8b88fceabe00cc67215c2bd1e192c4448972e2ef
|
| --- /dev/null
|
| +++ b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
|
| @@ -0,0 +1,86 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/conflicts/module_event_sink_impl_win.h"
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "chrome/browser/conflicts/module_database_win.h"
|
| +#include "chrome/common/conflicts/module_watcher_win.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace {
|
| +
|
| +// The address of this module in memory. The linker will take care of defining
|
| +// this symbol.
|
| +extern "C" IMAGE_DOS_HEADER __ImageBase;
|
| +
|
| +// An invalid load address.
|
| +const uint64_t kInvalidLoadAddress = 0xDEADBEEF;
|
| +
|
| +} // namespace
|
| +
|
| +class ModuleEventSinkImplTest : public testing::Test {
|
| + protected:
|
| + ModuleEventSinkImplTest()
|
| + : message_loop_(base::MakeUnique<base::MessageLoop>()),
|
| + module_database_(
|
| + base::MakeUnique<ModuleDatabase>(message_loop_->task_runner())) {}
|
| +
|
| + void CreateModuleSinkImpl() {
|
| + module_event_sink_impl_ = base::MakeUnique<ModuleEventSinkImpl>(
|
| + ::GetCurrentProcess(), content::PROCESS_TYPE_BROWSER,
|
| + module_database_.get());
|
| + }
|
| +
|
| + ModuleDatabase* module_database() {
|
| + return module_event_sink_impl_->module_database_;
|
| + }
|
| +
|
| + const ModuleDatabase::ModuleMap& modules() {
|
| + return module_database_->modules_;
|
| + }
|
| +
|
| + const ModuleDatabase::ProcessMap& processes() {
|
| + return module_database_->processes_;
|
| + }
|
| +
|
| + uint32_t process_id() { return module_event_sink_impl_->process_id_; }
|
| +
|
| + std::unique_ptr<base::MessageLoop> message_loop_;
|
| + std::unique_ptr<ModuleDatabase> module_database_;
|
| + std::unique_ptr<ModuleEventSinkImpl> module_event_sink_impl_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ModuleEventSinkImplTest);
|
| +};
|
| +
|
| +TEST_F(ModuleEventSinkImplTest, CallsForwardedAsExpected) {
|
| + const uintptr_t kValidLoadAddress = reinterpret_cast<uintptr_t>(&__ImageBase);
|
| +
|
| + EXPECT_EQ(0u, modules().size());
|
| + EXPECT_EQ(0u, processes().size());
|
| +
|
| + // Construction should immediately fire off a call to OnProcessStarted and
|
| + // create a process entry in the module database.
|
| + CreateModuleSinkImpl();
|
| + EXPECT_EQ(module_database_.get(), module_database());
|
| + EXPECT_EQ(::GetCurrentProcessId(), process_id());
|
| + EXPECT_EQ(0u, modules().size());
|
| + EXPECT_EQ(1u, processes().size());
|
| +
|
| + // An invalid load event should not cause a module entry.
|
| + module_event_sink_impl_->OnModuleEvent(
|
| + mojom::ModuleEventType::MODULE_ALREADY_LOADED, kInvalidLoadAddress);
|
| + EXPECT_EQ(0u, modules().size());
|
| + EXPECT_EQ(1u, processes().size());
|
| +
|
| + // A valid load event should cause a module entry.
|
| + module_event_sink_impl_->OnModuleEvent(mojom::ModuleEventType::MODULE_LOADED,
|
| + kValidLoadAddress);
|
| + EXPECT_EQ(1u, modules().size());
|
| + EXPECT_EQ(1u, processes().size());
|
| +}
|
|
|