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/setup/install_worker.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/installer/setup/setup_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/delete_reg_key_work_item.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/create_reg_key_work_item.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/helper.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installation_state.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installer_state.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/set_reg_value_work_item.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item_list.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::InstallationState; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::InstallerState; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::Product; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::ProductState; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtLeast; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtMost; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Bool; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Combine; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::HasSubstr; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Eq; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrCaseEq; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Values; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock classes to help with testing 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWorkItemList : public WorkItemList { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWorkItemList() {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD4(AddCopyRegKeyWorkItem, WorkItem* (HKEY, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyOverWriteOption)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD5(AddCopyTreeWorkItem, WorkItem*(const std::wstring&, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyOverWriteOption, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(AddCreateDirWorkItem, WorkItem* (const base::FilePath&)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(AddCreateRegKeyWorkItem, WorkItem* (HKEY, const std::wstring&)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(AddDeleteRegKeyWorkItem, WorkItem* (HKEY, const std::wstring&)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(AddDeleteRegValueWorkItem, WorkItem* (HKEY, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&)); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(AddDeleteTreeWorkItem, WorkItem* ( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath&, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>&)); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(AddDeleteTreeWorkItem, WorkItem* (const base::FilePath&)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(AddMoveTreeWorkItem, WorkItem* (const std::wstring&, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Workaround for gmock problems with disambiguating between string pointers 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and DWORD. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WorkItem* AddSetRegValueWorkItem(HKEY a1, const std::wstring& a2, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& a3, const std::wstring& a4, bool a5) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AddSetRegStringValueWorkItem(a1, a2, a3, a4, a5); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WorkItem* AddSetRegValueWorkItem(HKEY a1, const std::wstring& a2, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& a3, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD a4, bool a5) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AddSetRegDwordValueWorkItem(a1, a2, a3, a4, a5); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD5(AddSetRegStringValueWorkItem, WorkItem*(HKEY, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD5(AddSetRegDwordValueWorkItem, WorkItem* (HKEY, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring&, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(AddSelfRegWorkItem, WorkItem* (const std::wstring&, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProductState : public ProductState { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of |version|. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_version(Version* version) { version_.reset(version); } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_multi_install(bool multi) { multi_install_ = multi; } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_brand(const std::wstring& brand) { brand_ = brand; } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_eula_accepted(DWORD eula_accepted) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_eula_accepted_ = true; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eula_accepted_ = eula_accepted; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear_eula_accepted() { has_eula_accepted_ = false; } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_usagestats(DWORD usagestats) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_usagestats_ = true; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usagestats_ = usagestats; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear_usagestats() { has_usagestats_ = false; } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_oem_install(const std::wstring& oem_install) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_oem_install_ = true; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oem_install_ = oem_install; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear_oem_install() { has_oem_install_ = false; } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetUninstallProgram(const base::FilePath& setup_exe) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uninstall_command_ = CommandLine(setup_exe); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddUninstallSwitch(const std::string& option) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uninstall_command_.AppendSwitch(option); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Okay, so this isn't really a mock as such, but it does add setter methods 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to make it easier to build custom InstallationStates. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockInstallationState : public InstallationState { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Included for testing. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetProductState(bool system_install, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::Type type, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProductState& product_state) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProductState& target = (system_install ? system_products_ : 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_products_)[IndexFromDistType(type)]; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.CopyFrom(product_state); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockInstallerState : public InstallerState { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_level(Level level) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::set_level(level); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_operation(Operation operation) { operation_ = operation; } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_state_key(const std::wstring& state_key) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_key_ = state_key; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_state_type(BrowserDistribution::Type state_type) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_type_ = state_type; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_package_type(PackageType type) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::set_package_type(type); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test fixture 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstallWorkerTest : public testing::Test { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_version_.reset(new Version("1.0.0.0")); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_version_.reset(new Version("42.0.0.0")); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't bother ensuring that these paths exist. Since we're just 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // building the work item lists and not running them, they shouldn't 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actually be touched. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) archive_path_ = 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(L"C:\\UnlikelyPath\\Temp\\chrome_123\\chrome.7z"); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(robertshield): Take this from the BrowserDistribution once that 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no longer depends on MasterPreferences. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installation_path_ = 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(L"C:\\Program Files\\Google\\Chrome\\"); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_path_ = base::FilePath( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"C:\\UnlikelyPath\\Temp\\chrome_123\\source\\Chrome-bin"); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setup_path_ = base::FilePath( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"C:\\UnlikelyPath\\Temp\\CR_123.tmp\\setup.exe"); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir_ = base::FilePath(L"C:\\UnlikelyPath\\Temp\\chrome_123"); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeAddBinariesToInstallationState( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_level, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallationState* installation_state) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (installation_state->GetProductState( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_level, BrowserDistribution::CHROME_BINARIES) == NULL) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProductState product_state; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_version(new Version(*current_version_)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_brand(L"TEST"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_multi_install(true); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_path = 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::GetChromeInstallPath(system_level, dist); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.SetUninstallProgram( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_path.AppendASCII(current_version_->GetString()) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kInstallerDir) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kSetupExe)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kUninstall); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kMultiInstall); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (system_level) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kSystemLevel); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state->SetProductState(system_level, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddChromeToInstallationState( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_level, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallationState* installation_state) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_install) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeAddBinariesToInstallationState(system_level, installation_state); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProductState product_state; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_version(new Version(*current_version_)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_multi_install(multi_install); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_brand(L"TEST"); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_eula_accepted(1); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_path = 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::GetChromeInstallPath(system_level, dist); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.SetUninstallProgram( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_path.AppendASCII(current_version_->GetString()) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kInstallerDir) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kSetupExe)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kUninstall); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (system_level) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kSystemLevel); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_install) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kMultiInstall); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kChrome); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state->SetProductState(system_level, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddChromeFrameToInstallationState( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_level, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallationState* installation_state) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_install) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeAddBinariesToInstallationState(system_level, installation_state); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProductState product_state; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_version(new Version(*current_version_)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.set_multi_install(multi_install); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_install ? BrowserDistribution::CHROME_BINARIES : 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_FRAME); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_path = 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer::GetChromeInstallPath(system_level, dist); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.SetUninstallProgram( 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_path.AppendASCII(current_version_->GetString()) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kInstallerDir) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(installer::kSetupExe)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kUninstall); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kChromeFrame); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (system_level) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kSystemLevel); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (multi_install) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state.AddUninstallSwitch(installer::switches::kMultiInstall); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state->SetProductState(system_level, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_FRAME, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product_state); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallationState* BuildChromeInstallationState(bool system_level, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallationState> installation_state( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockInstallationState()); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeToInstallationState(system_level, multi_install, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state.get()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return installation_state.release(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MockInstallerState* BuildBasicInstallerState( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_install, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::Operation operation) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state(new MockInstallerState()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::Level level = system_install ? 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::SYSTEM_LEVEL : InstallerState::USER_LEVEL; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->set_level(level); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->set_operation(operation); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hope this next one isn't checked for now. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->set_state_key(L"PROBABLY_INVALID_REG_PATH"); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->set_state_type(BrowserDistribution::CHROME_BROWSER); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->set_package_type(multi_install ? 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::MULTI_PACKAGE : 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::SINGLE_PACKAGE); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return installer_state.release(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AddChromeBinariesToInstallerState( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallerState* installer_state) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!installer_state->is_multi_install()) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (installer_state->FindProduct(BrowserDistribution::CHROME_BINARIES)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fresh install or upgrade? 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProductState* chrome_binaries = 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.GetProductState(installer_state->system_install(), 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome_binaries != NULL) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProductFromState(BrowserDistribution::CHROME_BINARIES, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *chrome_binaries); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Product> product(new Product(dist)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product->SetOption(installer::kOptionMultiInstall, true); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProduct(&product); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AddChromeToInstallerState( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallerState* installer_state) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fresh install or upgrade? 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProductState* chrome = 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.GetProductState(installer_state->system_install(), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome != NULL && 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome->is_multi_install() == installer_state->is_multi_install()) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProductFromState(BrowserDistribution::CHROME_BROWSER, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *chrome); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Product> product(new Product(dist)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (installer_state->is_multi_install()) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product->SetOption(installer::kOptionMultiInstall, true); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProduct(&product); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AddChromeFrameToInstallerState( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInstallerState* installer_state) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fresh install or upgrade? 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProductState* cf = 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state.GetProductState(installer_state->system_install(), 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_FRAME); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cf != NULL) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProductFromState(BrowserDistribution::CHROME_FRAME, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cf); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_FRAME); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Product> product(new Product(dist)); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (installer_state->is_multi_install()) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) product->SetOption(installer::kOptionMultiInstall, true); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state->AddProduct(&product); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MockInstallerState* BuildChromeInstallerState( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_install, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::Operation operation) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state( 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildBasicInstallerState(system_install, multi_install, machine_state, 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operation)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (multi_install) { 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We don't want to include Chrome Binaries for uninstall if the machine 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has other products. For simplicity, we check Chrome Frame only. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool machine_has_other_products = 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine_state.GetProductState(system_install, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution::CHROME_FRAME) != NULL; 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (operation != InstallerState::UNINSTALL || !machine_has_other_products) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChromeBinariesToInstallerState(machine_state, installer_state.get()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChromeToInstallerState(machine_state, installer_state.get()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return installer_state.release(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MockInstallerState* BuildChromeFrameInstallerState( 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_install, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstallationState& machine_state, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::Operation operation) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method only works for installation/upgrade. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(operation != InstallerState::UNINSTALL); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildBasicInstallerState(system_install, multi_install, machine_state, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operation)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_install) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChromeBinariesToInstallerState(machine_state, installer_state.get()); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeFrameToInstallerState(machine_state, installer_state.get()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return installer_state.release(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> current_version_; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> new_version_; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath archive_path_; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath installation_path_; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath setup_path_; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path_; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_dir_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallWorkerTest, TestInstallChromeSingleSystem) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool system_level = true; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool multi_install = false; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWorkItemList work_item_list; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const HKEY kRegRoot = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const wchar_t kRegKeyPath[] = L"Software\\Chromium\\test"; 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CreateRegKeyWorkItem> create_reg_key_work_item( 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateCreateRegKeyWorkItem( 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kRegRoot, kRegKeyPath, WorkItem::kWow64Default)); 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SetRegValueWorkItem> set_reg_value_work_item( 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateSetRegValueWorkItem( 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kRegRoot, kRegKeyPath, WorkItem::kWow64Default, L"", L"", false)); 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InstallationState> installation_state( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallationState(system_level, multi_install)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InstallerState> installer_state( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallerState(system_level, multi_install, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installation_state, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::SINGLE_INSTALL_OR_UPDATE)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up some expectations. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(robertshield): Set up some real expectations. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, AddCopyTreeWorkItem(_, _, _, _, _)) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtLeast(1)); 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(work_item_list, AddCreateRegKeyWorkItem(_, _)) 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillRepeatedly(Return(create_reg_key_work_item.get())); 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(work_item_list, AddSetRegStringValueWorkItem(_, _, _, _, _)) 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillRepeatedly(Return(set_reg_value_work_item.get())); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddInstallWorkItems(*installation_state.get(), 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installer_state.get(), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setup_path_, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) archive_path_, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_path_, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir_, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_version_.get(), 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *new_version_.get(), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &work_item_list); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t elevation_key[] = 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\" 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"{E0A900DF-9611-4446-86BD-4B1D47E7DB2A}"; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t old_elevation_key[] = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\" 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"{6C288DD7-76FB-4721-B628-56FAC252E199}"; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A test class for worker functions that manipulate the old IE low rights 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// policies. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters: 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool : system_level_ 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool : multi_install_ 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OldIELowRightsTests : public InstallWorkerTest, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ::testing::WithParamInterface<std::tr1::tuple<bool, bool> > { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallWorkerTest::SetUp(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ParamType& param = GetParam(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_level_ = std::tr1::get<0>(param); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_install_ = std::tr1::get<1>(param); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_key_ = system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state_.reset(new MockInstallationState()); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeFrameToInstallationState(system_level_, multi_install_, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state_.get()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state_.reset(BuildBasicInstallerState( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_level_, multi_install_, *installation_state_, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_install_ ? InstallerState::MULTI_UPDATE : 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::SINGLE_INSTALL_OR_UPDATE)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_install_) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChromeBinariesToInstallerState(*installation_state_, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state_.get()); 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeFrameToInstallerState(*installation_state_, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer_state_.get()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallationState> installation_state_; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state_; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_level_; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_install_; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY root_key_; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(OldIELowRightsTests, AddDeleteOldIELowRightsPolicyWorkItems) { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockWorkItemList> work_item_list; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegKeyWorkItem(root_key_, StrEq(old_elevation_key))) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteOldIELowRightsPolicyWorkItems(*installer_state_.get(), 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &work_item_list); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(Variations, OldIELowRightsTests, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Combine(Bool(), Bool())); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallWorkerTest, GoogleUpdateWorkItemsTest) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool system_level = true; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool multi_install = true; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWorkItemList work_item_list; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallationState> installation_state( 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallationState(system_level, false)); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProductState cf_state; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf_state.set_version(new Version(*current_version_)); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf_state.set_multi_install(false); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state->SetProductState(system_level, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_FRAME, cf_state); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state( 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallerState(system_level, multi_install, 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installation_state, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::MULTI_INSTALL)); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the multi Client State key to be created. 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* multi_dist = 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring multi_app_guid(multi_dist->GetAppGuid()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring multi_client_state_suffix(L"ClientState\\" + multi_app_guid); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCreateRegKeyWorkItem(_, HasSubstr(multi_client_state_suffix))) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(testing::AnyNumber()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect ClientStateMedium to be created for system-level installs. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCreateRegKeyWorkItem(_, HasSubstr(L"ClientStateMedium\\" + 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_app_guid))) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(system_level ? 1 : 0); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect to see a set value for the "TEST" brand code in the multi Client 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // State key. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSetRegStringValueWorkItem(_, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasSubstr(multi_client_state_suffix), 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegBrandField), 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(L"TEST"), 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _)).Times(1); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may also be some calls to set 'ap' values. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSetRegStringValueWorkItem(_, _, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegApField), 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, _)).Times(testing::AnyNumber()); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect "oeminstall" to be cleared. 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegValueWorkItem( 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasSubstr(multi_client_state_suffix), 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegOemInstallField))).Times(1); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect "eulaaccepted" to set. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSetRegDwordValueWorkItem( 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasSubstr(multi_client_state_suffix), 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegEULAAceptedField), 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Eq(static_cast<DWORD>(1)), 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _)).Times(1); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGoogleUpdateWorkItems(*installation_state.get(), 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installer_state.get(), 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &work_item_list); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that usagestats values are migrated properly. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallWorkerTest, AddUsageStatsWorkItems) { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool system_level = true; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool multi_install = true; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWorkItemList work_item_list; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallationState> installation_state( 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallationState(system_level, multi_install)); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProductState chrome_state; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_state.set_version(new Version(*current_version_)); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_state.set_multi_install(false); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_state.set_usagestats(1); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installation_state->SetProductState(system_level, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER, chrome_state); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state( 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildChromeInstallerState(system_level, multi_install, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installation_state, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallerState::MULTI_INSTALL)); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the multi Client State key to be created. 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* multi_dist = 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring multi_app_guid(multi_dist->GetAppGuid()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCreateRegKeyWorkItem(_, HasSubstr(multi_app_guid))).Times(1); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect to see a set value for the usagestats in the multi Client State key. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSetRegDwordValueWorkItem( 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasSubstr(multi_app_guid), 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegUsageStatsField), 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Eq(static_cast<DWORD>(1)), 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Eq(true))).Times(1); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect to see some values cleaned up from Chrome's keys. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* chrome_dist = 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::GetSpecificDistribution( 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution::CHROME_BROWSER); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (system_level) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegValueWorkItem( 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(chrome_dist->GetStateMediumKey()), 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegUsageStatsField))).Times(1); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegValueWorkItem( 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Eq(HKEY_CURRENT_USER), 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(chrome_dist->GetStateKey()), 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegUsageStatsField))).Times(1); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegValueWorkItem( 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Eq(installer_state->root_key()), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(chrome_dist->GetStateKey()), 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(google_update::kRegUsageStatsField))).Times(1); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddUsageStatsWorkItems(*installation_state.get(), 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *installer_state.get(), 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &work_item_list); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Quick Enable tests only make sense for the Google Chrome build as it 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interacts with registry values that are specific to Google Update. 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test scenarios under which the quick-enable-cf command should not exist after 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the run. We're permissive in that we allow the DeleteRegKeyWorkItem even if 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it isn't strictly needed. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuickEnableAbsentTest : public InstallWorkerTest { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallWorkerTest::SetUp(); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_key_ = system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete_reg_key_item_.reset(WorkItem::CreateDeleteRegKeyWorkItem( 688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) root_key_, kRegKeyPath, WorkItem::kWow64Default)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state_.reset(new MockInstallationState()); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(work_item_list_, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddDeleteRegKeyWorkItem(Eq(root_key_), StrCaseEq(kRegKeyPath))) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(delete_reg_key_item_.get())); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine_state_.reset(); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_reg_key_item_.reset(); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_key_ = NULL; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallWorkerTest::TearDown(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const bool system_level_ = false; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const wchar_t kRegKeyPath[]; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY root_key_; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeleteRegKeyWorkItem> delete_reg_key_item_; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallationState> machine_state_; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockWorkItemList> work_item_list_; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t QuickEnableAbsentTest::kRegKeyPath[] = 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"Software\\Google\\Update\\Clients\\" 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}\\Commands\\quick-enable-cf"; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuickEnableAbsentTest, CleanInstallSingleChrome) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install single Chrome on a clean system. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockInstallerState> installer_state( 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildBasicInstallerState(system_level_, true, *machine_state_, 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstallerState::MULTI_UPDATE)); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddQuickEnableChromeFrameWorkItems(*installer_state, &work_item_list_); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(InstallWorkerTest, WillProductBePresentAfterSetup) { 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution::Type prod_type_list[] = { 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution::CHROME_BROWSER, 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution::CHROME_FRAME, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Excluding BrowserDistribution::CHROME_BINARIES, since it is installed 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // along with other products. 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum { // Index into prod_type_list[]. 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TYPE_BROWSER = 0, 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TYPE_CF, 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NUM_TYPE // This must appear last. 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(arraysize(prod_type_list) == NUM_TYPE); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallerState::Operation op_list[] = { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallerState::UNINSTALL, 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallerState::SINGLE_INSTALL_OR_UPDATE 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool system_level = false; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool multi_install = true; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop over machine states: {No product, Chrome, CF, Chrome + CF}. 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i_mach = 0; i_mach < (1 << NUM_TYPE); ++i_mach) { 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // i_mach is the machine state before operation, as bit mask. 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<MockInstallationState> machine_state( 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new MockInstallationState()); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((i_mach & (1 << TYPE_BROWSER)) != 0) { // Add Chrome. 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeToInstallationState(system_level, multi_install, 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine_state.get()); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((i_mach & (1 << TYPE_CF)) != 0) { // Add Chrome Frame. 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddChromeFrameToInstallationState(system_level, multi_install, 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine_state.get()); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop over operations: {uninstall, install/update}. 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i_op = 0; i_op < arraysize(op_list); ++i_op) { 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop over product types to operate on: {TYPE_BROWSER, TYPE_CF}. 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i_type_op = 0; i_type_op < NUM_TYPE; ++i_type_op) { 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<InstallerState> installer_state; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i_type_op == TYPE_BROWSER) { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installer_state.reset(BuildChromeInstallerState( 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system_level, multi_install, *machine_state, op_list[i_op])); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (i_type_op == TYPE_CF) { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Skip the CF uninstall case due to limitations in 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BuildChromeFrameInstallerState(). 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_list[i_op] == InstallerState::UNINSTALL) 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installer_state.reset(BuildChromeFrameInstallerState( 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) system_level, multi_install, *machine_state, op_list[i_op])); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the machine state after operation, as bit mask. 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If uninstall, remove product with bitwise AND; else add with OR. 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int mach_after = (op_list[i_op] == InstallerState::UNINSTALL) ? 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i_mach & ~(1 << i_type_op) : i_mach | (1 << i_type_op); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify predicted presence of Chrome Binaries. 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool bin_res = installer::WillProductBePresentAfterSetup( 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *installer_state, 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *machine_state, 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution::CHROME_BINARIES); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Binaries are expected to be present iff any product is installed. 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool bin_expect = mach_after != 0; 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bin_expect, bin_res); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop over product types to check: {TYPE_BROWSER, TYPE_CF}. 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i_type_check = 0; i_type_check < NUM_TYPE; ++i_type_check) { 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify predicted presence of product. 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool prod_res = installer::WillProductBePresentAfterSetup( 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *installer_state, 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *machine_state, 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prod_type_list[i_type_check]); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool prod_expect = (mach_after & (1 << i_type_check)) != 0; 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(prod_expect, prod_res); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(GOOGLE_CHROME_BUILD) 808