summaryrefslogtreecommitdiffstats
path: root/chrome/installer/util
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 03:17:41 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 03:17:41 +0000
commitbb725dc739b494b0ca088ec52ea97381a384a0fa (patch)
treee074c216c1d436ca22f413044e1bc31d96c912d9 /chrome/installer/util
parentb37533a535303d4eaec4a2ad7df3ccf90c84d7c4 (diff)
downloadchromium_src-bb725dc739b494b0ca088ec52ea97381a384a0fa.zip
chromium_src-bb725dc739b494b0ca088ec52ea97381a384a0fa.tar.gz
chromium_src-bb725dc739b494b0ca088ec52ea97381a384a0fa.tar.bz2
Reverting this as it caused installer_unit_tests to fail. Please fix and reland.
Revert 49346 - Fix problem whereby the "-full" magic value is removed from the "ap" value when a differential update for CF fails (it should remain unless the update succeeds). Also, fix problem with installer return codes being squashed. This was a regression introduced in http://src.chromium.org/viewvc/chrome?view=rev&revision=41322. BUG=46051,40607 TEST=Cause a differential update to fail, observe that the "ap" value contains a "-full". Review URL: http://codereview.chromium.org/2773002 TBR=robertshield@chromium.org Review URL: http://codereview.chromium.org/2725007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49359 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/installer/util')
-rw-r--r--chrome/installer/util/chrome_frame_distribution.cc25
-rw-r--r--chrome/installer/util/google_chrome_distribution.cc62
-rw-r--r--chrome/installer/util/google_chrome_distribution.h15
-rw-r--r--chrome/installer/util/google_chrome_distribution_unittest.cc174
-rw-r--r--chrome/installer/util/google_update_settings.cc80
-rw-r--r--chrome/installer/util/google_update_settings.h21
-rw-r--r--chrome/installer/util/google_update_settings_unittest.cc183
-rw-r--r--chrome/installer/util/install_util.cc1
8 files changed, 277 insertions, 284 deletions
diff --git a/chrome/installer/util/chrome_frame_distribution.cc b/chrome/installer/util/chrome_frame_distribution.cc
index d19fc95..a8f120f 100644
--- a/chrome/installer/util/chrome_frame_distribution.cc
+++ b/chrome/installer/util/chrome_frame_distribution.cc
@@ -17,7 +17,6 @@
#include "base/string_util.h"
#include "chrome/installer/util/l10n_string_util.h"
#include "chrome/installer/util/google_update_constants.h"
-#include "chrome/installer/util/google_update_settings.h"
#include "installer_util_strings.h"
@@ -108,7 +107,25 @@ bool ChromeFrameDistribution::CanSetAsDefault() {
void ChromeFrameDistribution::UpdateDiffInstallStatus(bool system_install,
bool incremental_install, installer_util::InstallStatus install_status) {
- GoogleUpdateSettings::UpdateDiffInstallStatus(system_install,
- incremental_install, GetInstallReturnCode(install_status),
- kChromeFrameGuid);
+ HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ RegKey key;
+ std::wstring ap_key_value;
+ std::wstring reg_key(google_update::kRegPathClientState);
+ reg_key.append(L"\\");
+ reg_key.append(kChromeFrameGuid);
+ if (!key.Open(reg_root, reg_key.c_str(), KEY_ALL_ACCESS) ||
+ !key.ReadValue(google_update::kRegApField, &ap_key_value)) {
+ LOG(INFO) << "Application key not found.";
+ } else {
+ const char kMagicSuffix[] = "-full";
+ if (LowerCaseEqualsASCII(ap_key_value, kMagicSuffix)) {
+ key.DeleteValue(google_update::kRegApField);
+ } else {
+ size_t pos = ap_key_value.find(ASCIIToWide(kMagicSuffix));
+ if (pos != std::wstring::npos) {
+ ap_key_value.erase(pos, strlen(kMagicSuffix));
+ key.WriteValue(google_update::kRegApField, ap_key_value.c_str());
+ }
+ }
+ }
}
diff --git a/chrome/installer/util/google_chrome_distribution.cc b/chrome/installer/util/google_chrome_distribution.cc
index a79caf1..b1b22df 100644
--- a/chrome/installer/util/google_chrome_distribution.cc
+++ b/chrome/installer/util/google_chrome_distribution.cc
@@ -364,6 +364,32 @@ std::wstring GoogleChromeDistribution::GetInstallSubDir() {
return sub_dir;
}
+std::wstring GoogleChromeDistribution::GetNewGoogleUpdateApKey(
+ bool diff_install, installer_util::InstallStatus status,
+ const std::wstring& value) {
+ // Magic suffix that we need to add or remove to "ap" key value.
+ const std::wstring kMagicSuffix = L"-full";
+
+ bool has_magic_string = false;
+ if ((value.length() >= kMagicSuffix.length()) &&
+ (value.rfind(kMagicSuffix) == (value.length() - kMagicSuffix.length()))) {
+ LOG(INFO) << "Incremental installer failure key already set.";
+ has_magic_string = true;
+ }
+
+ std::wstring new_value(value);
+ if ((!diff_install || !GetInstallReturnCode(status)) && has_magic_string) {
+ LOG(INFO) << "Removing failure key from value " << value;
+ new_value = value.substr(0, value.length() - kMagicSuffix.length());
+ } else if ((diff_install && GetInstallReturnCode(status)) &&
+ !has_magic_string) {
+ LOG(INFO) << "Incremental installer failed, setting failure key.";
+ new_value.append(kMagicSuffix);
+ }
+
+ return new_value;
+}
+
std::wstring GoogleChromeDistribution::GetPublisherName() {
const std::wstring& publisher_name =
installer_util::GetLocalizedString(IDS_ABOUT_VERSION_COMPANY_NAME_BASE);
@@ -467,9 +493,39 @@ std::wstring GoogleChromeDistribution::GetEnvVersionKey() {
// There is no fall-back for full installer :)
void GoogleChromeDistribution::UpdateDiffInstallStatus(bool system_install,
bool incremental_install, installer_util::InstallStatus install_status) {
- GoogleUpdateSettings::UpdateDiffInstallStatus(system_install,
- incremental_install, GetInstallReturnCode(install_status),
- product_guid().c_str());
+ HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+
+ RegKey key;
+ std::wstring ap_key_value;
+ std::wstring reg_key(google_update::kRegPathClientState);
+ reg_key.append(L"\\");
+ reg_key.append(product_guid());
+ if (!key.Open(reg_root, reg_key.c_str(), KEY_ALL_ACCESS) ||
+ !key.ReadValue(google_update::kRegApField, &ap_key_value)) {
+ LOG(INFO) << "Application key not found.";
+ if (!incremental_install || !GetInstallReturnCode(install_status)) {
+ LOG(INFO) << "Returning without changing application key.";
+ key.Close();
+ return;
+ } else if (!key.Valid()) {
+ reg_key.assign(google_update::kRegPathClientState);
+ if (!key.Open(reg_root, reg_key.c_str(), KEY_ALL_ACCESS) ||
+ !key.CreateKey(product_guid().c_str(), KEY_ALL_ACCESS)) {
+ LOG(ERROR) << "Failed to create application key.";
+ key.Close();
+ return;
+ }
+ }
+ }
+
+ std::wstring new_value = GoogleChromeDistribution::GetNewGoogleUpdateApKey(
+ incremental_install, install_status, ap_key_value);
+ if ((new_value.compare(ap_key_value) != 0) &&
+ !key.WriteValue(google_update::kRegApField, new_value.c_str())) {
+ LOG(ERROR) << "Failed to write value " << new_value
+ << " to the registry field " << google_update::kRegApField;
+ }
+ key.Close();
}
// The functions below are not used by the 64-bit Windows binary -
diff --git a/chrome/installer/util/google_chrome_distribution.h b/chrome/installer/util/google_chrome_distribution.h
index b35f0a2..fec4df2 100644
--- a/chrome/installer/util/google_chrome_distribution.h
+++ b/chrome/installer/util/google_chrome_distribution.h
@@ -38,6 +38,21 @@ class GoogleChromeDistribution : public BrowserDistribution {
virtual std::wstring GetInstallSubDir();
+ // This method generates the new value for Google Update "ap" key for Chrome
+ // based on whether we are doing incremental install (or not) and whether
+ // the install succeeded.
+ // - If install worked, remove the magic string (if present).
+ // - If incremental installer failed, append a magic string (if
+ // not present already).
+ // - If full installer failed, still remove this magic
+ // string (if it is present already).
+ //
+ // diff_install: tells whether this is incremental install or not.
+ // install_status: if 0, means installation was successful.
+ // value: current value of Google Update "ap" key.
+ std::wstring GetNewGoogleUpdateApKey(bool diff_install,
+ installer_util::InstallStatus status, const std::wstring& value);
+
virtual std::wstring GetPublisherName();
virtual std::wstring GetAppDescription();
diff --git a/chrome/installer/util/google_chrome_distribution_unittest.cc b/chrome/installer/util/google_chrome_distribution_unittest.cc
index a6319bb..cc63e00 100644
--- a/chrome/installer/util/google_chrome_distribution_unittest.cc
+++ b/chrome/installer/util/google_chrome_distribution_unittest.cc
@@ -6,14 +6,185 @@
#include <windows.h>
+#include "base/registry.h"
#include "base/scoped_ptr.h"
+#include "base/file_util.h"
#include "chrome/common/json_value_serializer.h"
#include "chrome/installer/util/browser_distribution.h"
#include "chrome/installer/util/google_update_constants.h"
#include "chrome/installer/util/google_chrome_distribution.h"
+#include "chrome/installer/util/work_item_list.h"
#include "testing/gtest/include/gtest/gtest.h"
-TEST(GoogleChromeDistributionTest, TestExtractUninstallMetrics) {
+namespace {
+class GoogleChromeDistributionTest : public testing::Test {
+ protected:
+ virtual void SetUp() {
+ // Currently no setup required.
+ }
+
+ virtual void TearDown() {
+ // Currently no tear down required.
+ }
+
+ // Creates "ap" key with the value given as parameter. Also adds work
+ // items to work_item_list given so that they can be rolled back later.
+ bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) {
+ HKEY reg_root = HKEY_CURRENT_USER;
+ std::wstring reg_key = GetApKeyPath();
+ work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
+ work_item_list->AddSetRegValueWorkItem(reg_root, reg_key,
+ google_update::kRegApField, value.c_str(), true);
+ if (!work_item_list->Do()) {
+ work_item_list->Rollback();
+ return false;
+ }
+ return true;
+ }
+
+ // Returns the key path of "ap" key Google\Update\ClientState\<chrome-guid>
+ std::wstring GetApKeyPath() {
+ std::wstring reg_key(google_update::kRegPathClientState);
+ reg_key.append(L"\\");
+
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ reg_key.append(dist->GetAppGuid());
+ return reg_key;
+ }
+
+ // Utility method to read "ap" key value
+ std::wstring ReadApKeyValue() {
+ RegKey key;
+ std::wstring ap_key_value;
+ std::wstring reg_key = GetApKeyPath();
+ if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) &&
+ key.ReadValue(google_update::kRegApField, &ap_key_value)) {
+ return ap_key_value;
+ }
+ return std::wstring();
+ }
+};
+} // namespace
+
+#if defined(GOOGLE_CHROME_BUILD)
+TEST_F(GoogleChromeDistributionTest, GetNewGoogleUpdateApKeyTest) {
+ GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>(
+ BrowserDistribution::GetDistribution());
+ installer_util::InstallStatus s = installer_util::FIRST_INSTALL_SUCCESS;
+ installer_util::InstallStatus f = installer_util::INSTALL_FAILED;
+
+ // Incremental Installer that worked.
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L""), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-dev"), L"1.1-dev");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"-full"), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-full"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-dev-full"),
+ L"1.1-dev");
+
+ // Incremental Installer that failed.
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L""), L"-full");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1"), L"1.1-full");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-dev"),
+ L"1.1-dev-full");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"-full"), L"-full");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-full"), L"1.1-full");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-dev-full"),
+ L"1.1-dev-full");
+
+ // Full Installer that worked.
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L""), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-dev"), L"1.1-dev");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"-full"), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-full"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-dev-full"),
+ L"1.1-dev");
+
+ // Full Installer that failed.
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L""), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-dev"), L"1.1-dev");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"-full"), L"");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-full"), L"1.1");
+ EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-dev-full"),
+ L"1.1-dev");
+}
+
+TEST_F(GoogleChromeDistributionTest, UpdateDiffInstallStatusTest) {
+ // Get Google Chrome distribution
+ GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>(
+ BrowserDistribution::GetDistribution());
+
+ scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
+ // Test incremental install failure
+ if (!CreateApKey(work_item_list.get(), L""))
+ FAIL() << "Failed to create ap key.";
+ dist->UpdateDiffInstallStatus(false, true, installer_util::INSTALL_FAILED);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
+ work_item_list->Rollback();
+
+ work_item_list.reset(WorkItem::CreateWorkItemList());
+ // Test incremental install success
+ if (!CreateApKey(work_item_list.get(), L""))
+ FAIL() << "Failed to create ap key.";
+ dist->UpdateDiffInstallStatus(false, true,
+ installer_util::FIRST_INSTALL_SUCCESS);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
+ work_item_list->Rollback();
+
+ work_item_list.reset(WorkItem::CreateWorkItemList());
+ // Test full install failure
+ if (!CreateApKey(work_item_list.get(), L"-full"))
+ FAIL() << "Failed to create ap key.";
+ dist->UpdateDiffInstallStatus(false, false, installer_util::INSTALL_FAILED);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
+ work_item_list->Rollback();
+
+ work_item_list.reset(WorkItem::CreateWorkItemList());
+ // Test full install success
+ if (!CreateApKey(work_item_list.get(), L"-full"))
+ FAIL() << "Failed to create ap key.";
+ dist->UpdateDiffInstallStatus(false, false,
+ installer_util::FIRST_INSTALL_SUCCESS);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
+ work_item_list->Rollback();
+
+ work_item_list.reset(WorkItem::CreateWorkItemList());
+ // Test the case of when "ap" key doesnt exist at all
+ std::wstring ap_key_value = ReadApKeyValue();
+ std::wstring reg_key = GetApKeyPath();
+ HKEY reg_root = HKEY_CURRENT_USER;
+ bool ap_key_deleted = false;
+ RegKey key;
+ if (!key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS)) {
+ work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
+ if (!work_item_list->Do())
+ FAIL() << "Failed to create ClientState key.";
+ } else if (key.DeleteValue(google_update::kRegApField)) {
+ ap_key_deleted = true;
+ }
+ // try differential installer
+ dist->UpdateDiffInstallStatus(false, true, installer_util::INSTALL_FAILED);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
+ // try full installer now
+ dist->UpdateDiffInstallStatus(false, false, installer_util::INSTALL_FAILED);
+ EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
+ // Now cleanup to leave the system in unchanged state.
+ // - Diff installer creates an ap key if it didnt exist, so delete this ap key
+ // - If we created any reg key path for ap, roll it back
+ // - Finally restore the original value of ap key.
+ key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS);
+ key.DeleteValue(google_update::kRegApField);
+ work_item_list->Rollback();
+ if (ap_key_deleted) {
+ work_item_list.reset(WorkItem::CreateWorkItemList());
+ if (!CreateApKey(work_item_list.get(), ap_key_value))
+ FAIL() << "Failed to restore ap key.";
+ }
+}
+
+TEST_F(GoogleChromeDistributionTest, TestExtractUninstallMetrics) {
// A make-believe JSON preferences file.
std::string pref_string(
"{ \n"
@@ -57,3 +228,4 @@ TEST(GoogleChromeDistributionTest, TestExtractUninstallMetrics) {
&uninstall_metrics_string));
EXPECT_EQ(expected_url_string, uninstall_metrics_string);
}
+#endif
diff --git a/chrome/installer/util/google_update_settings.cc b/chrome/installer/util/google_update_settings.cc
index a5460e2..6765ae1 100644
--- a/chrome/installer/util/google_update_settings.cc
+++ b/chrome/installer/util/google_update_settings.cc
@@ -95,15 +95,15 @@ bool GoogleUpdateSettings::SetEULAConsent(bool consented) {
}
int GoogleUpdateSettings::GetLastRunTime() {
- std::wstring time_s;
- if (!ReadGoogleUpdateStrKey(google_update::kRegLastRunTimeField, &time_s))
- return -1;
- int64 time_i;
- if (!StringToInt64(time_s, &time_i))
- return -1;
- base::TimeDelta td =
+ std::wstring time_s;
+ if (!ReadGoogleUpdateStrKey(google_update::kRegLastRunTimeField, &time_s))
+ return -1;
+ int64 time_i;
+ if (!StringToInt64(time_s, &time_i))
+ return -1;
+ base::TimeDelta td =
base::Time::NowFromSystemTime() - base::Time::FromInternalValue(time_i);
- return td.InDays();
+ return td.InDays();
}
bool GoogleUpdateSettings::SetLastRunTime() {
@@ -175,67 +175,3 @@ bool GoogleUpdateSettings::GetChromeChannel(bool system_install,
return true;
}
-
-void GoogleUpdateSettings::UpdateDiffInstallStatus(bool system_install,
- bool incremental_install, int install_return_code,
- const std::wstring& product_guid) {
- HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
-
- RegKey key;
- std::wstring ap_key_value;
- std::wstring reg_key(google_update::kRegPathClientState);
- reg_key.append(L"\\");
- reg_key.append(product_guid);
- if (!key.Open(reg_root, reg_key.c_str(), KEY_ALL_ACCESS) ||
- !key.ReadValue(google_update::kRegApField, &ap_key_value)) {
- LOG(INFO) << "Application key not found.";
- if (!incremental_install || !install_return_code) {
- LOG(INFO) << "Returning without changing application key.";
- key.Close();
- return;
- } else if (!key.Valid()) {
- reg_key.assign(google_update::kRegPathClientState);
- if (!key.Open(reg_root, reg_key.c_str(), KEY_ALL_ACCESS) ||
- !key.CreateKey(product_guid.c_str(), KEY_ALL_ACCESS)) {
- LOG(ERROR) << "Failed to create application key.";
- key.Close();
- return;
- }
- }
- }
-
- std::wstring new_value = GetNewGoogleUpdateApKey(
- incremental_install, install_return_code, ap_key_value);
- if ((new_value.compare(ap_key_value) != 0) &&
- !key.WriteValue(google_update::kRegApField, new_value.c_str())) {
- LOG(ERROR) << "Failed to write value " << new_value
- << " to the registry field " << google_update::kRegApField;
- }
- key.Close();
-}
-
-std::wstring GoogleUpdateSettings::GetNewGoogleUpdateApKey(
- bool diff_install, int install_return_code, const std::wstring& value) {
- // Magic suffix that we need to add or remove to "ap" key value.
- const std::wstring kMagicSuffix = L"-full";
-
- bool has_magic_string = false;
- if ((value.length() >= kMagicSuffix.length()) &&
- (value.rfind(kMagicSuffix) == (value.length() - kMagicSuffix.length()))) {
- LOG(INFO) << "Incremental installer failure key already set.";
- has_magic_string = true;
- }
-
- std::wstring new_value(value);
- if ((!diff_install || !install_return_code) && has_magic_string) {
- LOG(INFO) << "Removing failure key from value " << value;
- new_value = value.substr(0, value.length() - kMagicSuffix.length());
- } else if ((diff_install && install_return_code) &&
- !has_magic_string) {
- LOG(INFO) << "Incremental installer failed, setting failure key.";
- new_value.append(kMagicSuffix);
- }
-
- return new_value;
-}
-
diff --git a/chrome/installer/util/google_update_settings.h b/chrome/installer/util/google_update_settings.h
index dd7145e..70fbaf8 100644
--- a/chrome/installer/util/google_update_settings.h
+++ b/chrome/installer/util/google_update_settings.h
@@ -83,27 +83,6 @@ class GoogleUpdateSettings {
// on success, channel contains one of "", "unknown", "dev" or "beta".
static bool GetChromeChannel(bool system_install, std::wstring* channel);
- static void UpdateDiffInstallStatus(bool system_install,
- bool incremental_install,
- int install_return_code,
- const std::wstring& product_guid);
-
- // This method generates the new value for Google Update "ap" key for Chrome
- // based on whether we are doing incremental install (or not) and whether
- // the install succeeded.
- // - If install worked, remove the magic string (if present).
- // - If incremental installer failed, append a magic string (if
- // not present already).
- // - If full installer failed, still remove this magic
- // string (if it is present already).
- //
- // diff_install: tells whether this is incremental install or not.
- // install_return_code: if 0, means installation was successful.
- // value: current value of Google Update "ap" key.
- static std::wstring GetNewGoogleUpdateApKey(bool diff_install,
- int install_return_code,
- const std::wstring& value);
-
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(GoogleUpdateSettings);
};
diff --git a/chrome/installer/util/google_update_settings_unittest.cc b/chrome/installer/util/google_update_settings_unittest.cc
index e670a8e..e58e23b 100644
--- a/chrome/installer/util/google_update_settings_unittest.cc
+++ b/chrome/installer/util/google_update_settings_unittest.cc
@@ -5,11 +5,8 @@
#include <windows.h>
#include "base/registry.h"
-#include "base/scoped_ptr.h"
#include "chrome/installer/util/browser_distribution.h"
-#include "chrome/installer/util/google_update_constants.h"
#include "chrome/installer/util/google_update_settings.h"
-#include "chrome/installer/util/work_item_list.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -18,8 +15,6 @@ const wchar_t* kHKCUReplacement =
const wchar_t* kHKLMReplacement =
L"Software\\Google\\InstallUtilUnittest\\HKLM";
-const wchar_t kTestProductGuid[] = L"{89F1B351-B15D-48D4-8F10-1298721CF13D}";
-
// This test fixture redirects the HKLM and HKCU registry hives for
// the duration of the test to make it independent of the machine
// and user settings.
@@ -122,42 +117,6 @@ class GoogleUpdateSettingsTest: public testing::Test {
}
}
- // Creates "ap" key with the value given as parameter. Also adds work
- // items to work_item_list given so that they can be rolled back later.
- bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) {
- HKEY reg_root = HKEY_CURRENT_USER;
- std::wstring reg_key = GetApKeyPath();
- work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
- work_item_list->AddSetRegValueWorkItem(reg_root, reg_key,
- google_update::kRegApField, value.c_str(), true);
- if (!work_item_list->Do()) {
- work_item_list->Rollback();
- return false;
- }
- return true;
- }
-
- // Returns the key path of "ap" key, e.g.:
- // Google\Update\ClientState\<kTestProductGuid>
- std::wstring GetApKeyPath() {
- std::wstring reg_key(google_update::kRegPathClientState);
- reg_key.append(L"\\");
- reg_key.append(kTestProductGuid);
- return reg_key;
- }
-
- // Utility method to read "ap" key value
- std::wstring ReadApKeyValue() {
- RegKey key;
- std::wstring ap_key_value;
- std::wstring reg_key = GetApKeyPath();
- if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) &&
- key.ReadValue(google_update::kRegApField, &ap_key_value)) {
- return ap_key_value;
- }
- return std::wstring();
- }
-
RegKey hkcu_;
RegKey hklm_;
};
@@ -206,145 +165,3 @@ TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesSystem) {
TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesUser) {
TestCurrentChromeChannelWithVariousApValues(USER_INSTALL);
}
-
-TEST_F(GoogleUpdateSettingsTest, GetNewGoogleUpdateApKeyTest) {
- installer_util::InstallStatus s = installer_util::FIRST_INSTALL_SUCCESS;
- installer_util::InstallStatus f = installer_util::INSTALL_FAILED;
-
- // Incremental Installer that worked.
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s, L""), L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s, L"1.1"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s, L"1.1-dev"),
- L"1.1-dev");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s, L"-full"),
- L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s, L"1.1-full"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, s,
- L"1.1-dev-full"),
- L"1.1-dev");
-
- // Incremental Installer that failed.
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f, L""),
- L"-full");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f, L"1.1"),
- L"1.1-full");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f, L"1.1-dev"),
- L"1.1-dev-full");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f, L"-full"),
- L"-full");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f, L"1.1-full"),
- L"1.1-full");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(true, f,
- L"1.1-dev-full"),
- L"1.1-dev-full");
-
- // Full Installer that worked.
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s, L""), L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s, L"1.1"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s, L"1.1-dev"),
- L"1.1-dev");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s, L"-full"),
- L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s,
- L"1.1-full"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, s,
- L"1.1-dev-full"),
- L"1.1-dev");
-
- // Full Installer that failed.
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f, L""), L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f, L"1.1"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f, L"1.1-dev"),
- L"1.1-dev");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f, L"-full"),
- L"");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f,
- L"1.1-full"),
- L"1.1");
- EXPECT_EQ(GoogleUpdateSettings::GetNewGoogleUpdateApKey(false, f,
- L"1.1-dev-full"),
- L"1.1-dev");
-}
-
-TEST_F(GoogleUpdateSettingsTest, UpdateDiffInstallStatusTest) {
- scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
- // Test incremental install failure
- ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
- << "Failed to create ap key.";
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, true,
- installer_util::INSTALL_FAILED,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
- work_item_list->Rollback();
-
- work_item_list.reset(WorkItem::CreateWorkItemList());
- // Test incremental install success
- ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
- << "Failed to create ap key.";
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, true,
- installer_util::FIRST_INSTALL_SUCCESS,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
- work_item_list->Rollback();
-
- work_item_list.reset(WorkItem::CreateWorkItemList());
- // Test full install failure
- ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
- << "Failed to create ap key.";
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, false,
- installer_util::INSTALL_FAILED,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
- work_item_list->Rollback();
-
- work_item_list.reset(WorkItem::CreateWorkItemList());
- // Test full install success
- ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
- << "Failed to create ap key.";
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, false,
- installer_util::FIRST_INSTALL_SUCCESS,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
- work_item_list->Rollback();
-
- work_item_list.reset(WorkItem::CreateWorkItemList());
- // Test the case of when "ap" key doesnt exist at all
- std::wstring ap_key_value = ReadApKeyValue();
- std::wstring reg_key = GetApKeyPath();
- HKEY reg_root = HKEY_CURRENT_USER;
- bool ap_key_deleted = false;
- RegKey key;
- if (!key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS)) {
- work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
- ASSERT_TRUE(work_item_list->Do()) << "Failed to create ClientState key.";
- } else if (key.DeleteValue(google_update::kRegApField)) {
- ap_key_deleted = true;
- }
- // try differential installer
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, true,
- installer_util::INSTALL_FAILED,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
- // try full installer now
- GoogleUpdateSettings::UpdateDiffInstallStatus(false, false,
- installer_util::INSTALL_FAILED,
- kTestProductGuid);
- EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
- // Now cleanup to leave the system in unchanged state.
- // - Diff installer creates an ap key if it didnt exist, so delete this ap key
- // - If we created any reg key path for ap, roll it back
- // - Finally restore the original value of ap key.
- key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS);
- key.DeleteValue(google_update::kRegApField);
- work_item_list->Rollback();
- if (ap_key_deleted) {
- work_item_list.reset(WorkItem::CreateWorkItemList());
- ASSERT_TRUE(CreateApKey(work_item_list.get(), ap_key_value))
- << "Failed to restore ap key.";
- }
-}
diff --git a/chrome/installer/util/install_util.cc b/chrome/installer/util/install_util.cc
index 1940d0d..9d36e2e 100644
--- a/chrome/installer/util/install_util.cc
+++ b/chrome/installer/util/install_util.cc
@@ -235,6 +235,7 @@ bool InstallUtil::SetMSIMarker(bool system_level, bool set) {
return success;
}
+
bool InstallUtil::BuildDLLRegistrationList(const std::wstring& install_path,
const wchar_t** const dll_names,
int dll_names_count,