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 3 // found in the LICENSE file. 4 5 #include "base/command_line.h" 6 #include "base/files/file_path.h" 7 #include "base/memory/scoped_ptr.h" 8 #include "base/process/kill.h" 9 #include "base/strings/string_util.h" 10 #include "chrome/common/chrome_result_codes.h" 11 #include "chrome/common/chrome_switches.h" 12 #include "chrome/installer/util/install_util.h" 13 #include "chrome/installer/util/installation_validator.h" 14 #include "chrome/installer/util/util_constants.h" 15 #include "chrome/test/mini_installer_test/installer_path_provider.h" 16 #include "chrome/test/mini_installer_test/installer_test_util.h" 17 #include "chrome/test/mini_installer_test/mini_installer_test_constants.h" 18 #include "chrome/test/mini_installer_test/switch_builder.h" 19 #include "testing/gtest/include/gtest/gtest.h" 20 21 using installer::InstallationValidator; 22 using installer_test::InstallerPathProvider; 23 using installer_test::SwitchBuilder; 24 25 namespace { 26 27 class MiniInstallTest : public testing::Test { 28 public: 29 virtual void SetUp() { 30 std::vector<installer_test::InstalledProduct> installed; 31 if (installer_test::GetInstalledProducts(&installed)) { 32 ASSERT_TRUE(installer_test::UninstallAll()); 33 } 34 } 35 36 virtual void TearDown() { 37 installer_test::UninstallAll(); 38 } 39 40 protected: 41 static void SetUpTestCase() { 42 std::string build_under_test; 43 const CommandLine* cmd = CommandLine::ForCurrentProcess(); 44 build_under_test = cmd->GetSwitchValueASCII(switches::kInstallerTestBuild); 45 if (build_under_test.empty()) 46 provider_ = new InstallerPathProvider(); 47 else 48 provider_ = new InstallerPathProvider(build_under_test); 49 ASSERT_FALSE(provider_->GetCurrentBuild().empty()); 50 ASSERT_TRUE(provider_->GetFullInstaller(&full_installer_)); 51 ASSERT_TRUE(provider_->GetPreviousInstaller(&previous_installer_)); 52 ASSERT_TRUE(provider_->GetDiffInstaller(&diff_installer_)); 53 ASSERT_TRUE( 54 provider_->GetSignedStandaloneInstaller(&standalone_installer_)); 55 ASSERT_TRUE(provider_->GetMiniInstaller(&mini_installer_)); 56 } 57 58 static void TearDownTestCase() { 59 delete provider_; 60 provider_ = NULL; 61 } 62 63 static InstallerPathProvider* provider_; 64 static base::FilePath full_installer_; 65 static base::FilePath previous_installer_; 66 static base::FilePath diff_installer_; 67 static base::FilePath standalone_installer_; 68 static base::FilePath mini_installer_; 69 }; 70 71 InstallerPathProvider* MiniInstallTest::provider_; 72 base::FilePath MiniInstallTest::full_installer_; 73 base::FilePath MiniInstallTest::previous_installer_; 74 base::FilePath MiniInstallTest::diff_installer_; 75 base::FilePath MiniInstallTest::standalone_installer_; 76 base::FilePath MiniInstallTest::mini_installer_; 77 78 } // namespace 79 80 #if defined(GOOGLE_CHROME_BUILD) 81 // Could use a parameterized gtest to slim down this list of tests, but since 82 // these tests will often be run manually, don't want to have obscure test 83 // names. 84 85 // Install full installer at user level. 86 TEST_F(MiniInstallTest, FullInstallerUser) { 87 ASSERT_TRUE(installer_test::Install( 88 full_installer_, SwitchBuilder().AddChrome())); 89 ASSERT_TRUE(installer_test::ValidateInstall(false, 90 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 91 } 92 93 // Install full installer at system level. 94 TEST_F(MiniInstallTest, FullInstallerSys) { 95 ASSERT_TRUE(installer_test::Install(full_installer_, 96 SwitchBuilder().AddChrome().AddSystemInstall())); 97 ASSERT_TRUE(installer_test::ValidateInstall(true, 98 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 99 } 100 101 // Overinstall full installer. 102 TEST_F(MiniInstallTest, FullOverPreviousFullUser) { 103 ASSERT_TRUE(installer_test::Install( 104 previous_installer_, SwitchBuilder().AddChrome())); 105 ASSERT_TRUE(installer_test::ValidateInstall(false, 106 InstallationValidator::CHROME_SINGLE, provider_->GetPreviousBuild())); 107 ASSERT_TRUE(installer_test::Install( 108 full_installer_, SwitchBuilder().AddChrome())); 109 ASSERT_TRUE(installer_test::ValidateInstall(false, 110 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 111 } 112 113 TEST_F(MiniInstallTest, FullOverPreviousFullSys) { 114 ASSERT_TRUE(installer_test::Install(previous_installer_, 115 SwitchBuilder().AddChrome().AddSystemInstall())); 116 ASSERT_TRUE(installer_test::ValidateInstall(true, 117 InstallationValidator::CHROME_SINGLE, provider_->GetPreviousBuild())); 118 ASSERT_TRUE(installer_test::Install(full_installer_, 119 SwitchBuilder().AddChrome().AddSystemInstall())); 120 ASSERT_TRUE(installer_test::ValidateInstall(true, 121 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 122 } 123 124 TEST_F(MiniInstallTest, FreshChromeFrameUser) { 125 ASSERT_TRUE(installer_test::Install( 126 full_installer_, SwitchBuilder().AddChromeFrame())); 127 ASSERT_TRUE(installer_test::ValidateInstall( 128 false, 129 InstallationValidator::CHROME_FRAME_SINGLE, 130 provider_->GetCurrentBuild())); 131 } 132 133 // Overinstall full Chrome Frame installer while IE browser is running. 134 TEST_F(MiniInstallTest, FullFrameOverPreviousFullIERunningSys) { 135 installer_test::LaunchIE("http://www.google.com"); 136 ASSERT_TRUE(installer_test::Install(previous_installer_, 137 SwitchBuilder().AddChromeFrame().AddSystemInstall())); 138 ASSERT_TRUE(installer_test::ValidateInstall( 139 true, 140 InstallationValidator::CHROME_FRAME_SINGLE, 141 provider_->GetPreviousBuild())); 142 ASSERT_TRUE(installer_test::Install(full_installer_, 143 SwitchBuilder().AddChromeFrame().AddSystemInstall())); 144 ASSERT_TRUE(installer_test::ValidateInstall( 145 true, 146 InstallationValidator::CHROME_FRAME_SINGLE, 147 provider_->GetCurrentBuild())); 148 } 149 150 // Overinstall diff installer. 151 TEST_F(MiniInstallTest, DiffOverPreviousFullUser) { 152 ASSERT_TRUE(installer_test::Install( 153 previous_installer_, SwitchBuilder().AddChrome())); 154 ASSERT_TRUE(installer_test::ValidateInstall(false, 155 InstallationValidator::CHROME_SINGLE, provider_->GetPreviousBuild())); 156 ASSERT_TRUE(installer_test::Install( 157 diff_installer_, SwitchBuilder().AddChrome())); 158 ASSERT_TRUE(installer_test::ValidateInstall(false, 159 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 160 } 161 162 TEST_F(MiniInstallTest, DiffOverPreviousFullSys) { 163 ASSERT_TRUE(installer_test::Install(previous_installer_, 164 SwitchBuilder().AddChrome().AddSystemInstall())); 165 ASSERT_TRUE(installer_test::ValidateInstall(true, 166 InstallationValidator::CHROME_SINGLE, provider_->GetPreviousBuild())); 167 ASSERT_TRUE(installer_test::Install(diff_installer_, 168 SwitchBuilder().AddChrome().AddSystemInstall())); 169 ASSERT_TRUE(installer_test::ValidateInstall(true, 170 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 171 } 172 173 // Overinstall diff Chrome Frame installer while IE browser is running. 174 TEST_F(MiniInstallTest, DiffFrameOverPreviousFullIERunningSys) { 175 installer_test::LaunchIE("http://www.google.com"); 176 ASSERT_TRUE(installer_test::Install(previous_installer_, 177 SwitchBuilder().AddChromeFrame().AddSystemInstall())); 178 ASSERT_TRUE(installer_test::ValidateInstall( 179 true, 180 InstallationValidator::CHROME_FRAME_SINGLE, 181 provider_->GetPreviousBuild())); 182 ASSERT_TRUE(installer_test::Install(diff_installer_, 183 SwitchBuilder().AddChromeFrame().AddSystemInstall())); 184 ASSERT_TRUE(installer_test::ValidateInstall( 185 true, 186 InstallationValidator::CHROME_FRAME_SINGLE, 187 provider_->GetCurrentBuild())); 188 } 189 190 TEST_F(MiniInstallTest, InstallChromeMultiOverChromeSys) { 191 ASSERT_TRUE(installer_test::Install(full_installer_, 192 SwitchBuilder().AddChrome().AddSystemInstall())); 193 ASSERT_TRUE(installer_test::ValidateInstall(true, 194 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 195 ASSERT_TRUE(installer_test::Install(full_installer_, 196 SwitchBuilder().AddChrome().AddSystemInstall().AddMultiInstall())); 197 ASSERT_TRUE(installer_test::ValidateInstall(true, 198 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 199 } 200 201 // Repair version folder. 202 TEST_F(MiniInstallTest, RepairFolderOnFullUser) { 203 ASSERT_TRUE(installer_test::Install( 204 full_installer_, SwitchBuilder().AddChrome())); 205 ASSERT_TRUE(installer_test::ValidateInstall(false, 206 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 207 base::CleanupProcesses(installer::kChromeExe, base::TimeDelta(), 208 content::RESULT_CODE_HUNG, NULL); 209 ASSERT_TRUE(installer_test::DeleteInstallDirectory( 210 false, // system level 211 InstallationValidator::CHROME_SINGLE)); 212 ASSERT_TRUE(installer_test::Install( 213 full_installer_, SwitchBuilder().AddChrome())); 214 ASSERT_TRUE(installer_test::ValidateInstall(false, 215 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 216 } 217 218 TEST_F(MiniInstallTest, RepairFolderOnFullSys) { 219 ASSERT_TRUE(installer_test::Install(full_installer_, 220 SwitchBuilder().AddChrome().AddSystemInstall())); 221 ASSERT_TRUE(installer_test::ValidateInstall(true, 222 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 223 base::CleanupProcesses(installer::kChromeExe, base::TimeDelta(), 224 content::RESULT_CODE_HUNG, NULL); 225 ASSERT_TRUE(installer_test::DeleteInstallDirectory( 226 true, // system level 227 InstallationValidator::CHROME_SINGLE)); 228 ASSERT_TRUE(installer_test::Install(full_installer_, 229 SwitchBuilder().AddChrome().AddSystemInstall())); 230 ASSERT_TRUE(installer_test::ValidateInstall(true, 231 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 232 } 233 234 // Repair registry. 235 TEST_F(MiniInstallTest, RepairRegistryOnFullUser) { 236 ASSERT_TRUE(installer_test::Install( 237 full_installer_, SwitchBuilder().AddChrome())); 238 ASSERT_TRUE(installer_test::ValidateInstall(false, 239 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 240 base::CleanupProcesses(installer::kChromeExe, base::TimeDelta(), 241 content::RESULT_CODE_HUNG, NULL); 242 ASSERT_TRUE(installer_test::DeleteRegistryKey( 243 false, // system level 244 InstallationValidator::CHROME_SINGLE)); 245 ASSERT_TRUE( 246 installer_test::Install(full_installer_, SwitchBuilder().AddChrome())); 247 ASSERT_TRUE(installer_test::ValidateInstall(false, 248 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 249 } 250 251 TEST_F(MiniInstallTest, RepairRegistryOnFullSys) { 252 ASSERT_TRUE(installer_test::Install(full_installer_, 253 SwitchBuilder().AddChrome().AddSystemInstall())); 254 ASSERT_TRUE(installer_test::ValidateInstall(true, 255 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 256 ASSERT_TRUE(installer_test::DeleteRegistryKey( 257 true, // system level 258 InstallationValidator::CHROME_SINGLE)); 259 ASSERT_TRUE(installer_test::Install(full_installer_, 260 SwitchBuilder().AddChrome().AddSystemInstall())); 261 ASSERT_TRUE(installer_test::ValidateInstall(true, 262 InstallationValidator::CHROME_SINGLE, provider_->GetCurrentBuild())); 263 } 264 265 // Run full Chrome Frame install then uninstall it while IE browser is running. 266 TEST_F(MiniInstallTest, FullInstallAndUnInstallChromeFrameWithIERunning) { 267 ASSERT_TRUE(installer_test::Install(full_installer_, 268 SwitchBuilder().AddChromeFrame().AddSystemInstall())); 269 ASSERT_TRUE(installer_test::ValidateInstall( 270 true, 271 InstallationValidator::CHROME_FRAME_SINGLE, 272 provider_->GetCurrentBuild())); 273 // Launch IE and let TearDown step perform uninstall. 274 installer_test::LaunchIE("http://www.google.com"); 275 } 276 277 // Install standalone. 278 TEST_F(MiniInstallTest, InstallStandaloneUser) { 279 ASSERT_TRUE(installer_test::Install(standalone_installer_)); 280 ASSERT_TRUE(installer_test::ValidateInstall(false, 281 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 282 } 283 284 // This test doesn't make sense. Disabling for now. 285 TEST_F(MiniInstallTest, DISABLED_MiniInstallerOverChromeMetaInstallerTest) { 286 } 287 288 // Encountering issue 9593. Disabling temporarily. 289 TEST_F(MiniInstallTest, 290 DISABLED_InstallLatestStableFullInstallerOverChromeMetaInstaller) { 291 } 292 293 // Encountering issue 9593. Disabling temporarily. 294 TEST_F(MiniInstallTest, 295 DISABLED_InstallLatestDevFullInstallerOverChromeMetaInstallerTest) { 296 } 297 298 TEST_F(MiniInstallTest, 299 InstallChromeUsingMultiInstallUser) { 300 ASSERT_TRUE(installer_test::Install(full_installer_, 301 SwitchBuilder().AddChrome().AddMultiInstall())); 302 ASSERT_TRUE(installer_test::ValidateInstall(false, 303 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 304 } 305 306 TEST_F(MiniInstallTest, 307 InstallChromeUsingMultiInstallSys) { 308 ASSERT_TRUE(installer_test::Install(full_installer_, 309 SwitchBuilder().AddChrome().AddMultiInstall().AddSystemInstall())); 310 ASSERT_TRUE(installer_test::ValidateInstall(true, 311 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 312 } 313 314 TEST_F(MiniInstallTest, InstallChromeAndChromeFrameMultiInstallUser) { 315 ASSERT_TRUE(installer_test::Install(full_installer_, 316 SwitchBuilder().AddChrome().AddChromeFrame().AddMultiInstall())); 317 ASSERT_TRUE(installer_test::ValidateInstall( 318 false, 319 InstallationValidator::CHROME_FRAME_MULTI_CHROME_MULTI, 320 provider_->GetCurrentBuild())); 321 } 322 323 TEST_F(MiniInstallTest, InstallChromeAndChromeFrameMultiInstallSys) { 324 ASSERT_TRUE(installer_test::Install( 325 full_installer_, SwitchBuilder().AddChrome() 326 .AddChromeFrame().AddMultiInstall().AddSystemInstall())); 327 ASSERT_TRUE(installer_test::ValidateInstall( 328 true, 329 InstallationValidator::CHROME_FRAME_MULTI_CHROME_MULTI, 330 provider_->GetCurrentBuild())); 331 } 332 333 TEST_F(MiniInstallTest, 334 InstallChromeAndChromeFrameReadyModeUser) { 335 ASSERT_TRUE( 336 installer_test::Install(full_installer_,SwitchBuilder().AddChrome() 337 .AddChromeFrame().AddMultiInstall().AddReadyMode())); 338 ASSERT_TRUE(installer_test::ValidateInstall( 339 false, 340 InstallationValidator::CHROME_FRAME_READY_MODE_CHROME_MULTI, 341 provider_->GetCurrentBuild())); 342 } 343 344 TEST_F(MiniInstallTest, 345 InstallChromeAndChromeFrameReadyModeSys) { 346 ASSERT_TRUE(installer_test::Install(full_installer_, 347 SwitchBuilder().AddChrome().AddChromeFrame().AddMultiInstall() 348 .AddReadyMode().AddSystemInstall())); 349 ASSERT_TRUE(installer_test::ValidateInstall( 350 true, 351 InstallationValidator::CHROME_FRAME_READY_MODE_CHROME_MULTI, 352 provider_->GetCurrentBuild())); 353 } 354 355 TEST_F(MiniInstallTest, InstallChromeFrameUsingMultiInstallUser) { 356 ASSERT_TRUE(installer_test::Install(full_installer_, 357 SwitchBuilder().AddChromeFrame().AddMultiInstall())); 358 ASSERT_TRUE(installer_test::ValidateInstall( 359 false, 360 InstallationValidator::CHROME_FRAME_MULTI, 361 provider_->GetCurrentBuild())); 362 } 363 364 TEST_F(MiniInstallTest, InstallChromeFrameUsingMultiInstallSys) { 365 ASSERT_TRUE(installer_test::Install(full_installer_, 366 SwitchBuilder().AddChromeFrame().AddMultiInstall().AddSystemInstall())); 367 ASSERT_TRUE(installer_test::ValidateInstall( 368 true, 369 InstallationValidator::CHROME_FRAME_MULTI, 370 provider_->GetCurrentBuild())); 371 } 372 373 // Chrome Frame is in use while Chrome is install. 374 TEST_F(MiniInstallTest, InstallChromeWithExistingChromeFrameMultiInstallUser) { 375 ASSERT_TRUE(installer_test::Install(previous_installer_, 376 SwitchBuilder().AddChromeFrame().AddMultiInstall())); 377 ASSERT_TRUE(installer_test::ValidateInstall( 378 false, 379 InstallationValidator::CHROME_FRAME_MULTI, 380 provider_->GetPreviousBuild())); 381 ASSERT_TRUE(installer_test::Install(full_installer_, 382 SwitchBuilder().AddChrome().AddMultiInstall())); 383 ASSERT_TRUE(installer_test::ValidateInstall( 384 false, 385 InstallationValidator::CHROME_FRAME_MULTI_CHROME_MULTI, 386 provider_->GetCurrentBuild())); 387 } 388 389 // Chrome Frame is in use while Chrome is install. 390 TEST_F(MiniInstallTest, InstallChromeWithExistingChromeFrameMultiInstallSys) { 391 ASSERT_TRUE(installer_test::Install(previous_installer_, 392 SwitchBuilder().AddChromeFrame().AddMultiInstall().AddSystemInstall())); 393 ASSERT_TRUE(installer_test::ValidateInstall( 394 true, 395 InstallationValidator::CHROME_FRAME_MULTI, 396 provider_->GetPreviousBuild())); 397 ASSERT_TRUE(installer_test::Install(full_installer_, 398 SwitchBuilder().AddChrome().AddMultiInstall())); 399 ASSERT_TRUE(installer_test::ValidateInstall(true, 400 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 401 } 402 403 TEST_F(MiniInstallTest, OverInstallChromeWhenInUseUser) { 404 ASSERT_TRUE(installer_test::Install(full_installer_, 405 SwitchBuilder().AddChrome().AddMultiInstall())); 406 ASSERT_TRUE(installer_test::ValidateInstall(false, 407 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 408 installer_test::LaunchChrome(false, false); 409 ASSERT_TRUE(installer_test::Install(full_installer_, 410 SwitchBuilder().AddChrome().AddMultiInstall())); 411 ASSERT_TRUE(installer_test::ValidateInstall(false, 412 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 413 } 414 415 TEST_F(MiniInstallTest, OverInstallChromeWhenInUseSys) { 416 ASSERT_TRUE(installer_test::Install(full_installer_, 417 SwitchBuilder().AddChrome().AddMultiInstall().AddSystemInstall())); 418 ASSERT_TRUE(installer_test::ValidateInstall(true, 419 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 420 installer_test::LaunchChrome(false, true); 421 ASSERT_TRUE(installer_test::Install(full_installer_, 422 SwitchBuilder().AddChrome().AddMultiInstall().AddSystemInstall())); 423 ASSERT_TRUE(installer_test::ValidateInstall(true, 424 InstallationValidator::CHROME_MULTI, provider_->GetCurrentBuild())); 425 } 426 427 #endif 428 429 TEST(GenericInstallTest, MiniInstallTestValidWindowsVersion) { 430 // We run the tests on all supported OSes. 431 // Make sure the code agrees. 432 EXPECT_TRUE(InstallUtil::IsOSSupported()); 433 } 434 435