Index: chrome_elf/chrome_elf_util_unittest.cc |
diff --git a/chrome_elf/chrome_elf_util_unittest.cc b/chrome_elf/chrome_elf_util_unittest.cc |
index 3a9f441944b98b9d2ec4c5d214107a4d42bd291b..9f2a6846ad24c28aa94624e619b6eda852274afe 100644 |
--- a/chrome_elf/chrome_elf_util_unittest.cc |
+++ b/chrome_elf/chrome_elf_util_unittest.cc |
@@ -8,12 +8,26 @@ |
#include "base/test/test_reg_util_win.h" |
#include "base/win/registry.h" |
+#include "chrome/install_static/install_util.h" |
#include "chrome_elf/chrome_elf_constants.h" |
#include "chrome_elf/chrome_elf_security.h" |
#include "chrome_elf/nt_registry/nt_registry.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/platform_test.h" |
+ |
+using namespace install_static; |
namespace { |
+ |
+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"; |
bool SetSecurityFinchFlag(bool creation) { |
bool success = true; |
@@ -79,6 +93,23 @@ |
ASSERT_TRUE(nt::SetTestingOverride(nt::HKLM, base::string16())); |
} |
+TEST(ChromeElfUtilTest, CanaryTest) { |
+ EXPECT_TRUE(IsSxSChrome(kCanaryExePath)); |
+ EXPECT_FALSE(IsSxSChrome(kChromeUserExePath)); |
+ EXPECT_FALSE(IsSxSChrome(kChromiumExePath)); |
+} |
+ |
+TEST(ChromeElfUtilTest, SystemInstallTest) { |
+ EXPECT_TRUE(IsSystemInstall(kChromeSystemExePath)); |
+ EXPECT_FALSE(IsSystemInstall(kChromeUserExePath)); |
+} |
+ |
+TEST(ChromeElfUtilTest, BrowserProcessTest) { |
+ EXPECT_EQ(ProcessType::UNINITIALIZED, g_process_type); |
+ InitializeProcessType(); |
+ EXPECT_FALSE(IsNonBrowserProcess()); |
+} |
+ |
TEST(ChromeElfUtilTest, BrowserProcessSecurityTest) { |
if (!::IsWindows8OrGreater()) |
return; |
@@ -100,4 +131,392 @@ |
CancelRegRedirect(nt::HKCU); |
} |
+// 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: |
+ void SetUp() override { |
+ // Set up registry override for these tests. |
+ RegRedirect(nt::HKLM, &override_manager_); |
+ RegRedirect(nt::HKCU, &override_manager_); |
+ |
+ 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; |
+ } |
+ } |
+ |
+ void TearDown() override { |
+ CancelRegRedirect(nt::HKCU); |
+ CancelRegRedirect(nt::HKLM); |
+ } |
+ |
+ 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); |
+ } |
+ |
+ void SetChannelName(const base::string16& channel_name) { |
+ LONG result = |
+ base::win::RegKey( |
+ system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, |
+ BuildKey(kRegPathClientState, app_guid_).c_str(), KEY_SET_VALUE) |
+ .WriteValue(kRegApField, channel_name.c_str()); |
+ ASSERT_EQ(ERROR_SUCCESS, result); |
+ } |
+ |
+ // This function tests the install_static::GetChromeChannelName function and |
+ // is based on the ChannelInfoTest.Channels in channel_info_unittest.cc. |
+ // The |add_modifier| parameter controls whether we expect modifiers in the |
+ // returned channel name. |
+ void PerformChannelNameTests(bool add_modifier) { |
+ // We can't test the channel name correctly for canary mode because the |
+ // install_static checks whether an exe is a canary executable is based on |
+ // the path where the exe is running from. |
+ if (is_canary_) |
+ return; |
+ SetChannelName(L""); |
+ base::string16 channel; |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"-full"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"1.1-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"1.1-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"1.1-bar"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"1n1-foobar"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"foo-1.1-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ SetChannelName(L"2.0-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"2.0-dev"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"dev-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelDev, channel.c_str()); |
+ } |
+ SetChannelName(L"2.0-DEV"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"dev-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelDev, channel.c_str()); |
+ } |
+ SetChannelName(L"2.0-dev-eloper"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"dev-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelDev, channel.c_str()); |
+ } |
+ SetChannelName(L"2.0-doom"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"dev-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelDev, channel.c_str()); |
+ } |
+ SetChannelName(L"250-doom"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"dev-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelDev, channel.c_str()); |
+ } |
+ SetChannelName(L"bar-2.0-dev"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ SetChannelName(L"1.0-dev"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"x64-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ SetChannelName(L"bar-x64-beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ SetChannelName(L"x64-Beta"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"beta-m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelBeta, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"x64-stable"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ SetChannelName(L"baz-x64-stable"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ SetChannelName(L"x64-Stable"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ |
+ SetChannelName(L"fuzzy"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ SetChannelName(L"foo"); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()); |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()); |
+ } |
+ // Variations on stable channel. |
+ static constexpr const wchar_t* kStableApValues[] = { |
+ L"-multi-chrome", |
+ L"x64-stable-multi-chrome", |
+ L"-stage:ensemble_patching-multi-chrome-full", |
+ L"-multi-chrome-full", |
+ }; |
+ for (const wchar_t* ap_value : kStableApValues) { |
+ SetChannelName(ap_value); |
+ install_static::GetChromeChannelName(!system_level_, add_modifier, |
+ &channel); |
+ if (multi_install_ && add_modifier) { |
+ EXPECT_STREQ(L"m", channel.c_str()) << ap_value; |
+ } else { |
+ EXPECT_STREQ(install_static::kChromeChannelStable, channel.c_str()) |
+ << ap_value; |
+ } |
+ } |
+ } |
+ |
+ 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(GetCollectStatsConsentForTesting(chrome_path_)); |
+} |
+ |
+TEST_P(ChromeElfUtilTest, UsageStatsZero) { |
+ SetUsageStat(0, false); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(chrome_path_)); |
+} |
+ |
+TEST_P(ChromeElfUtilTest, UsageStatsOne) { |
+ SetUsageStat(1, false); |
+ EXPECT_TRUE(GetCollectStatsConsentForTesting(chrome_path_)); |
+ if (is_canary_) { |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kChromeUserExePath)); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kChromeSystemExePath)); |
+ } else if (system_level_) { |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kCanaryExePath)); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kChromeUserExePath)); |
+ } else { |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kCanaryExePath)); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kChromeSystemExePath)); |
+ } |
+} |
+ |
+TEST_P(ChromeElfUtilTest, UsageStatsZeroInStateMedium) { |
+ if (!system_level_) |
+ return; |
+ SetUsageStat(0, true); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(chrome_path_)); |
+} |
+ |
+TEST_P(ChromeElfUtilTest, UsageStatsOneInStateMedium) { |
+ if (!system_level_) |
+ return; |
+ SetUsageStat(1, true); |
+ EXPECT_TRUE(GetCollectStatsConsentForTesting(chrome_path_)); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kCanaryExePath)); |
+ EXPECT_FALSE(GetCollectStatsConsentForTesting(kChromeUserExePath)); |
+} |
+ |
+// TODO(ananta) |
+// Move this to install_static_unittests. |
+// http://crbug.com/604923 |
+// This test tests the install_static::GetChromeChannelName function and is |
+// based on the ChannelInfoTest.Channels in channel_info_unittest.cc |
+TEST_P(ChromeElfUtilTest, InstallStaticGetChannelNameTest) { |
+ PerformChannelNameTests(true); // add_modifier |
+ PerformChannelNameTests(false); // !add_modifier |
+} |
+ |
+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 |