15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/product_unittest.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/path_service.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_reg_util_win.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/chrome_frame_distribution.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installation_state.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installer_state.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/product.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::Product; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::MasterPreferences; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using registry_util::RegistryOverrideManager; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestWithTempDir::SetUp() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Name a subdirectory of the user temp directory. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestWithTempDir::TearDown() { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::CloseLogFile(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_dir_.Delete()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestWithTempDirAndDeleteTempOverrideKeys::SetUp() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWithTempDir::SetUp(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestWithTempDirAndDeleteTempOverrideKeys::TearDown() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWithTempDir::TearDown(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProductTest : public TestWithTempDirAndDeleteTempOverrideKeys { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ProductTest, ProductInstallBasic) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tommi): We should mock this and use our mocked distribution. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool multi_install = false; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool system_level = true; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine cmd_line = CommandLine::FromString( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring(L"setup.exe") + 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (multi_install ? L" --multi-install --chrome" : L"") + 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (system_level ? L" --system-level" : L"")); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::MasterPreferences prefs(cmd_line); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::InstallationState machine_state; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.Initialize(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::InstallerState installer_state; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state.Initialize(cmd_line, prefs, machine_state); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Product* product = installer_state.products()[0]; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* distribution = product->distribution(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BrowserDistribution::CHROME_BROWSER, distribution->GetType()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath user_data_dir; 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)); 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(user_data_dir.empty()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath program_files; 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES, &program_files)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The User Data path should never be under program files, even though 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system_level is true. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::wstring::npos, 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) user_data_dir.value().find(program_files.value())); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY root = installer_state.root_key(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistryOverrideManager override_manager; 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci override_manager.OverrideRegistry(root); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // There should be no installed version in the registry. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci machine_state.Initialize(); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(machine_state.GetProductState( 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci system_level, distribution->GetType()) == NULL); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's pretend chrome is installed. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey version_key(root, distribution->GetVersionKey().c_str(), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KEY_ALL_ACCESS); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(version_key.Valid()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kCurrentVersion[] = "1.2.3.4"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version current_version(kCurrentVersion); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version_key.WriteValue(google_update::kRegVersionField, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToWide( 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_version.GetString()).c_str()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We started out with a non-msi product. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.Initialize(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const installer::ProductState* chrome_state = 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.GetProductState(system_level, distribution->GetType()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chrome_state != NULL); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome_state != NULL) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chrome_state->version().Equals(current_version)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(chrome_state->is_msi()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a make-believe client state key. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring state_key_path(distribution->GetStateKey()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ERROR_SUCCESS, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Create(root, state_key_path.c_str(), KEY_ALL_ACCESS)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the MSI marker, refresh, and verify that we now see the MSI marker. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(product->SetMsiMarker(system_level, true)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.Initialize(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_state = 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.GetProductState(system_level, distribution->GetType()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chrome_state != NULL); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome_state != NULL) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chrome_state->is_msi()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProductTest, LaunchChrome) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tommi): Test Product::LaunchChrome and 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Product::LaunchChromeAndWait. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Test not implemented."; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 132