Index: chrome/installer/util/install_util_unittest.cc |
diff --git a/chrome/installer/util/install_util_unittest.cc b/chrome/installer/util/install_util_unittest.cc |
index a891f8de0c0cc5dfe550e91364f0ee54fb5f59c7..ddc4a70841a3b90c1ea3de8b2dd54017d1bca83c 100644 |
--- a/chrome/installer/util/install_util_unittest.cc |
+++ b/chrome/installer/util/install_util_unittest.cc |
@@ -2,25 +2,29 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "chrome/installer/util/install_util.h" |
+ |
#include <string> |
#include <utility> |
#include "base/base_paths.h" |
#include "base/command_line.h" |
#include "base/files/file_util.h" |
+#include "base/files/scoped_temp_dir.h" |
+#include "base/macros.h" |
#include "base/path_service.h" |
#include "base/strings/string_util.h" |
#include "base/test/scoped_path_override.h" |
#include "base/test/test_reg_util_win.h" |
#include "base/win/registry.h" |
+#include "chrome/installer/util/browser_distribution.h" |
#include "chrome/installer/util/google_update_constants.h" |
-#include "chrome/installer/util/install_util.h" |
-#include "chrome/installer/util/product_unittest.h" |
+#include "chrome/installer/util/update_active_setup_version_work_item.h" |
#include "chrome/installer/util/work_item.h" |
#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
using base::win::RegKey; |
-using registry_util::RegistryOverrideManager; |
using ::testing::_; |
using ::testing::Return; |
using ::testing::StrEq; |
@@ -30,10 +34,110 @@ class MockRegistryValuePredicate : public InstallUtil::RegistryValuePredicate { |
MOCK_CONST_METHOD1(Evaluate, bool(const std::wstring&)); |
}; |
-class InstallUtilTest : public TestWithTempDirAndDeleteTempOverrideKeys { |
+class InstallUtilTest : public testing::Test { |
protected: |
+ InstallUtilTest() {} |
+ |
+ void SetUp() override { |
+ ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); |
+ ResetRegistryOverrides(); |
+ } |
+ |
+ void ResetRegistryOverrides() { |
+ registry_override_manager_.reset( |
+ new registry_util::RegistryOverrideManager); |
+ registry_override_manager_->OverrideRegistry(HKEY_CURRENT_USER); |
+ registry_override_manager_->OverrideRegistry(HKEY_LOCAL_MACHINE); |
+ } |
+ |
+ base::ScopedTempDir test_dir_; |
+ |
+ private: |
+ scoped_ptr<registry_util::RegistryOverrideManager> registry_override_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InstallUtilTest); |
}; |
+TEST_F(InstallUtilTest, UpdateLastOSUpgradeHandledByActiveSetup) { |
+ BrowserDistribution* chrome_dist = |
+ BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BROWSER); |
+ const base::string16 active_setup_path( |
+ InstallUtil::GetActiveSetupPath(chrome_dist)); |
+ |
+ RegKey test_key; |
+ base::string16 unused_tmp; |
+ |
+ EXPECT_EQ(ERROR_FILE_NOT_FOUND, |
+ test_key.Open(HKEY_LOCAL_MACHINE, active_setup_path.c_str(), |
+ KEY_QUERY_VALUE)); |
+ // The WorkItem assume the ActiveSetup key itself already exists and only |
+ // handles the Version entry, create it now, but don't fill the "Version" |
+ // entry just yet. |
+ EXPECT_EQ(ERROR_SUCCESS, |
+ test_key.Create(HKEY_LOCAL_MACHINE, active_setup_path.c_str(), |
+ KEY_QUERY_VALUE)); |
+ EXPECT_EQ(ERROR_FILE_NOT_FOUND, test_key.ReadValue(L"Version", &unused_tmp)); |
+ |
+ // Test returns false when no Active Setup version present (and doesn't alter |
+ // that state). |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ EXPECT_EQ(ERROR_FILE_NOT_FOUND, test_key.ReadValue(L"Version", &unused_tmp)); |
+ |
+ { |
+ UpdateActiveSetupVersionWorkItem active_setup_work_item( |
+ active_setup_path, UpdateActiveSetupVersionWorkItem::UPDATE); |
+ active_setup_work_item.Do(); |
+ EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &unused_tmp)); |
+ } |
+ |
+ // Test returns false with default Active Setup version. |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &unused_tmp)); |
+ |
+ // Run through |kIterations| sequences of bumping the OS upgrade version |i| |
+ // times and simulating a regular update |kIterations-i| times, confirming |
+ // that handling any number of OS upgrades only results in a single hit and |
+ // that no amount of regular updates after that result in any hit. |
+ const size_t kIterations = 4U; |
+ for (size_t i = 0U; i < kIterations; ++i) { |
+ SCOPED_TRACE(i); |
+ // Bump the OS_UPGRADES component |i| times. |
+ for (size_t j = 0; j < i; ++j) { |
+ UpdateActiveSetupVersionWorkItem active_setup_work_item( |
+ active_setup_path, UpdateActiveSetupVersionWorkItem:: |
+ UPDATE_AND_BUMP_OS_UPGRADES_COMPONENT); |
+ active_setup_work_item.Do(); |
+ } |
+ |
+ // There should be a single OS upgrade to handle if the OS_UPGRADES |
+ // component was bumped at least once. |
+ EXPECT_EQ(i > 0, InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup( |
+ chrome_dist)); |
+ |
+ // We should only be told to handle the latest OS upgrade once above. |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ |
+ // Run |kIterations-i| regular updates. |
+ for (size_t j = i; j < kIterations; ++j) { |
+ UpdateActiveSetupVersionWorkItem active_setup_work_item( |
+ active_setup_path, UpdateActiveSetupVersionWorkItem::UPDATE); |
+ active_setup_work_item.Do(); |
+ } |
+ |
+ // No amount of regular updates should trigger an OS upgrade to be handled. |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ EXPECT_FALSE( |
+ InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
+ } |
+} |
+ |
TEST_F(InstallUtilTest, ComposeCommandLine) { |
base::CommandLine command_line(base::CommandLine::NO_PROGRAM); |
@@ -84,8 +188,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStageAP) { |
// Update the stage when there's no "ap" value. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE); |
InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
installer::BUILDING); |
@@ -98,8 +201,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStageAP) { |
// Update the stage when there is an "ap" value. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
.WriteValue(google_update::kRegApField, L"2.0-dev"); |
InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
@@ -113,8 +215,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStageAP) { |
// Clear the stage. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
.WriteValue(google_update::kRegApField, L"2.0-dev-stage:building"); |
InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
@@ -134,8 +235,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStage) { |
// Update the stage when there's no "InstallerExtraCode1" value. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
.DeleteValue(installer::kInstallerExtraCode1); |
InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
@@ -149,8 +249,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStage) { |
// Update the stage when there is an "InstallerExtraCode1" value. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
.WriteValue(installer::kInstallerExtraCode1, |
static_cast<DWORD>(installer::UNPACKING)); |
@@ -165,8 +264,7 @@ TEST_F(InstallUtilTest, UpdateInstallerStage) { |
// Clear the stage. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
.WriteValue(installer::kInstallerExtraCode1, static_cast<DWORD>(5)); |
InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
@@ -186,105 +284,88 @@ TEST_F(InstallUtilTest, DeleteRegistryKeyIf) { |
const wchar_t value_name[] = L"some_value_name"; |
const wchar_t value[] = L"hi mom"; |
+ // Nothing to delete if the keys aren't even there. |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
- // Nothing to delete if the keys aren't even there. |
- { |
- MockRegistryValuePredicate pred; |
- |
- EXPECT_CALL(pred, Evaluate(_)).Times(0); |
- ASSERT_FALSE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- EXPECT_EQ(InstallUtil::NOT_FOUND, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- value_name, pred)); |
- EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
- |
- // Parent exists, but not child: no delete. |
- { |
- MockRegistryValuePredicate pred; |
- |
- EXPECT_CALL(pred, Evaluate(_)).Times(0); |
- ASSERT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_SET_VALUE).Valid()); |
- EXPECT_EQ(InstallUtil::NOT_FOUND, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- value_name, pred)); |
- EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
- |
- // Child exists, but no value: no delete. |
- { |
- MockRegistryValuePredicate pred; |
- |
- EXPECT_CALL(pred, Evaluate(_)).Times(0); |
- ASSERT_TRUE(RegKey(root, child_key_path.c_str(), KEY_SET_VALUE).Valid()); |
- EXPECT_EQ(InstallUtil::NOT_FOUND, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- value_name, pred)); |
- EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
- |
- // Value exists, but doesn't match: no delete. |
- { |
- MockRegistryValuePredicate pred; |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(_)).Times(0); |
+ ASSERT_FALSE( |
+ RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ EXPECT_EQ(InstallUtil::NOT_FOUND, |
+ InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, value_name, pred)); |
+ EXPECT_FALSE( |
+ RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ } |
- EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false)); |
- ASSERT_EQ(ERROR_SUCCESS, |
- RegKey(root, child_key_path.c_str(), |
- KEY_SET_VALUE).WriteValue(value_name, L"foosball!")); |
- EXPECT_EQ(InstallUtil::NOT_FOUND, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- value_name, pred)); |
- EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
+ // Parent exists, but not child: no delete. |
+ { |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(_)).Times(0); |
+ ASSERT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_SET_VALUE).Valid()); |
+ EXPECT_EQ(InstallUtil::NOT_FOUND, |
+ InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, value_name, pred)); |
+ EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ } |
- // Value exists, and matches: delete. |
- { |
- MockRegistryValuePredicate pred; |
+ // Child exists, but no value: no delete. |
+ { |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(_)).Times(0); |
+ ASSERT_TRUE(RegKey(root, child_key_path.c_str(), KEY_SET_VALUE).Valid()); |
+ EXPECT_EQ(InstallUtil::NOT_FOUND, |
+ InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, value_name, pred)); |
+ EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ } |
- EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
- ASSERT_EQ(ERROR_SUCCESS, |
- RegKey(root, child_key_path.c_str(), |
- KEY_SET_VALUE).WriteValue(value_name, value)); |
- EXPECT_EQ(InstallUtil::DELETED, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- value_name, pred)); |
- EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
+ // Value exists, but doesn't match: no delete. |
+ { |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false)); |
+ ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
+ .WriteValue(value_name, L"foosball!")); |
+ EXPECT_EQ(InstallUtil::NOT_FOUND, |
+ InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, value_name, pred)); |
+ EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ } |
- // Default value exists and matches: delete. |
- { |
- MockRegistryValuePredicate pred; |
+ // Value exists, and matches: delete. |
+ { |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
+ ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
+ .WriteValue(value_name, value)); |
+ EXPECT_EQ(InstallUtil::DELETED, |
+ InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, value_name, pred)); |
+ EXPECT_FALSE( |
+ RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
+ } |
- EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
- ASSERT_EQ(ERROR_SUCCESS, |
- RegKey(root, child_key_path.c_str(), |
- KEY_SET_VALUE).WriteValue(NULL, value)); |
- EXPECT_EQ(InstallUtil::DELETED, |
- InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, |
- child_key_path, |
- WorkItem::kWow64Default, |
- NULL, pred)); |
- EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), |
- KEY_QUERY_VALUE).Valid()); |
- } |
+ // Default value exists and matches: delete. |
+ { |
+ MockRegistryValuePredicate pred; |
+ |
+ EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
+ ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
+ .WriteValue(NULL, value)); |
+ EXPECT_EQ(InstallUtil::DELETED, InstallUtil::DeleteRegistryKeyIf( |
+ root, parent_key_path, child_key_path, |
+ WorkItem::kWow64Default, NULL, pred)); |
+ EXPECT_FALSE( |
+ RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
} |
} |
@@ -295,8 +376,7 @@ TEST_F(InstallUtilTest, DeleteRegistryValueIf) { |
const wchar_t value[] = L"hi mom"; |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
// Nothing to delete if the key isn't even there. |
{ |
MockRegistryValuePredicate pred; |
@@ -359,8 +439,7 @@ TEST_F(InstallUtilTest, DeleteRegistryValueIf) { |
} |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
// Default value matches: delete using empty string. |
{ |
MockRegistryValuePredicate pred; |
@@ -380,8 +459,7 @@ TEST_F(InstallUtilTest, DeleteRegistryValueIf) { |
} |
{ |
- RegistryOverrideManager override_manager; |
- override_manager.OverrideRegistry(root); |
+ ResetRegistryOverrides(); |
// Default value matches: delete using NULL. |
{ |
MockRegistryValuePredicate pred; |