diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-31 03:59:20 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-31 03:59:20 +0000 |
commit | ebcb5207a92da2acf2034d4e2d9054b76b41c6d5 (patch) | |
tree | 6d6f2244e08bf66427f9734cf35e9a29dfa6f3d8 /chrome/installer/gcapi/gcapi_reactivation_test.cc | |
parent | 716a6125dd1633606261ba49b30408a466a6fc44 (diff) | |
download | chromium_src-ebcb5207a92da2acf2034d4e2d9054b76b41c6d5.zip chromium_src-ebcb5207a92da2acf2034d4e2d9054b76b41c6d5.tar.gz chromium_src-ebcb5207a92da2acf2034d4e2d9054b76b41c6d5.tar.bz2 |
Implementation of GCAPI reactivation.
Also, some cleanup in gcapi_tests such that it now only runs gtest tests by default.
BUG=111453
TEST=gcapi_tests.exe
Review URL: https://chromiumcodereview.appspot.com/9288056
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/installer/gcapi/gcapi_reactivation_test.cc')
-rw-r--r-- | chrome/installer/gcapi/gcapi_reactivation_test.cc | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/chrome/installer/gcapi/gcapi_reactivation_test.cc b/chrome/installer/gcapi/gcapi_reactivation_test.cc new file mode 100644 index 0000000..9cadafc --- /dev/null +++ b/chrome/installer/gcapi/gcapi_reactivation_test.cc @@ -0,0 +1,186 @@ +// Copyright (c) 2012 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 <string> + +#include "base/basictypes.h" +#include "base/string_number_conversions.h" +#include "base/stringprintf.h" +#include "base/test/test_reg_util_win.h" +#include "base/time.h" +#include "base/utf_string_conversions.h" +#include "base/win/registry.h" +#include "chrome/common/guid.h" +#include "chrome/installer/gcapi/gcapi.h" +#include "chrome/installer/gcapi/gcapi_reactivation.h" +#include "chrome/installer/util/google_update_constants.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::Time; +using base::TimeDelta; +using base::win::RegKey; + + +class GCAPIReactivationTest : public ::testing::Test { + protected: + void SetUp() { + // Override keys - this is undone during destruction. + std::wstring hkcu_override = base::StringPrintf( + L"hkcu_override\\%ls", ASCIIToWide(guid::GenerateGUID())); + override_manager_.OverrideRegistry(HKEY_CURRENT_USER, hkcu_override); + } + + bool SetChromeInstallMarker(HKEY hive) { + // Create the client state keys in the right places. + std::wstring reg_path(google_update::kRegPathClients); + reg_path += L"\\"; + reg_path += google_update::kChromeUpgradeCode; + RegKey client_state(hive, + reg_path.c_str(), + KEY_CREATE_SUB_KEY | KEY_SET_VALUE); + return (client_state.Valid() && + client_state.WriteValue( + google_update::kRegVersionField, L"1.2.3.4") == ERROR_SUCCESS); + } + + bool SetLastRunTime(HKEY hive, int64 last_run_time) { + return SetLastRunTimeString(hive, base::Int64ToString16(last_run_time)); + } + + bool SetLastRunTimeString(HKEY hive, const string16& last_run_time_string) { + const wchar_t* base_path = + (hive == HKEY_LOCAL_MACHINE) ? + google_update::kRegPathClientStateMedium : + google_update::kRegPathClientState; + std::wstring path(base_path); + path += L"\\"; + path += google_update::kChromeUpgradeCode; + + RegKey client_state(hive, path.c_str(), KEY_SET_VALUE); + return (client_state.Valid() && + client_state.WriteValue( + google_update::kRegLastRunTimeField, + last_run_time_string.c_str()) == ERROR_SUCCESS); + } + + std::wstring GetReactivationString(HKEY hive) { + const wchar_t* base_path = + (hive == HKEY_LOCAL_MACHINE) ? + google_update::kRegPathClientStateMedium : + google_update::kRegPathClientState; + std::wstring path(base_path); + path += L"\\"; + path += google_update::kChromeUpgradeCode; + + RegKey client_state(hive, path.c_str(), KEY_QUERY_VALUE); + if (client_state.Valid()) { + std::wstring actual_brand; + if (client_state.ReadValue(google_update::kRegRLZReactivationBrandField, + &actual_brand) == ERROR_SUCCESS) { + return actual_brand; + } + } + + return L"ERROR"; + } + + private: + registry_util::RegistryOverrideManager override_manager_; +}; + +TEST_F(GCAPIReactivationTest, CheckSetReactivationBrandCode) { + EXPECT_TRUE(SetReactivationBrandCode(L"GAGA")); + EXPECT_EQ(L"GAGA", GetReactivationString(HKEY_CURRENT_USER)); + + std::vector<std::wstring> check_codes; + check_codes.push_back(L"GAGA"); + EXPECT_TRUE(HasBeenReactivatedByBrandCodes(check_codes)); + + check_codes.push_back(L"GOOGOO"); + EXPECT_TRUE(HasBeenReactivatedByBrandCodes(check_codes)); + + check_codes.erase(check_codes.begin()); + EXPECT_FALSE(HasBeenReactivatedByBrandCodes(check_codes)); +} + +TEST_F(GCAPIReactivationTest, CanOfferReactivation_Basic) { + const wchar_t* previous_brands[] = {L"GOOGOO", L"MAMA", L"DADA"}; + DWORD error; + + // We're not installed yet. Make sure CanOfferReactivation fails. + EXPECT_FALSE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_NOTINSTALLED, error); + + // Now pretend to be installed. CanOfferReactivation should pass. + EXPECT_TRUE(SetChromeInstallMarker(HKEY_CURRENT_USER)); + EXPECT_TRUE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + + // Now set a recent last_run value. CanOfferReactivation should fail again. + Time hkcu_last_run = Time::NowFromSystemTime() - TimeDelta::FromDays(20); + EXPECT_TRUE(SetLastRunTime(HKEY_CURRENT_USER, + hkcu_last_run.ToInternalValue())); + EXPECT_FALSE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_NOTDORMANT, error); + + // Now set a last_run value that exceeds the threshold. + hkcu_last_run = Time::NowFromSystemTime() - + TimeDelta::FromDays(kReactivationMinDaysDormant); + EXPECT_TRUE(SetLastRunTime(HKEY_CURRENT_USER, + hkcu_last_run.ToInternalValue())); + EXPECT_TRUE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + + // Test some invalid inputs + EXPECT_FALSE(CanOfferReactivation(NULL, arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_INVALID_INPUT, error); + EXPECT_FALSE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + NULL, &error)); + EXPECT_EQ(REACTIVATE_ERROR_INVALID_INPUT, error); + + // One more valid one + EXPECT_TRUE(CanOfferReactivation(L"GAGA", 0, NULL, &error)); + + // Check that the previous brands check works: + EXPECT_TRUE(SetReactivationBrandCode(L"GOOGOO")); + EXPECT_FALSE(CanOfferReactivation(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_ALREADY_REACTIVATED, error); +} + +TEST_F(GCAPIReactivationTest, Reactivation_Flow) { + const wchar_t* previous_brands[] = {L"GOOGOO", L"MAMA", L"DADA"}; + DWORD error; + + // Set us up as a candidate for reactivation. + EXPECT_TRUE(SetChromeInstallMarker(HKEY_CURRENT_USER)); + + Time hkcu_last_run = Time::NowFromSystemTime() - + TimeDelta::FromDays(kReactivationMinDaysDormant); + EXPECT_TRUE(SetLastRunTime(HKEY_CURRENT_USER, + hkcu_last_run.ToInternalValue())); + + EXPECT_TRUE(ReactivateChrome(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(L"GAGA", GetReactivationString(HKEY_CURRENT_USER)); + + // Make sure we can't reactivate again: + EXPECT_FALSE(ReactivateChrome(L"GAGA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_ALREADY_REACTIVATED, error); + + // Should still be able to reactivate under other brands: + EXPECT_TRUE(ReactivateChrome(L"MAMA", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(L"MAMA", GetReactivationString(HKEY_CURRENT_USER)); + + // Validate that previous_brands are rejected: + EXPECT_FALSE(ReactivateChrome(L"PFFT", arraysize(previous_brands), + previous_brands, &error)); + EXPECT_EQ(REACTIVATE_ERROR_ALREADY_REACTIVATED, error); + EXPECT_EQ(L"MAMA", GetReactivationString(HKEY_CURRENT_USER)); +} |