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

Unified Diff: chrome/browser/conflicts/installed_programs_win_unittest.cc

Issue 2854983002: Add the ThirdPartyModules.Uninstallable histogram. (Closed)
Patch Set: Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/conflicts/installed_programs_win_unittest.cc
diff --git a/chrome/browser/conflicts/installed_programs_win_unittest.cc b/chrome/browser/conflicts/installed_programs_win_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..77f04644778d7a2555449c6a35ec030707182e1b
--- /dev/null
+++ b/chrome/browser/conflicts/installed_programs_win_unittest.cc
@@ -0,0 +1,228 @@
+// 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/installed_programs_win.h"
+
+#include <map>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/scoped_task_scheduler.h"
+#include "base/test/test_reg_util_win.h"
+#include "base/win/registry.h"
+#include "chrome/browser/conflicts/msi_util_win.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+struct FakeMSIProgram {
+ base::string16 product_guid;
+ bool is_system_component;
+ bool is_microsoft_published;
+ base::string16 display_name;
+ base::string16 uninstall_string;
+ std::vector<base::string16> components;
+};
+
+class InstalledProgramsTest : public testing::Test {
+ public:
+ InstalledProgramsTest();
+ ~InstalledProgramsTest();
+
+ void SetUp() override;
+
+ void SetUpFakeMSIProgram(const FakeMSIProgram& fake_msi_program);
+
+ private:
+ // Used to override the real GetMsiComponentPaths().
+ bool FakeGetMsiComponentPaths(const base::string16& product_guid,
+ std::vector<base::string16>* component_paths);
+
+ base::test::ScopedTaskScheduler scoped_task_scheduler_;
+ registry_util::RegistryOverrideManager registry_override_manager_;
+
+ // Override GetMsiComponentPaths(). The mapping from input to output is
+ // managed by component_paths_map_.
+ ScopedGetMsiComponentPathsOverride scoped_get_msi_component_paths_override_;
+ std::map<base::string16, std::vector<base::string16>> component_paths_map_;
+
+ DISALLOW_COPY_AND_ASSIGN(InstalledProgramsTest);
+};
+
+InstalledProgramsTest::InstalledProgramsTest()
+ : scoped_get_msi_component_paths_override_(
+ base::Bind(&InstalledProgramsTest::FakeGetMsiComponentPaths,
+ base::Unretained(this))) {}
+
+InstalledProgramsTest::~InstalledProgramsTest() = default;
+
+// ASSERT_NO_FATAL_FAILURE cannot be used in a constructor.
+void InstalledProgramsTest::SetUp() {
+ ASSERT_NO_FATAL_FAILURE(
+ registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE));
+ ASSERT_NO_FATAL_FAILURE(
+ registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER));
+}
+
+void InstalledProgramsTest::SetUpFakeMSIProgram(
+ const FakeMSIProgram& fake_msi_program) {
+ // Create the registry entry.
+ const wchar_t kUninstallKeyPath[] =
+ L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
+ base::win::RegKey key(
+ HKEY_CURRENT_USER,
+ base::StringPrintf(L"%ls\\%ls", kUninstallKeyPath,
+ fake_msi_program.product_guid.c_str())
+ .c_str(),
+ KEY_WRITE);
+
+ key.WriteValue(L"SystemComponent",
+ fake_msi_program.is_system_component ? 1 : 0);
+ key.WriteValue(L"UninstallString", fake_msi_program.uninstall_string.c_str());
+ if (fake_msi_program.is_microsoft_published)
+ key.WriteValue(L"Publisher", L"Microsoft Corporation");
+ key.WriteValue(L"DisplayName", fake_msi_program.display_name.c_str());
+
+ component_paths_map_.insert(std::make_pair(fake_msi_program.product_guid,
+ fake_msi_program.components));
+}
+
+bool InstalledProgramsTest::FakeGetMsiComponentPaths(
+ const base::string16& product_guid,
+ std::vector<base::string16>* component_paths) {
+ auto iter = component_paths_map_.find(product_guid);
+ if (iter == component_paths_map_.end())
+ return false;
+
+ *component_paths = iter->second;
+ return true;
+}
+
+} // namespace
+
+TEST_F(InstalledProgramsTest, InstalledPrograms) {
+ // Some properties that are used multiple time are defined here to avoid
+ // duplication.
+ const wchar_t kValidDisplayName[] = L"ADisplayName";
+ const wchar_t kValidUninstallString[] = L"AnUninstallString";
+ const wchar_t kValidComponentPath[] = L"c:\\a\\valid\\file\\name.dll";
+
+ std::pair<FakeMSIProgram, bool> kTestCases[] = {
+ {
+ {
+ L"", // Empty GUID.
+ false,
+ false,
+ kValidDisplayName,
+ kValidUninstallString,
+ {
+ kValidComponentPath,
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"Empty DisplayName",
+ false,
+ false,
+ L"",
+ kValidUninstallString,
+ {
+ kValidComponentPath,
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"Empty UninstallString",
+ false,
+ false,
+ kValidDisplayName,
+ L"",
+ {
+ kValidComponentPath,
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"IsSystemComponent",
+ true,
+ false,
+ kValidDisplayName,
+ kValidUninstallString,
+ {
+ kValidComponentPath,
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"MicrosoftPublished",
+ false,
+ true,
+ kValidDisplayName,
+ kValidUninstallString,
+ {
+ kValidComponentPath,
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"NoValidComponents",
+ false,
+ false,
+ kValidDisplayName,
+ kValidUninstallString,
+ {
+ L"02:\\registry\\path", L"c:\\not\\dll\\path.txt",
+ },
+ },
+ false,
+ },
+ {
+ {
+ L"ValidEntry",
+ false,
+ false,
+ L"Name5",
+ kValidUninstallString,
+ {
+ L"c:\\valid\\path\\test.dll", L"c:\\valid\\path\\another.dll",
+ },
+ },
+ true,
+ },
+ };
+
+ for (const auto& test_case : kTestCases)
+ SetUpFakeMSIProgram(test_case.first);
+
+ InstalledPrograms installed_programs;
+
+ installed_programs.Initialize(base::Closure());
+
+ base::RunLoop().RunUntilIdle();
+
+ for (const auto& test_case : kTestCases) {
+ for (const auto& path : test_case.first.components) {
+ base::string16 display_name;
+ EXPECT_EQ(test_case.second, installed_programs.GetInstalledProgramName(
+ base::FilePath(path), &display_name));
+ if (test_case.second) {
+ EXPECT_EQ(test_case.first.display_name, display_name);
+ }
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698