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

Unified Diff: chrome/common/conflicts/module_watcher_win_unittest.cc

Issue 2473783005: [Win] Create ModuleWatcher. (Closed)
Patch Set: Small cleanup. Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/common/conflicts/module_watcher_win_unittest.cc
diff --git a/chrome/common/conflicts/module_watcher_win_unittest.cc b/chrome/common/conflicts/module_watcher_win_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1ddad698f935f6deb65dd48cb903bef764f81178
--- /dev/null
+++ b/chrome/common/conflicts/module_watcher_win_unittest.cc
@@ -0,0 +1,115 @@
+// Copyright 2016 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/common/conflicts/module_watcher_win.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class ModuleWatcherTest : public testing::Test {
+ public:
+ ModuleWatcherTest()
+ : module_(nullptr),
+ module_event_count_(0),
+ module_already_loaded_event_count_(0),
+ module_loaded_event_count_(0),
+ module_unloaded_event_count_(0) {}
+
+ void OnModuleEvent(const mojom::ModuleEvent& event) {
+ module_event_count_++;
grt (UTC plus 2) 2016/11/10 08:52:13 prefer preincrement always
chrisha 2016/11/14 16:06:45 Done.
+ switch (event.event_type) {
+ case mojom::ModuleEventType::MODULE_ALREADY_LOADED:
+ module_already_loaded_event_count_++;
+ break;
+ case mojom::ModuleEventType::MODULE_LOADED:
+ module_loaded_event_count_++;
+ break;
+ case mojom::ModuleEventType::MODULE_UNLOADED:
+ module_unloaded_event_count_++;
+ break;
+ }
+ }
+
+ void TearDown() override { UnloadModule(); }
+
+ void LoadModule() {
+ if (module_)
+ return;
+ // This module should not be a static dependency of the unit-test
+ // executable, but should be a build-system dependency or a module that is
+ // present on any Windows machine.
+ static const wchar_t kModuleName[] = L"chrome.dll";
grt (UTC plus 2) 2016/11/10 08:52:13 nit: static constexpr
grt (UTC plus 2) 2016/11/10 08:52:13 is chrome.dll already a datadep of the unit_tests
chrisha 2016/11/14 16:06:45 Yeah, it's already a dependency of the unit_tests
chrisha 2016/11/14 16:06:45 Done.
+ // The module should not already be loaded.
+ ASSERT_FALSE(::GetModuleHandle(kModuleName));
+ // It should load successfully.
+ module_ = ::LoadLibrary(kModuleName);
+ ASSERT_TRUE(module_);
+ }
+
+ void UnloadModule() {
+ if (!module_)
+ return;
+ ::FreeLibrary(module_);
+ module_ = nullptr;
+ }
+
+ std::unique_ptr<ModuleWatcher> Create() {
+ return ModuleWatcher::Create(
+ base::Bind(&ModuleWatcherTest::OnModuleEvent, base::Unretained(this)));
+ }
+
+ // Holds a handle to a loaded module.
+ HMODULE module_;
+
+ // Total number of module events seen.
+ size_t module_event_count_;
+ // Total number of MODULE_ALREADY_LOADED events seen.
+ size_t module_already_loaded_event_count_;
+ // Total number of MODULE_LOADED events seen.
+ size_t module_loaded_event_count_;
+ // Total number of MODULE_UNLOADED events seen.
+ size_t module_unloaded_event_count_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ModuleWatcherTest);
+};
+
+TEST_F(ModuleWatcherTest, SingleModuleWatcherOnly) {
+ std::unique_ptr<ModuleWatcher> mw1(Create());
+ EXPECT_TRUE(mw1.get());
+
+ std::unique_ptr<ModuleWatcher> mw2(Create());
+ EXPECT_FALSE(mw2.get());
+}
+
+TEST_F(ModuleWatcherTest, ModuleEvents) {
+ // Create the module watcher. This should immediately enumerate all already
+ // loaded modules.
+ std::unique_ptr<ModuleWatcher> mw(Create());
+ EXPECT_LT(0u, module_event_count_);
grt (UTC plus 2) 2016/11/10 08:52:13 the counts are unsigned, so just check for equalit
chrisha 2016/11/14 16:06:45 You're suggested that _NE is more readable that _L
grt (UTC plus 2) 2016/11/14 20:30:31 okay. now that i think about it, the counts should
+ EXPECT_LT(0u, module_already_loaded_event_count_);
+ EXPECT_EQ(0u, module_loaded_event_count_);
+ EXPECT_EQ(0u, module_unloaded_event_count_);
+
+ // Dynamically load a module and ensure it a notification is received for it.
+ LoadModule();
+ EXPECT_EQ(1u, module_loaded_event_count_);
grt (UTC plus 2) 2016/11/10 08:52:13 does this assume that the loaded module doesn't al
chrisha 2016/11/14 16:06:45 I just want to ensure that at least one module get
grt (UTC plus 2) 2016/11/14 20:30:31 great. that addresses my concern -- that in some c
+
+ // Unload the module and ensure another notification is received.
+ UnloadModule();
+ EXPECT_EQ(1u, module_unloaded_event_count_);
+
+ // Dynamically load a module and ensure it a notification is received for it.
+ LoadModule();
+ EXPECT_EQ(2u, module_loaded_event_count_);
+
+ // Destroy the module watcher.
+ mw.reset();
+
+ // Unload the module and ensure no notification is received this time.
+ UnloadModule();
+ EXPECT_EQ(1u, module_unloaded_event_count_);
+}

Powered by Google App Engine
This is Rietveld 408576698