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

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

Issue 2473783005: [Win] Create ModuleWatcher. (Closed)
Patch Set: Refactor threading and observer model. 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..aa3c1ad992e83114120115f5405e702a33f306b5
--- /dev/null
+++ b/chrome/common/conflicts/module_watcher_win_unittest.cc
@@ -0,0 +1,109 @@
+// 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"
+
+namespace conflicts {
+
+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_++;
+ 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";
+ // 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;
+ }
+
+ // 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, ModuleEvents) {
+ // Create the module watcher. This should immediately enumerate all already
+ // loaded modules.
+ std::unique_ptr<ModuleWatcher> mw(new ModuleWatcher(
+ base::Bind(&ModuleWatcherTest::OnModuleEvent, base::Unretained(this))));
+ EXPECT_LT(0u, module_event_count_);
+ 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_);
+
+ // 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_);
+}
+
+} // namespace conflicts

Powered by Google App Engine
This is Rietveld 408576698