| 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/setup/installer_state.h" | 5 #include "chrome/installer/setup/installer_state.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <fstream> | 10 #include <fstream> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 DISALLOW_COPY_AND_ASSIGN(InstallerStateTest); | 55 DISALLOW_COPY_AND_ASSIGN(InstallerStateTest); |
| 56 }; | 56 }; |
| 57 | 57 |
| 58 // An installer state on which we can access otherwise protected members. | 58 // An installer state on which we can access otherwise protected members. |
| 59 class MockInstallerState : public InstallerState { | 59 class MockInstallerState : public InstallerState { |
| 60 public: | 60 public: |
| 61 MockInstallerState() : InstallerState() { } | 61 MockInstallerState() : InstallerState() { } |
| 62 void set_target_path(const base::FilePath& target_path) { | 62 void set_target_path(const base::FilePath& target_path) { |
| 63 target_path_ = target_path; | 63 target_path_ = target_path; |
| 64 } | 64 } |
| 65 static bool IsFileInUse(const base::FilePath& file) { | |
| 66 return InstallerState::IsFileInUse(file); | |
| 67 } | |
| 68 const base::Version& critical_update_version() const { | 65 const base::Version& critical_update_version() const { |
| 69 return critical_update_version_; | 66 return critical_update_version_; |
| 70 } | 67 } |
| 71 }; | 68 }; |
| 72 | 69 |
| 73 TEST_F(InstallerStateTest, WithProduct) { | 70 TEST_F(InstallerStateTest, WithProduct) { |
| 74 const bool multi_install = false; | |
| 75 const bool system_level = true; | 71 const bool system_level = true; |
| 76 base::CommandLine cmd_line = base::CommandLine::FromString( | 72 base::CommandLine cmd_line = base::CommandLine::FromString( |
| 77 std::wstring(L"setup.exe") + | 73 std::wstring(L"setup.exe") + |
| 78 (multi_install ? L" --multi-install --chrome" : L"") + | |
| 79 (system_level ? L" --system-level" : L"")); | 74 (system_level ? L" --system-level" : L"")); |
| 80 MasterPreferences prefs(cmd_line); | 75 MasterPreferences prefs(cmd_line); |
| 81 InstallationState machine_state; | 76 InstallationState machine_state; |
| 82 machine_state.Initialize(); | 77 machine_state.Initialize(); |
| 83 MockInstallerState installer_state; | 78 MockInstallerState installer_state; |
| 84 installer_state.Initialize(cmd_line, prefs, machine_state); | 79 installer_state.Initialize(cmd_line, prefs, machine_state); |
| 85 installer_state.set_target_path(test_dir_.GetPath()); | 80 installer_state.set_target_path(test_dir_.GetPath()); |
| 86 EXPECT_EQ(1U, installer_state.products().size()); | |
| 87 EXPECT_EQ(system_level, installer_state.system_install()); | 81 EXPECT_EQ(system_level, installer_state.system_install()); |
| 88 | 82 |
| 89 const char kCurrentVersion[] = "1.2.3.4"; | 83 const char kCurrentVersion[] = "1.2.3.4"; |
| 90 base::Version current_version(kCurrentVersion); | 84 base::Version current_version(kCurrentVersion); |
| 91 | 85 |
| 92 HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 86 HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 93 EXPECT_EQ(root, installer_state.root_key()); | 87 EXPECT_EQ(root, installer_state.root_key()); |
| 94 | 88 |
| 95 { | 89 { |
| 96 RegistryOverrideManager override_manager; | 90 RegistryOverrideManager override_manager; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 116 | 110 |
| 117 TEST_F(InstallerStateTest, InstallerResult) { | 111 TEST_F(InstallerStateTest, InstallerResult) { |
| 118 const bool system_level = true; | 112 const bool system_level = true; |
| 119 HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 113 HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 120 | 114 |
| 121 RegKey key; | 115 RegKey key; |
| 122 std::wstring launch_cmd = L"hey diddle diddle"; | 116 std::wstring launch_cmd = L"hey diddle diddle"; |
| 123 std::wstring value; | 117 std::wstring value; |
| 124 DWORD dw_value; | 118 DWORD dw_value; |
| 125 | 119 |
| 126 // Check results for a fresh install of single Chrome and the same for an | 120 // Check results for a fresh install of Chrome and the same for an attempt at |
| 127 // attempt at multi-install, which is now ignored. | 121 // multi-install, which is now ignored. |
| 128 static constexpr const wchar_t* kCommandLines[] = { | 122 static constexpr const wchar_t* kCommandLines[] = { |
| 129 L"setup.exe --system-level", | 123 L"setup.exe --system-level", |
| 130 L"setup.exe --system-level --multi-install --chrome", | 124 L"setup.exe --system-level --multi-install --chrome", |
| 131 }; | 125 }; |
| 132 for (const wchar_t* command_line : kCommandLines) { | 126 for (const wchar_t* command_line : kCommandLines) { |
| 133 RegistryOverrideManager override_manager; | 127 RegistryOverrideManager override_manager; |
| 134 override_manager.OverrideRegistry(root); | 128 override_manager.OverrideRegistry(root); |
| 135 base::CommandLine cmd_line = base::CommandLine::FromString(command_line); | 129 base::CommandLine cmd_line = base::CommandLine::FromString(command_line); |
| 136 const MasterPreferences prefs(cmd_line); | 130 const MasterPreferences prefs(cmd_line); |
| 137 InstallationState machine_state; | 131 InstallationState machine_state; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 MasterPreferences prefs(cmd_line); | 171 MasterPreferences prefs(cmd_line); |
| 178 InstallerState installer_state; | 172 InstallerState installer_state; |
| 179 installer_state.Initialize(cmd_line, prefs, machine_state); | 173 installer_state.Initialize(cmd_line, prefs, machine_state); |
| 180 | 174 |
| 181 // Is the Chrome version picked up? | 175 // Is the Chrome version picked up? |
| 182 std::unique_ptr<base::Version> version( | 176 std::unique_ptr<base::Version> version( |
| 183 installer_state.GetCurrentVersion(machine_state)); | 177 installer_state.GetCurrentVersion(machine_state)); |
| 184 EXPECT_TRUE(version.get() != NULL); | 178 EXPECT_TRUE(version.get() != NULL); |
| 185 } | 179 } |
| 186 | 180 |
| 187 TEST_F(InstallerStateTest, IsFileInUse) { | |
| 188 base::ScopedTempDir temp_dir; | |
| 189 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
| 190 | |
| 191 base::FilePath temp_file; | |
| 192 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file)); | |
| 193 | |
| 194 EXPECT_FALSE(MockInstallerState::IsFileInUse(temp_file)); | |
| 195 | |
| 196 { | |
| 197 // Open a handle to the file with the same access mode and sharing options | |
| 198 // as the loader. | |
| 199 base::win::ScopedHandle temp_handle(CreateFile( | |
| 200 temp_file.value().c_str(), SYNCHRONIZE | FILE_EXECUTE, | |
| 201 FILE_SHARE_DELETE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0)); | |
| 202 ASSERT_TRUE(temp_handle.IsValid()); | |
| 203 | |
| 204 // The file should now be in use. | |
| 205 EXPECT_TRUE(MockInstallerState::IsFileInUse(temp_file)); | |
| 206 } | |
| 207 | |
| 208 // And once the handle is gone, it should no longer be in use. | |
| 209 EXPECT_FALSE(MockInstallerState::IsFileInUse(temp_file)); | |
| 210 } | |
| 211 | |
| 212 TEST_F(InstallerStateTest, InitializeTwice) { | 181 TEST_F(InstallerStateTest, InitializeTwice) { |
| 213 // Override these paths so that they can be found after the registry override | 182 // Override these paths so that they can be found after the registry override |
| 214 // manager is in place. | 183 // manager is in place. |
| 215 base::FilePath temp; | 184 base::FilePath temp; |
| 216 PathService::Get(base::DIR_PROGRAM_FILES, &temp); | 185 PathService::Get(base::DIR_PROGRAM_FILES, &temp); |
| 217 base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES, | 186 base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES, |
| 218 temp); | 187 temp); |
| 219 PathService::Get(base::DIR_PROGRAM_FILESX86, &temp); | 188 PathService::Get(base::DIR_PROGRAM_FILESX86, &temp); |
| 220 base::ScopedPathOverride program_filesx86_override(base::DIR_PROGRAM_FILESX86, | 189 base::ScopedPathOverride program_filesx86_override(base::DIR_PROGRAM_FILESX86, |
| 221 temp); | 190 temp); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 232 InstallerState installer_state; | 201 InstallerState installer_state; |
| 233 | 202 |
| 234 // Initialize the instance to install user-level Chrome. | 203 // Initialize the instance to install user-level Chrome. |
| 235 { | 204 { |
| 236 base::CommandLine cmd_line(base::CommandLine::FromString(L"setup.exe")); | 205 base::CommandLine cmd_line(base::CommandLine::FromString(L"setup.exe")); |
| 237 MasterPreferences prefs(cmd_line); | 206 MasterPreferences prefs(cmd_line); |
| 238 installer_state.Initialize(cmd_line, prefs, machine_state); | 207 installer_state.Initialize(cmd_line, prefs, machine_state); |
| 239 } | 208 } |
| 240 // Confirm the expected state. | 209 // Confirm the expected state. |
| 241 EXPECT_EQ(InstallerState::USER_LEVEL, installer_state.level()); | 210 EXPECT_EQ(InstallerState::USER_LEVEL, installer_state.level()); |
| 242 EXPECT_EQ(InstallerState::SINGLE_PACKAGE, installer_state.package_type()); | |
| 243 EXPECT_EQ(InstallerState::SINGLE_INSTALL_OR_UPDATE, | 211 EXPECT_EQ(InstallerState::SINGLE_INSTALL_OR_UPDATE, |
| 244 installer_state.operation()); | 212 installer_state.operation()); |
| 245 EXPECT_TRUE(wcsstr(installer_state.target_path().value().c_str(), | 213 EXPECT_TRUE(wcsstr(installer_state.target_path().value().c_str(), |
| 246 BrowserDistribution::GetSpecificDistribution( | 214 BrowserDistribution::GetSpecificDistribution( |
| 247 BrowserDistribution::CHROME_BROWSER) | 215 BrowserDistribution::CHROME_BROWSER) |
| 248 ->GetInstallSubDir() | 216 ->GetInstallSubDir() |
| 249 .c_str())); | 217 .c_str())); |
| 250 EXPECT_FALSE(installer_state.verbose_logging()); | 218 EXPECT_FALSE(installer_state.verbose_logging()); |
| 251 EXPECT_EQ(installer_state.state_key(), | 219 EXPECT_EQ(installer_state.state_key(), |
| 252 BrowserDistribution::GetSpecificDistribution( | 220 BrowserDistribution::GetSpecificDistribution( |
| 253 BrowserDistribution::CHROME_BROWSER)->GetStateKey()); | 221 BrowserDistribution::CHROME_BROWSER)->GetStateKey()); |
| 254 EXPECT_EQ(installer_state.state_type(), BrowserDistribution::CHROME_BROWSER); | 222 EXPECT_EQ(installer_state.state_type(), BrowserDistribution::CHROME_BROWSER); |
| 255 EXPECT_TRUE(installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER)); | |
| 256 | 223 |
| 257 // Now initialize it to install system-level single Chrome. | 224 // Now initialize it to install system-level single Chrome. |
| 258 { | 225 { |
| 259 base::CommandLine cmd_line(base::CommandLine::FromString( | 226 base::CommandLine cmd_line(base::CommandLine::FromString( |
| 260 L"setup.exe --system-level --verbose-logging")); | 227 L"setup.exe --system-level --verbose-logging")); |
| 261 MasterPreferences prefs(cmd_line); | 228 MasterPreferences prefs(cmd_line); |
| 262 installer_state.Initialize(cmd_line, prefs, machine_state); | 229 installer_state.Initialize(cmd_line, prefs, machine_state); |
| 263 } | 230 } |
| 264 | 231 |
| 265 // Confirm that the old state is gone. | 232 // Confirm that the old state is gone. |
| 266 EXPECT_EQ(InstallerState::SYSTEM_LEVEL, installer_state.level()); | 233 EXPECT_EQ(InstallerState::SYSTEM_LEVEL, installer_state.level()); |
| 267 EXPECT_EQ(InstallerState::SINGLE_PACKAGE, installer_state.package_type()); | |
| 268 EXPECT_EQ(InstallerState::SINGLE_INSTALL_OR_UPDATE, | 234 EXPECT_EQ(InstallerState::SINGLE_INSTALL_OR_UPDATE, |
| 269 installer_state.operation()); | 235 installer_state.operation()); |
| 270 EXPECT_TRUE(wcsstr(installer_state.target_path().value().c_str(), | 236 EXPECT_TRUE(wcsstr(installer_state.target_path().value().c_str(), |
| 271 BrowserDistribution::GetSpecificDistribution( | 237 BrowserDistribution::GetSpecificDistribution( |
| 272 BrowserDistribution::CHROME_BROWSER)-> | 238 BrowserDistribution::CHROME_BROWSER)-> |
| 273 GetInstallSubDir().c_str())); | 239 GetInstallSubDir().c_str())); |
| 274 EXPECT_TRUE(installer_state.verbose_logging()); | 240 EXPECT_TRUE(installer_state.verbose_logging()); |
| 275 EXPECT_EQ(installer_state.state_key(), | 241 EXPECT_EQ(installer_state.state_key(), |
| 276 BrowserDistribution::GetSpecificDistribution( | 242 BrowserDistribution::GetSpecificDistribution( |
| 277 BrowserDistribution::CHROME_BROWSER)->GetStateKey()); | 243 BrowserDistribution::CHROME_BROWSER)->GetStateKey()); |
| 278 EXPECT_EQ(installer_state.state_type(), BrowserDistribution::CHROME_BROWSER); | 244 EXPECT_EQ(installer_state.state_type(), BrowserDistribution::CHROME_BROWSER); |
| 279 EXPECT_TRUE(installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER)); | |
| 280 } | 245 } |
| 281 | 246 |
| 282 // A fixture for testing InstallerState::DetermineCriticalVersion. Individual | 247 // A fixture for testing InstallerState::DetermineCriticalVersion. Individual |
| 283 // tests must invoke Initialize() with a critical version. | 248 // tests must invoke Initialize() with a critical version. |
| 284 class InstallerStateCriticalVersionTest : public ::testing::Test { | 249 class InstallerStateCriticalVersionTest : public ::testing::Test { |
| 285 protected: | 250 protected: |
| 286 InstallerStateCriticalVersionTest() | 251 InstallerStateCriticalVersionTest() |
| 287 : cmd_line_(base::CommandLine::NO_PROGRAM) {} | 252 : cmd_line_(base::CommandLine::NO_PROGRAM) {} |
| 288 | 253 |
| 289 // Creates a set of versions for use by all test runs. | 254 // Creates a set of versions for use by all test runs. |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 // Critical update newer than the new version. | 386 // Critical update newer than the new version. |
| 422 EXPECT_FALSE( | 387 EXPECT_FALSE( |
| 423 installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); | 388 installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); |
| 424 EXPECT_FALSE( | 389 EXPECT_FALSE( |
| 425 installer_state.DetermineCriticalVersion(opv_version_, *pv_version_) | 390 installer_state.DetermineCriticalVersion(opv_version_, *pv_version_) |
| 426 .IsValid()); | 391 .IsValid()); |
| 427 EXPECT_FALSE( | 392 EXPECT_FALSE( |
| 428 installer_state.DetermineCriticalVersion(pv_version_, *pv_version_) | 393 installer_state.DetermineCriticalVersion(pv_version_, *pv_version_) |
| 429 .IsValid()); | 394 .IsValid()); |
| 430 } | 395 } |
| OLD | NEW |