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