diff options
Diffstat (limited to 'chromium/chrome_elf/chrome_elf_util_unittest.cc')
-rw-r--r-- | chromium/chrome_elf/chrome_elf_util_unittest.cc | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/chromium/chrome_elf/chrome_elf_util_unittest.cc b/chromium/chrome_elf/chrome_elf_util_unittest.cc new file mode 100644 index 00000000000..1cb6488ecaa --- /dev/null +++ b/chromium/chrome_elf/chrome_elf_util_unittest.cc @@ -0,0 +1,186 @@ +// Copyright 2014 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_elf/chrome_elf_util.h" + +#include <tuple> + +#include "base/test/test_reg_util_win.h" +#include "base/win/registry.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + +namespace { + +const wchar_t kRegPathClientState[] = L"Software\\Google\\Update\\ClientState"; +const wchar_t kRegPathClientStateMedium[] = + L"Software\\Google\\Update\\ClientStateMedium"; +const wchar_t kRegValueUsageStats[] = L"usagestats"; +const wchar_t kUninstallArgumentsField[] = L"UninstallArguments"; + +const wchar_t kAppGuidCanary[] = + L"{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}"; +const wchar_t kAppGuidGoogleChrome[] = + L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; +const wchar_t kAppGuidGoogleBinaries[] = + L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}"; + +const wchar_t kCanaryExePath[] = + L"C:\\Users\\user\\AppData\\Local\\Google\\Chrome SxS\\Application" + L"\\chrome.exe"; +const wchar_t kChromeSystemExePath[] = + L"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"; +const wchar_t kChromeUserExePath[] = + L"C:\\Users\\user\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"; +const wchar_t kChromiumExePath[] = + L"C:\\Users\\user\\AppData\\Local\\Chromium\\Application\\chrome.exe"; + + +TEST(ChromeElfUtilTest, CanaryTest) { + EXPECT_TRUE(IsCanary(kCanaryExePath)); + EXPECT_FALSE(IsCanary(kChromeUserExePath)); + EXPECT_FALSE(IsCanary(kChromiumExePath)); +} + +TEST(ChromeElfUtilTest, SystemInstallTest) { + EXPECT_TRUE(IsSystemInstall(kChromeSystemExePath)); + EXPECT_FALSE(IsSystemInstall(kChromeUserExePath)); +} + +// Parameterized test with paramters: +// 1: product: "canary" or "google" +// 2: install level: "user" or "system" +// 3: install mode: "single" or "multi" +class ChromeElfUtilTest : + public testing::TestWithParam<std::tuple<const char*, + const char*, + const char*> > { + protected: + virtual void SetUp() OVERRIDE { + override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE, + L"chrome_elf_test_local"); + override_manager_.OverrideRegistry(HKEY_CURRENT_USER, + L"chrome_elf_test_current"); + const char* app; + const char* level; + const char* mode; + std::tie(app, level, mode) = GetParam(); + is_canary_ = (std::string(app) == "canary"); + system_level_ = (std::string(level) != "user"); + multi_install_ = (std::string(mode) != "single"); + if (is_canary_) { + ASSERT_FALSE(system_level_); + ASSERT_FALSE(multi_install_); + app_guid_ = kAppGuidCanary; + chrome_path_ = kCanaryExePath; + } else { + app_guid_ = kAppGuidGoogleChrome; + chrome_path_ = (system_level_ ? kChromeSystemExePath : + kChromeUserExePath); + } + if (multi_install_) { + SetMultiInstallStateInRegistry(system_level_, true); + app_guid_ = kAppGuidGoogleBinaries; + } + } + + base::string16 BuildKey(const wchar_t* path, const wchar_t* guid) { + base::string16 full_key_path(path); + full_key_path.append(1, L'\\'); + full_key_path.append(guid); + return full_key_path; + } + + void SetUsageStat(DWORD value, bool state_medium) { + LONG result = base::win::RegKey( + system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, + BuildKey(state_medium ? kRegPathClientStateMedium : kRegPathClientState, + app_guid_).c_str(), + KEY_SET_VALUE).WriteValue(kRegValueUsageStats, value); + ASSERT_EQ(ERROR_SUCCESS, result); + } + + void SetMultiInstallStateInRegistry(bool system_install, bool multi) { + base::win::RegKey key( + system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, + BuildKey(kRegPathClientState, kAppGuidGoogleChrome).c_str(), + KEY_SET_VALUE); + LONG result; + if (multi) { + result = key.WriteValue(kUninstallArgumentsField, + L"yadda yadda --multi-install yadda yadda"); + } else { + result = key.DeleteValue(kUninstallArgumentsField); + } + ASSERT_EQ(ERROR_SUCCESS, result); + } + + const wchar_t* app_guid_; + const wchar_t* chrome_path_; + bool system_level_; + bool multi_install_; + bool is_canary_; + registry_util::RegistryOverrideManager override_manager_; +}; + +TEST_P(ChromeElfUtilTest, MultiInstallTest) { + if (is_canary_) + return; + SetMultiInstallStateInRegistry(system_level_, true); + EXPECT_TRUE(IsMultiInstall(system_level_)); + + SetMultiInstallStateInRegistry(system_level_, false); + EXPECT_FALSE(IsMultiInstall(system_level_)); +} + +TEST_P(ChromeElfUtilTest, UsageStatsAbsent) { + EXPECT_FALSE(AreUsageStatsEnabled(chrome_path_)); +} + +TEST_P(ChromeElfUtilTest, UsageStatsZero) { + SetUsageStat(0, false); + EXPECT_FALSE(AreUsageStatsEnabled(chrome_path_)); +} + +TEST_P(ChromeElfUtilTest, UsageStatsOne) { + SetUsageStat(1, false); + EXPECT_TRUE(AreUsageStatsEnabled(chrome_path_)); + if (is_canary_) { + EXPECT_FALSE(AreUsageStatsEnabled(kChromeUserExePath)); + EXPECT_FALSE(AreUsageStatsEnabled(kChromeSystemExePath)); + } else if (system_level_) { + EXPECT_FALSE(AreUsageStatsEnabled(kCanaryExePath)); + EXPECT_FALSE(AreUsageStatsEnabled(kChromeUserExePath)); + } else { + EXPECT_FALSE(AreUsageStatsEnabled(kCanaryExePath)); + EXPECT_FALSE(AreUsageStatsEnabled(kChromeSystemExePath)); + } +} + +TEST_P(ChromeElfUtilTest, UsageStatsZeroInStateMedium) { + if (!system_level_) + return; + SetUsageStat(0, true); + EXPECT_FALSE(AreUsageStatsEnabled(chrome_path_)); +} + +TEST_P(ChromeElfUtilTest, UsageStatsOneInStateMedium) { + if (!system_level_) + return; + SetUsageStat(1, true); + EXPECT_TRUE(AreUsageStatsEnabled(chrome_path_)); + EXPECT_FALSE(AreUsageStatsEnabled(kCanaryExePath)); + EXPECT_FALSE(AreUsageStatsEnabled(kChromeUserExePath)); +} + +INSTANTIATE_TEST_CASE_P(Canary, ChromeElfUtilTest, + testing::Combine(testing::Values("canary"), + testing::Values("user"), + testing::Values("single"))); +INSTANTIATE_TEST_CASE_P(GoogleChrome, ChromeElfUtilTest, + testing::Combine(testing::Values("google"), + testing::Values("user", "system"), + testing::Values("single", "multi"))); + +} // namespace |