| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/installer/util/install_util.h" |
| 6 |
| 5 #include <string> | 7 #include <string> |
| 6 #include <utility> | 8 #include <utility> |
| 7 | 9 |
| 8 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
| 9 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 10 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
| 13 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/macros.h" |
| 11 #include "base/path_service.h" | 15 #include "base/path_service.h" |
| 12 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
| 13 #include "base/test/scoped_path_override.h" | 17 #include "base/test/scoped_path_override.h" |
| 14 #include "base/test/test_reg_util_win.h" | 18 #include "base/test/test_reg_util_win.h" |
| 15 #include "base/win/registry.h" | 19 #include "base/win/registry.h" |
| 20 #include "chrome/installer/util/browser_distribution.h" |
| 16 #include "chrome/installer/util/google_update_constants.h" | 21 #include "chrome/installer/util/google_update_constants.h" |
| 17 #include "chrome/installer/util/install_util.h" | 22 #include "chrome/installer/util/update_active_setup_version_work_item.h" |
| 18 #include "chrome/installer/util/product_unittest.h" | |
| 19 #include "chrome/installer/util/work_item.h" | 23 #include "chrome/installer/util/work_item.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 26 |
| 22 using base::win::RegKey; | 27 using base::win::RegKey; |
| 23 using registry_util::RegistryOverrideManager; | |
| 24 using ::testing::_; | 28 using ::testing::_; |
| 25 using ::testing::Return; | 29 using ::testing::Return; |
| 26 using ::testing::StrEq; | 30 using ::testing::StrEq; |
| 27 | 31 |
| 28 class MockRegistryValuePredicate : public InstallUtil::RegistryValuePredicate { | 32 class MockRegistryValuePredicate : public InstallUtil::RegistryValuePredicate { |
| 29 public: | 33 public: |
| 30 MOCK_CONST_METHOD1(Evaluate, bool(const std::wstring&)); | 34 MOCK_CONST_METHOD1(Evaluate, bool(const std::wstring&)); |
| 31 }; | 35 }; |
| 32 | 36 |
| 33 class InstallUtilTest : public TestWithTempDirAndDeleteTempOverrideKeys { | 37 class InstallUtilTest : public testing::Test { |
| 34 protected: | 38 protected: |
| 39 InstallUtilTest() {} |
| 40 |
| 41 void SetUp() override { |
| 42 ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); |
| 43 ResetRegistryOverrides(); |
| 44 } |
| 45 |
| 46 void ResetRegistryOverrides() { |
| 47 registry_override_manager_.reset( |
| 48 new registry_util::RegistryOverrideManager); |
| 49 registry_override_manager_->OverrideRegistry(HKEY_CURRENT_USER); |
| 50 registry_override_manager_->OverrideRegistry(HKEY_LOCAL_MACHINE); |
| 51 } |
| 52 |
| 53 base::ScopedTempDir test_dir_; |
| 54 |
| 55 private: |
| 56 scoped_ptr<registry_util::RegistryOverrideManager> registry_override_manager_; |
| 57 |
| 58 DISALLOW_COPY_AND_ASSIGN(InstallUtilTest); |
| 35 }; | 59 }; |
| 36 | 60 |
| 61 TEST_F(InstallUtilTest, UpdateLastOSUpgradeHandledByActiveSetup) { |
| 62 BrowserDistribution* chrome_dist = |
| 63 BrowserDistribution::GetSpecificDistribution( |
| 64 BrowserDistribution::CHROME_BROWSER); |
| 65 const base::string16 active_setup_path( |
| 66 InstallUtil::GetActiveSetupPath(chrome_dist)); |
| 67 |
| 68 RegKey test_key; |
| 69 base::string16 unused_tmp; |
| 70 |
| 71 EXPECT_EQ(ERROR_FILE_NOT_FOUND, |
| 72 test_key.Open(HKEY_LOCAL_MACHINE, active_setup_path.c_str(), |
| 73 KEY_QUERY_VALUE)); |
| 74 // The WorkItem assume the ActiveSetup key itself already exists and only |
| 75 // handles the Version entry, create it now, but don't fill the "Version" |
| 76 // entry just yet. |
| 77 EXPECT_EQ(ERROR_SUCCESS, |
| 78 test_key.Create(HKEY_LOCAL_MACHINE, active_setup_path.c_str(), |
| 79 KEY_QUERY_VALUE)); |
| 80 EXPECT_EQ(ERROR_FILE_NOT_FOUND, test_key.ReadValue(L"Version", &unused_tmp)); |
| 81 |
| 82 // Test returns false when no Active Setup version present (and doesn't alter |
| 83 // that state). |
| 84 EXPECT_FALSE( |
| 85 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 86 EXPECT_EQ(ERROR_FILE_NOT_FOUND, test_key.ReadValue(L"Version", &unused_tmp)); |
| 87 |
| 88 { |
| 89 UpdateActiveSetupVersionWorkItem active_setup_work_item( |
| 90 active_setup_path, UpdateActiveSetupVersionWorkItem::UPDATE); |
| 91 active_setup_work_item.Do(); |
| 92 EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &unused_tmp)); |
| 93 } |
| 94 |
| 95 // Test returns false with default Active Setup version. |
| 96 EXPECT_FALSE( |
| 97 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 98 EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &unused_tmp)); |
| 99 |
| 100 // Run through |kIterations| sequences of bumping the OS upgrade version |i| |
| 101 // times and simulating a regular update |kIterations-i| times, confirming |
| 102 // that handling any number of OS upgrades only results in a single hit and |
| 103 // that no amount of regular updates after that result in any hit. |
| 104 const size_t kIterations = 4U; |
| 105 for (size_t i = 0U; i < kIterations; ++i) { |
| 106 SCOPED_TRACE(i); |
| 107 // Bump the OS_UPGRADES component |i| times. |
| 108 for (size_t j = 0; j < i; ++j) { |
| 109 UpdateActiveSetupVersionWorkItem active_setup_work_item( |
| 110 active_setup_path, UpdateActiveSetupVersionWorkItem:: |
| 111 UPDATE_AND_BUMP_OS_UPGRADES_COMPONENT); |
| 112 active_setup_work_item.Do(); |
| 113 } |
| 114 |
| 115 // There should be a single OS upgrade to handle if the OS_UPGRADES |
| 116 // component was bumped at least once. |
| 117 EXPECT_EQ(i > 0, InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup( |
| 118 chrome_dist)); |
| 119 |
| 120 // We should only be told to handle the latest OS upgrade once above. |
| 121 EXPECT_FALSE( |
| 122 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 123 EXPECT_FALSE( |
| 124 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 125 |
| 126 // Run |kIterations-i| regular updates. |
| 127 for (size_t j = i; j < kIterations; ++j) { |
| 128 UpdateActiveSetupVersionWorkItem active_setup_work_item( |
| 129 active_setup_path, UpdateActiveSetupVersionWorkItem::UPDATE); |
| 130 active_setup_work_item.Do(); |
| 131 } |
| 132 |
| 133 // No amount of regular updates should trigger an OS upgrade to be handled. |
| 134 EXPECT_FALSE( |
| 135 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 136 EXPECT_FALSE( |
| 137 InstallUtil::UpdateLastOSUpgradeHandledByActiveSetup(chrome_dist)); |
| 138 } |
| 139 } |
| 140 |
| 37 TEST_F(InstallUtilTest, ComposeCommandLine) { | 141 TEST_F(InstallUtilTest, ComposeCommandLine) { |
| 38 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | 142 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); |
| 39 | 143 |
| 40 std::pair<std::wstring, std::wstring> params[] = { | 144 std::pair<std::wstring, std::wstring> params[] = { |
| 41 std::make_pair(std::wstring(L""), std::wstring(L"")), | 145 std::make_pair(std::wstring(L""), std::wstring(L"")), |
| 42 std::make_pair(std::wstring(L""), std::wstring(L"--do-something --silly")), | 146 std::make_pair(std::wstring(L""), std::wstring(L"--do-something --silly")), |
| 43 std::make_pair(std::wstring(L"spam.exe"), std::wstring(L"")), | 147 std::make_pair(std::wstring(L"spam.exe"), std::wstring(L"")), |
| 44 std::make_pair(std::wstring(L"spam.exe"), | 148 std::make_pair(std::wstring(L"spam.exe"), |
| 45 std::wstring(L"--do-something --silly")), | 149 std::wstring(L"--do-something --silly")), |
| 46 }; | 150 }; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 77 } | 181 } |
| 78 } | 182 } |
| 79 | 183 |
| 80 TEST_F(InstallUtilTest, UpdateInstallerStageAP) { | 184 TEST_F(InstallUtilTest, UpdateInstallerStageAP) { |
| 81 const bool system_level = false; | 185 const bool system_level = false; |
| 82 const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 186 const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 83 std::wstring state_key_path(L"PhonyClientState"); | 187 std::wstring state_key_path(L"PhonyClientState"); |
| 84 | 188 |
| 85 // Update the stage when there's no "ap" value. | 189 // Update the stage when there's no "ap" value. |
| 86 { | 190 { |
| 87 RegistryOverrideManager override_manager; | 191 ResetRegistryOverrides(); |
| 88 override_manager.OverrideRegistry(root); | |
| 89 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE); | 192 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE); |
| 90 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 193 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 91 installer::BUILDING); | 194 installer::BUILDING); |
| 92 std::wstring value; | 195 std::wstring value; |
| 93 EXPECT_EQ(ERROR_SUCCESS, | 196 EXPECT_EQ(ERROR_SUCCESS, |
| 94 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 197 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 95 .ReadValue(google_update::kRegApField, &value)); | 198 .ReadValue(google_update::kRegApField, &value)); |
| 96 EXPECT_EQ(L"-stage:building", value); | 199 EXPECT_EQ(L"-stage:building", value); |
| 97 } | 200 } |
| 98 | 201 |
| 99 // Update the stage when there is an "ap" value. | 202 // Update the stage when there is an "ap" value. |
| 100 { | 203 { |
| 101 RegistryOverrideManager override_manager; | 204 ResetRegistryOverrides(); |
| 102 override_manager.OverrideRegistry(root); | |
| 103 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) | 205 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
| 104 .WriteValue(google_update::kRegApField, L"2.0-dev"); | 206 .WriteValue(google_update::kRegApField, L"2.0-dev"); |
| 105 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 207 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 106 installer::BUILDING); | 208 installer::BUILDING); |
| 107 std::wstring value; | 209 std::wstring value; |
| 108 EXPECT_EQ(ERROR_SUCCESS, | 210 EXPECT_EQ(ERROR_SUCCESS, |
| 109 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 211 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 110 .ReadValue(google_update::kRegApField, &value)); | 212 .ReadValue(google_update::kRegApField, &value)); |
| 111 EXPECT_EQ(L"2.0-dev-stage:building", value); | 213 EXPECT_EQ(L"2.0-dev-stage:building", value); |
| 112 } | 214 } |
| 113 | 215 |
| 114 // Clear the stage. | 216 // Clear the stage. |
| 115 { | 217 { |
| 116 RegistryOverrideManager override_manager; | 218 ResetRegistryOverrides(); |
| 117 override_manager.OverrideRegistry(root); | |
| 118 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) | 219 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
| 119 .WriteValue(google_update::kRegApField, L"2.0-dev-stage:building"); | 220 .WriteValue(google_update::kRegApField, L"2.0-dev-stage:building"); |
| 120 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 221 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 121 installer::NO_STAGE); | 222 installer::NO_STAGE); |
| 122 std::wstring value; | 223 std::wstring value; |
| 123 EXPECT_EQ(ERROR_SUCCESS, | 224 EXPECT_EQ(ERROR_SUCCESS, |
| 124 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 225 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 125 .ReadValue(google_update::kRegApField, &value)); | 226 .ReadValue(google_update::kRegApField, &value)); |
| 126 EXPECT_EQ(L"2.0-dev", value); | 227 EXPECT_EQ(L"2.0-dev", value); |
| 127 } | 228 } |
| 128 } | 229 } |
| 129 | 230 |
| 130 TEST_F(InstallUtilTest, UpdateInstallerStage) { | 231 TEST_F(InstallUtilTest, UpdateInstallerStage) { |
| 131 const bool system_level = false; | 232 const bool system_level = false; |
| 132 const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 233 const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 133 std::wstring state_key_path(L"PhonyClientState"); | 234 std::wstring state_key_path(L"PhonyClientState"); |
| 134 | 235 |
| 135 // Update the stage when there's no "InstallerExtraCode1" value. | 236 // Update the stage when there's no "InstallerExtraCode1" value. |
| 136 { | 237 { |
| 137 RegistryOverrideManager override_manager; | 238 ResetRegistryOverrides(); |
| 138 override_manager.OverrideRegistry(root); | |
| 139 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) | 239 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
| 140 .DeleteValue(installer::kInstallerExtraCode1); | 240 .DeleteValue(installer::kInstallerExtraCode1); |
| 141 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 241 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 142 installer::BUILDING); | 242 installer::BUILDING); |
| 143 DWORD value; | 243 DWORD value; |
| 144 EXPECT_EQ(ERROR_SUCCESS, | 244 EXPECT_EQ(ERROR_SUCCESS, |
| 145 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 245 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 146 .ReadValueDW(installer::kInstallerExtraCode1, &value)); | 246 .ReadValueDW(installer::kInstallerExtraCode1, &value)); |
| 147 EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value); | 247 EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value); |
| 148 } | 248 } |
| 149 | 249 |
| 150 // Update the stage when there is an "InstallerExtraCode1" value. | 250 // Update the stage when there is an "InstallerExtraCode1" value. |
| 151 { | 251 { |
| 152 RegistryOverrideManager override_manager; | 252 ResetRegistryOverrides(); |
| 153 override_manager.OverrideRegistry(root); | |
| 154 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) | 253 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
| 155 .WriteValue(installer::kInstallerExtraCode1, | 254 .WriteValue(installer::kInstallerExtraCode1, |
| 156 static_cast<DWORD>(installer::UNPACKING)); | 255 static_cast<DWORD>(installer::UNPACKING)); |
| 157 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 256 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 158 installer::BUILDING); | 257 installer::BUILDING); |
| 159 DWORD value; | 258 DWORD value; |
| 160 EXPECT_EQ(ERROR_SUCCESS, | 259 EXPECT_EQ(ERROR_SUCCESS, |
| 161 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 260 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 162 .ReadValueDW(installer::kInstallerExtraCode1, &value)); | 261 .ReadValueDW(installer::kInstallerExtraCode1, &value)); |
| 163 EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value); | 262 EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value); |
| 164 } | 263 } |
| 165 | 264 |
| 166 // Clear the stage. | 265 // Clear the stage. |
| 167 { | 266 { |
| 168 RegistryOverrideManager override_manager; | 267 ResetRegistryOverrides(); |
| 169 override_manager.OverrideRegistry(root); | |
| 170 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) | 268 RegKey(root, state_key_path.c_str(), KEY_SET_VALUE) |
| 171 .WriteValue(installer::kInstallerExtraCode1, static_cast<DWORD>(5)); | 269 .WriteValue(installer::kInstallerExtraCode1, static_cast<DWORD>(5)); |
| 172 InstallUtil::UpdateInstallerStage(system_level, state_key_path, | 270 InstallUtil::UpdateInstallerStage(system_level, state_key_path, |
| 173 installer::NO_STAGE); | 271 installer::NO_STAGE); |
| 174 DWORD value; | 272 DWORD value; |
| 175 EXPECT_EQ(ERROR_FILE_NOT_FOUND, | 273 EXPECT_EQ(ERROR_FILE_NOT_FOUND, |
| 176 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) | 274 RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE) |
| 177 .ReadValueDW(installer::kInstallerExtraCode1, &value)); | 275 .ReadValueDW(installer::kInstallerExtraCode1, &value)); |
| 178 } | 276 } |
| 179 } | 277 } |
| 180 | 278 |
| 181 TEST_F(InstallUtilTest, DeleteRegistryKeyIf) { | 279 TEST_F(InstallUtilTest, DeleteRegistryKeyIf) { |
| 182 const HKEY root = HKEY_CURRENT_USER; | 280 const HKEY root = HKEY_CURRENT_USER; |
| 183 std::wstring parent_key_path(L"SomeKey\\ToDelete"); | 281 std::wstring parent_key_path(L"SomeKey\\ToDelete"); |
| 184 std::wstring child_key_path(parent_key_path); | 282 std::wstring child_key_path(parent_key_path); |
| 185 child_key_path.append(L"\\ChildKey\\WithAValue"); | 283 child_key_path.append(L"\\ChildKey\\WithAValue"); |
| 186 const wchar_t value_name[] = L"some_value_name"; | 284 const wchar_t value_name[] = L"some_value_name"; |
| 187 const wchar_t value[] = L"hi mom"; | 285 const wchar_t value[] = L"hi mom"; |
| 188 | 286 |
| 287 // Nothing to delete if the keys aren't even there. |
| 189 { | 288 { |
| 190 RegistryOverrideManager override_manager; | 289 MockRegistryValuePredicate pred; |
| 191 override_manager.OverrideRegistry(root); | |
| 192 // Nothing to delete if the keys aren't even there. | |
| 193 { | |
| 194 MockRegistryValuePredicate pred; | |
| 195 | 290 |
| 196 EXPECT_CALL(pred, Evaluate(_)).Times(0); | 291 EXPECT_CALL(pred, Evaluate(_)).Times(0); |
| 197 ASSERT_FALSE(RegKey(root, parent_key_path.c_str(), | 292 ASSERT_FALSE( |
| 198 KEY_QUERY_VALUE).Valid()); | 293 RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 199 EXPECT_EQ(InstallUtil::NOT_FOUND, | 294 EXPECT_EQ(InstallUtil::NOT_FOUND, |
| 200 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 295 InstallUtil::DeleteRegistryKeyIf( |
| 201 child_key_path, | 296 root, parent_key_path, child_key_path, |
| 202 WorkItem::kWow64Default, | 297 WorkItem::kWow64Default, value_name, pred)); |
| 203 value_name, pred)); | 298 EXPECT_FALSE( |
| 204 EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), | 299 RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 205 KEY_QUERY_VALUE).Valid()); | 300 } |
| 206 } | |
| 207 | 301 |
| 208 // Parent exists, but not child: no delete. | 302 // Parent exists, but not child: no delete. |
| 209 { | 303 { |
| 210 MockRegistryValuePredicate pred; | 304 MockRegistryValuePredicate pred; |
| 211 | 305 |
| 212 EXPECT_CALL(pred, Evaluate(_)).Times(0); | 306 EXPECT_CALL(pred, Evaluate(_)).Times(0); |
| 213 ASSERT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_SET_VALUE).Valid()); | 307 ASSERT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_SET_VALUE).Valid()); |
| 214 EXPECT_EQ(InstallUtil::NOT_FOUND, | 308 EXPECT_EQ(InstallUtil::NOT_FOUND, |
| 215 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 309 InstallUtil::DeleteRegistryKeyIf( |
| 216 child_key_path, | 310 root, parent_key_path, child_key_path, |
| 217 WorkItem::kWow64Default, | 311 WorkItem::kWow64Default, value_name, pred)); |
| 218 value_name, pred)); | 312 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 219 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), | 313 } |
| 220 KEY_QUERY_VALUE).Valid()); | |
| 221 } | |
| 222 | 314 |
| 223 // Child exists, but no value: no delete. | 315 // Child exists, but no value: no delete. |
| 224 { | 316 { |
| 225 MockRegistryValuePredicate pred; | 317 MockRegistryValuePredicate pred; |
| 226 | 318 |
| 227 EXPECT_CALL(pred, Evaluate(_)).Times(0); | 319 EXPECT_CALL(pred, Evaluate(_)).Times(0); |
| 228 ASSERT_TRUE(RegKey(root, child_key_path.c_str(), KEY_SET_VALUE).Valid()); | 320 ASSERT_TRUE(RegKey(root, child_key_path.c_str(), KEY_SET_VALUE).Valid()); |
| 229 EXPECT_EQ(InstallUtil::NOT_FOUND, | 321 EXPECT_EQ(InstallUtil::NOT_FOUND, |
| 230 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 322 InstallUtil::DeleteRegistryKeyIf( |
| 231 child_key_path, | 323 root, parent_key_path, child_key_path, |
| 232 WorkItem::kWow64Default, | 324 WorkItem::kWow64Default, value_name, pred)); |
| 233 value_name, pred)); | 325 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 234 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), | 326 } |
| 235 KEY_QUERY_VALUE).Valid()); | |
| 236 } | |
| 237 | 327 |
| 238 // Value exists, but doesn't match: no delete. | 328 // Value exists, but doesn't match: no delete. |
| 239 { | 329 { |
| 240 MockRegistryValuePredicate pred; | 330 MockRegistryValuePredicate pred; |
| 241 | 331 |
| 242 EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false)); | 332 EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false)); |
| 243 ASSERT_EQ(ERROR_SUCCESS, | 333 ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
| 244 RegKey(root, child_key_path.c_str(), | 334 .WriteValue(value_name, L"foosball!")); |
| 245 KEY_SET_VALUE).WriteValue(value_name, L"foosball!")); | 335 EXPECT_EQ(InstallUtil::NOT_FOUND, |
| 246 EXPECT_EQ(InstallUtil::NOT_FOUND, | 336 InstallUtil::DeleteRegistryKeyIf( |
| 247 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 337 root, parent_key_path, child_key_path, |
| 248 child_key_path, | 338 WorkItem::kWow64Default, value_name, pred)); |
| 249 WorkItem::kWow64Default, | 339 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 250 value_name, pred)); | 340 } |
| 251 EXPECT_TRUE(RegKey(root, parent_key_path.c_str(), | |
| 252 KEY_QUERY_VALUE).Valid()); | |
| 253 } | |
| 254 | 341 |
| 255 // Value exists, and matches: delete. | 342 // Value exists, and matches: delete. |
| 256 { | 343 { |
| 257 MockRegistryValuePredicate pred; | 344 MockRegistryValuePredicate pred; |
| 258 | 345 |
| 259 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); | 346 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
| 260 ASSERT_EQ(ERROR_SUCCESS, | 347 ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
| 261 RegKey(root, child_key_path.c_str(), | 348 .WriteValue(value_name, value)); |
| 262 KEY_SET_VALUE).WriteValue(value_name, value)); | 349 EXPECT_EQ(InstallUtil::DELETED, |
| 263 EXPECT_EQ(InstallUtil::DELETED, | 350 InstallUtil::DeleteRegistryKeyIf( |
| 264 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 351 root, parent_key_path, child_key_path, |
| 265 child_key_path, | 352 WorkItem::kWow64Default, value_name, pred)); |
| 266 WorkItem::kWow64Default, | 353 EXPECT_FALSE( |
| 267 value_name, pred)); | 354 RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 268 EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), | 355 } |
| 269 KEY_QUERY_VALUE).Valid()); | |
| 270 } | |
| 271 | 356 |
| 272 // Default value exists and matches: delete. | 357 // Default value exists and matches: delete. |
| 273 { | 358 { |
| 274 MockRegistryValuePredicate pred; | 359 MockRegistryValuePredicate pred; |
| 275 | 360 |
| 276 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); | 361 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
| 277 ASSERT_EQ(ERROR_SUCCESS, | 362 ASSERT_EQ(ERROR_SUCCESS, RegKey(root, child_key_path.c_str(), KEY_SET_VALUE) |
| 278 RegKey(root, child_key_path.c_str(), | 363 .WriteValue(NULL, value)); |
| 279 KEY_SET_VALUE).WriteValue(NULL, value)); | 364 EXPECT_EQ(InstallUtil::DELETED, InstallUtil::DeleteRegistryKeyIf( |
| 280 EXPECT_EQ(InstallUtil::DELETED, | 365 root, parent_key_path, child_key_path, |
| 281 InstallUtil::DeleteRegistryKeyIf(root, parent_key_path, | 366 WorkItem::kWow64Default, NULL, pred)); |
| 282 child_key_path, | 367 EXPECT_FALSE( |
| 283 WorkItem::kWow64Default, | 368 RegKey(root, parent_key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 284 NULL, pred)); | |
| 285 EXPECT_FALSE(RegKey(root, parent_key_path.c_str(), | |
| 286 KEY_QUERY_VALUE).Valid()); | |
| 287 } | |
| 288 } | 369 } |
| 289 } | 370 } |
| 290 | 371 |
| 291 TEST_F(InstallUtilTest, DeleteRegistryValueIf) { | 372 TEST_F(InstallUtilTest, DeleteRegistryValueIf) { |
| 292 const HKEY root = HKEY_CURRENT_USER; | 373 const HKEY root = HKEY_CURRENT_USER; |
| 293 std::wstring key_path(L"SomeKey\\ToDelete"); | 374 std::wstring key_path(L"SomeKey\\ToDelete"); |
| 294 const wchar_t value_name[] = L"some_value_name"; | 375 const wchar_t value_name[] = L"some_value_name"; |
| 295 const wchar_t value[] = L"hi mom"; | 376 const wchar_t value[] = L"hi mom"; |
| 296 | 377 |
| 297 { | 378 { |
| 298 RegistryOverrideManager override_manager; | 379 ResetRegistryOverrides(); |
| 299 override_manager.OverrideRegistry(root); | |
| 300 // Nothing to delete if the key isn't even there. | 380 // Nothing to delete if the key isn't even there. |
| 301 { | 381 { |
| 302 MockRegistryValuePredicate pred; | 382 MockRegistryValuePredicate pred; |
| 303 | 383 |
| 304 EXPECT_CALL(pred, Evaluate(_)).Times(0); | 384 EXPECT_CALL(pred, Evaluate(_)).Times(0); |
| 305 ASSERT_FALSE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); | 385 ASSERT_FALSE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 306 EXPECT_EQ(InstallUtil::NOT_FOUND, | 386 EXPECT_EQ(InstallUtil::NOT_FOUND, |
| 307 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), | 387 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), |
| 308 WorkItem::kWow64Default, | 388 WorkItem::kWow64Default, |
| 309 value_name, pred)); | 389 value_name, pred)); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), | 432 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), |
| 353 WorkItem::kWow64Default, | 433 WorkItem::kWow64Default, |
| 354 value_name, pred)); | 434 value_name, pred)); |
| 355 EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); | 435 EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 356 EXPECT_FALSE(RegKey(root, key_path.c_str(), | 436 EXPECT_FALSE(RegKey(root, key_path.c_str(), |
| 357 KEY_QUERY_VALUE).HasValue(value_name)); | 437 KEY_QUERY_VALUE).HasValue(value_name)); |
| 358 } | 438 } |
| 359 } | 439 } |
| 360 | 440 |
| 361 { | 441 { |
| 362 RegistryOverrideManager override_manager; | 442 ResetRegistryOverrides(); |
| 363 override_manager.OverrideRegistry(root); | |
| 364 // Default value matches: delete using empty string. | 443 // Default value matches: delete using empty string. |
| 365 { | 444 { |
| 366 MockRegistryValuePredicate pred; | 445 MockRegistryValuePredicate pred; |
| 367 | 446 |
| 368 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); | 447 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
| 369 ASSERT_EQ(ERROR_SUCCESS, | 448 ASSERT_EQ(ERROR_SUCCESS, |
| 370 RegKey(root, key_path.c_str(), | 449 RegKey(root, key_path.c_str(), |
| 371 KEY_SET_VALUE).WriteValue(L"", value)); | 450 KEY_SET_VALUE).WriteValue(L"", value)); |
| 372 EXPECT_EQ(InstallUtil::DELETED, | 451 EXPECT_EQ(InstallUtil::DELETED, |
| 373 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), | 452 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), |
| 374 WorkItem::kWow64Default, L"", | 453 WorkItem::kWow64Default, L"", |
| 375 pred)); | 454 pred)); |
| 376 EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); | 455 EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid()); |
| 377 EXPECT_FALSE(RegKey(root, key_path.c_str(), | 456 EXPECT_FALSE(RegKey(root, key_path.c_str(), |
| 378 KEY_QUERY_VALUE).HasValue(L"")); | 457 KEY_QUERY_VALUE).HasValue(L"")); |
| 379 } | 458 } |
| 380 } | 459 } |
| 381 | 460 |
| 382 { | 461 { |
| 383 RegistryOverrideManager override_manager; | 462 ResetRegistryOverrides(); |
| 384 override_manager.OverrideRegistry(root); | |
| 385 // Default value matches: delete using NULL. | 463 // Default value matches: delete using NULL. |
| 386 { | 464 { |
| 387 MockRegistryValuePredicate pred; | 465 MockRegistryValuePredicate pred; |
| 388 | 466 |
| 389 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); | 467 EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true)); |
| 390 ASSERT_EQ(ERROR_SUCCESS, | 468 ASSERT_EQ(ERROR_SUCCESS, |
| 391 RegKey(root, key_path.c_str(), | 469 RegKey(root, key_path.c_str(), |
| 392 KEY_SET_VALUE).WriteValue(L"", value)); | 470 KEY_SET_VALUE).WriteValue(L"", value)); |
| 393 EXPECT_EQ(InstallUtil::DELETED, | 471 EXPECT_EQ(InstallUtil::DELETED, |
| 394 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), | 472 InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(), |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 #if defined(_WIN64) | 557 #if defined(_WIN64) |
| 480 const int kOtherProgramFilesKey = base::DIR_PROGRAM_FILES; | 558 const int kOtherProgramFilesKey = base::DIR_PROGRAM_FILES; |
| 481 base::ScopedPathOverride other_program_files_override(kOtherProgramFilesKey); | 559 base::ScopedPathOverride other_program_files_override(kOtherProgramFilesKey); |
| 482 ASSERT_TRUE(PathService::Get(kOtherProgramFilesKey, &some_exe)); | 560 ASSERT_TRUE(PathService::Get(kOtherProgramFilesKey, &some_exe)); |
| 483 some_exe = some_exe.AppendASCII("Company") | 561 some_exe = some_exe.AppendASCII("Company") |
| 484 .AppendASCII("Product") | 562 .AppendASCII("Product") |
| 485 .AppendASCII("product.exe"); | 563 .AppendASCII("product.exe"); |
| 486 EXPECT_TRUE(InstallUtil::IsPerUserInstall(some_exe)); | 564 EXPECT_TRUE(InstallUtil::IsPerUserInstall(some_exe)); |
| 487 #endif // defined(_WIN64) | 565 #endif // defined(_WIN64) |
| 488 } | 566 } |
| OLD | NEW |