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 <map>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/channel_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/helper.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installation_state.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installation_validator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::ChannelInfo;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::InstallationValidator;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::InstallationState;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::AppCommand;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::ProductState;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Values;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Channel {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STABLE_CHANNEL,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BETA_CHANNEL,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEV_CHANNEL
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PackageType {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SINGLE_INSTALL,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MULTI_INSTALL
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Level {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USER_LEVEL,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYSTEM_LEVEL
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Vehicle {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOOGLE_UPDATE,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MSI
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ChannelModifier {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CM_MULTI        = 0x01,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CM_CHROME       = 0x02,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CM_CHROME_FRAME = 0x04,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CM_READY_MODE   = 0x08,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CM_FULL         = 0x10
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kChromeChannels[] = {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"1.1-beta",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"2.0-dev"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kChromeFrameChannels[] = {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"beta",
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  L"dev"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeProductState : public ProductState {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetChannel(const wchar_t* base, int channel_modifiers);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetVersion(const char* version);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUninstallCommand(BrowserDistribution::Type dist_type,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Level install_level,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const char* version,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int channel_modifiers,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Vehicle vehicle);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddInstallExtensionCommand(BrowserDistribution::Type dist_type,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Level install_level,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const char* version,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  int channel_modifiers);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddOsUpgradeCommand(BrowserDistribution::Type dist_type,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           Level install_level,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const char* version,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           int channel_modifiers);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddQueryEULAAcceptanceCommand(BrowserDistribution::Type dist_type,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     Level install_level,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const char* version,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int channel_modifiers);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddQuickEnableApplicationHostCommand(BrowserDistribution::Type dist_type,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Level install_level,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const char* version,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int channel_modifiers);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddQuickEnableCfCommand(BrowserDistribution::Type dist_type,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               Level install_level,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const char* version,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int channel_modifiers);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_multi_install(bool is_multi_install) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    multi_install_ = is_multi_install;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::AppCommands& commands() { return commands_; }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ChannelMethodForModifier {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChannelModifier modifier;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool (ChannelInfo::*method)(bool value);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static base::FilePath GetSetupPath(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserDistribution::Type dist_type,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Level install_level,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int channel_modifiers);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static base::FilePath GetSetupExePath(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::Type dist_type,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Level install_level,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* version,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int channel_modifiers);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ChannelMethodForModifier kChannelMethods[];
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeInstallationState : public InstallationState {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetProductState(BrowserDistribution::Type type,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Level install_level,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const ProductState& product) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProducts(install_level)[IndexFromDistType(type)].CopyFrom(product);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProductState* GetProducts(Level install_level) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return install_level == USER_LEVEL ? user_products_ : system_products_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FakeProductState::ChannelMethodForModifier
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FakeProductState::kChannelMethods[] = {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CM_MULTI,        &ChannelInfo::SetMultiInstall },
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CM_CHROME,       &ChannelInfo::SetChrome },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CM_CHROME_FRAME, &ChannelInfo::SetChromeFrame },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CM_READY_MODE,   &ChannelInfo::SetReadyMode },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CM_FULL,         &ChannelInfo::SetFullSuffix }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath FakeProductState::GetSetupPath(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution::Type dist_type,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Level install_level,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int channel_modifiers) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool is_multi_install = (channel_modifiers & CM_MULTI) != 0;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return installer::GetChromeInstallPath(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_level == SYSTEM_LEVEL,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(is_multi_install ?
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              BrowserDistribution::CHROME_BINARIES : dist_type));
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath FakeProductState::GetSetupExePath(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution::Type dist_type,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Level install_level,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* version,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int channel_modifiers) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath setup_path = GetSetupPath(dist_type, install_level,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           channel_modifiers);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return setup_path
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII(version)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Append(installer::kInstallerDir)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Append(installer::kSetupExe);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the channel_ member of this instance according to a base channel value
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a set of modifiers.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProductState::SetChannel(const wchar_t* base, int channel_modifiers) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_.set_value(base);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kChannelMethods); ++i) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((channel_modifiers & kChannelMethods[i].modifier) != 0)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (channel_.*kChannelMethods[i].method)(true);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProductState::SetVersion(const char* version) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  version_.reset(version == NULL ? NULL : new Version(version));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the uninstall command for this object.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProductState::SetUninstallCommand(BrowserDistribution::Type dist_type,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Level install_level,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const char* version,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int channel_modifiers,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Vehicle vehicle) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(version);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool is_multi_install = (channel_modifiers & CM_MULTI) != 0;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uninstall_command_ = CommandLine(GetSetupExePath(dist_type, install_level,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   version, channel_modifiers));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uninstall_command_.AppendSwitch(installer::switches::kUninstall);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_level == SYSTEM_LEVEL)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uninstall_command_.AppendSwitch(installer::switches::kSystemLevel);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_multi_install) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uninstall_command_.AppendSwitch(installer::switches::kMultiInstall);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dist_type == BrowserDistribution::CHROME_BROWSER) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uninstall_command_.AppendSwitch(installer::switches::kChrome);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((channel_modifiers & CM_READY_MODE) != 0) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uninstall_command_.AppendSwitch(installer::switches::kChromeFrame);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uninstall_command_.AppendSwitch(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            installer::switches::kChromeFrameReadyMode);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (dist_type == BrowserDistribution::CHROME_FRAME) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uninstall_command_.AppendSwitch(installer::switches::kChromeFrame);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((channel_modifiers & CM_READY_MODE) != 0) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uninstall_command_.AppendSwitch(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            installer::switches::kChromeFrameReadyMode);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (dist_type == BrowserDistribution::CHROME_FRAME) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uninstall_command_.AppendSwitch(installer::switches::kChromeFrame);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (vehicle == MSI)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uninstall_command_.AppendSwitch(installer::switches::kMsi);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the "install-extension" Google Update product command.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeProductState::AddInstallExtensionCommand(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution::Type dist_type,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Level install_level,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* version,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int channel_modifiers) {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Right now only Chrome browser uses this.
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(dist_type, BrowserDistribution::CHROME_BROWSER);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine cmd_line(GetSetupPath(dist_type, install_level,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    channel_modifiers).
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           Append(installer::kChromeExe));
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitchASCII(::switches::kLimitedInstallFromWebstore, "%1");
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppCommand app_cmd(cmd_line.GetCommandLineString());
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_sends_pings(true);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_web_accessible(true);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_run_as_user(true);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  commands_.Set(installer::kCmdInstallExtension, app_cmd);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the "on-os-upgrade" Google Update product command.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeProductState::AddOsUpgradeCommand(BrowserDistribution::Type dist_type,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           Level install_level,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const char* version,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int channel_modifiers) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Right now only Chrome browser uses this.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(dist_type, BrowserDistribution::CHROME_BROWSER);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine cmd_line(GetSetupExePath(dist_type, install_level, version,
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       channel_modifiers));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kOnOsUpgrade);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Imitating ChromeBrowserOperations::AppendProductFlags().
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((channel_modifiers & CM_MULTI) != 0) {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmd_line.AppendSwitch(installer::switches::kMultiInstall);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmd_line.AppendSwitch(installer::switches::kChrome);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (install_level == SYSTEM_LEVEL)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmd_line.AppendSwitch(installer::switches::kSystemLevel);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kVerboseLogging);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppCommand app_cmd(cmd_line.GetCommandLineString());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_auto_run_on_os_upgrade(true);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  commands_.Set(installer::kCmdOnOsUpgrade, app_cmd);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the "query-eula-acceptance" Google Update product command.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeProductState::AddQueryEULAAcceptanceCommand(
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution::Type dist_type,
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Level install_level,
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* version,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int channel_modifiers) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(dist_type, BrowserDistribution::CHROME_BINARIES);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine cmd_line(GetSetupExePath(dist_type, install_level, version,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       channel_modifiers));
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kQueryEULAAcceptance);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (install_level == SYSTEM_LEVEL)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmd_line.AppendSwitch(installer::switches::kSystemLevel);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kVerboseLogging);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppCommand app_cmd(cmd_line.GetCommandLineString());
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_web_accessible(true);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_run_as_user(true);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  commands_.Set(installer::kCmdQueryEULAAcceptance, app_cmd);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds the "quick-enable-application-host" Google Update product command.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProductState::AddQuickEnableApplicationHostCommand(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution::Type dist_type,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Level install_level,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* version,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int channel_modifiers) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(dist_type, BrowserDistribution::CHROME_BINARIES);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(channel_modifiers & CM_MULTI, 0);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine cmd_line(GetSetupExePath(dist_type, install_level, version,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       channel_modifiers));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kMultiInstall);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kChromeAppLauncher);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kEnsureGoogleUpdatePresent);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCommand app_cmd(cmd_line.GetCommandLineString());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_cmd.set_sends_pings(true);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_cmd.set_is_web_accessible(true);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_cmd.set_is_run_as_user(true);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands_.Set(installer::kCmdQuickEnableApplicationHost, app_cmd);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds the "quick-enable-cf" Google Update product command.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProductState::AddQuickEnableCfCommand(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution::Type dist_type,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Level install_level,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* version,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int channel_modifiers) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(dist_type, BrowserDistribution::CHROME_BINARIES);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(channel_modifiers & CM_MULTI, 0);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine cmd_line(GetSetupExePath(dist_type, install_level, version,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       channel_modifiers));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kMultiInstall);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (install_level == SYSTEM_LEVEL)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd_line.AppendSwitch(installer::switches::kSystemLevel);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendSwitch(installer::switches::kChromeFrameQuickEnable);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCommand app_cmd(cmd_line.GetCommandLineString());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_cmd.set_sends_pings(true);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_cmd.set_is_web_accessible(true);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands_.Set(installer::kCmdQuickEnableCf, app_cmd);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fixture for testing the InstallationValidator.  Errors logged by the
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// validator are sent to an optional mock recipient (see
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_validation_error_recipient) upon which expectations can be placed.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstallationValidatorTest
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public testing::TestWithParam<InstallationValidator::InstallationType> {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These shouldn't need to be public, but there seems to be some interaction
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with parameterized tests that requires it.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetUpTestCase();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TearDownTestCase();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the multi channel modifiers for a given installation type.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetChannelModifiers(InstallationValidator::InstallationType type);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<InstallationValidator::InstallationType, int>
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallationTypeToModifiers;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ValidationErrorRecipient {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~ValidationErrorRecipient() { }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ReceiveValidationError(const char* file,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int line,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const char* message) = 0;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MockValidationErrorRecipient : public ValidationErrorRecipient {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MOCK_METHOD3(ReceiveValidationError, void(const char* file,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int line,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const char* message));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HandleLogMessage(int severity,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const char* file,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int line,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               size_t message_start,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& str);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void set_validation_error_recipient(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ValidationErrorRecipient* recipient);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void MakeProductState(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::Type prod_type,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallationValidator::InstallationType inst_type,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Level install_level,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Channel channel,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Vehicle vehicle,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FakeProductState* state);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void MakeMachineState(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallationValidator::InstallationType inst_type,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Level install_level,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Channel channel,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Vehicle vehicle,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FakeInstallationState* state);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static logging::LogMessageHandlerFunction old_log_message_handler_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ValidationErrorRecipient* validation_error_recipient_;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static InstallationTypeToModifiers* type_to_modifiers_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)logging::LogMessageHandlerFunction
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidatorTest::old_log_message_handler_ = NULL;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstallationValidatorTest::ValidationErrorRecipient*
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidatorTest::validation_error_recipient_ = NULL;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstallationValidatorTest::InstallationTypeToModifiers*
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidatorTest::type_to_modifiers_ = NULL;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int InstallationValidatorTest::GetChannelModifiers(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidator::InstallationType type) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type_to_modifiers_);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type_to_modifiers_->find(type) != type_to_modifiers_->end());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (*type_to_modifiers_)[type];
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::SetUpTestCase() {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type_to_modifiers_ == NULL);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_log_message_handler_ = logging::GetLogMessageHandler();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logging::SetLogMessageHandler(&HandleLogMessage);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  type_to_modifiers_ = new InstallationTypeToModifiers();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallationTypeToModifiers& ttm = *type_to_modifiers_;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::NO_PRODUCTS] = 0;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_SINGLE] = 0;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_MULTI] = CM_MULTI | CM_CHROME;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_SINGLE] = 0;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_SINGLE_CHROME_SINGLE] = 0;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_SINGLE_CHROME_MULTI] =
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CM_MULTI | CM_CHROME;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_MULTI] = CM_MULTI | CM_CHROME_FRAME;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_MULTI_CHROME_MULTI] =
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CM_MULTI | CM_CHROME_FRAME | CM_CHROME;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ttm[InstallationValidator::CHROME_FRAME_READY_MODE_CHROME_MULTI] =
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CM_MULTI | CM_CHROME_FRAME | CM_CHROME | CM_READY_MODE;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::TearDownTestCase() {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logging::SetLogMessageHandler(old_log_message_handler_);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_log_message_handler_ = NULL;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete type_to_modifiers_;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  type_to_modifiers_ = NULL;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InstallationValidatorTest::HandleLogMessage(int severity,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const char* file,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int line,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 size_t message_start,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const std::string& str) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All validation failures result in LOG(ERROR)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (severity == logging::LOG_ERROR && !str.empty()) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remove the trailing newline, if present.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t message_length = str.size() - message_start;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*str.rbegin() == '\n')
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      --message_length;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validation_error_recipient_ != NULL) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      validation_error_recipient_->ReceiveValidationError(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file, line, str.substr(message_start, message_length).c_str());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fail the test if an error wasn't handled.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE_AT(file, line)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << base::StringPiece(str.c_str() + message_start, message_length);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (old_log_message_handler_ != NULL)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (old_log_message_handler_)(severity, file, line, message_start, str);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::set_validation_error_recipient(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidationErrorRecipient* recipient) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  validation_error_recipient_ = recipient;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Populates |state| with the state of a valid installation of product
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |prod_type|.  |inst_type| dictates properties of the installation
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (multi-install, ready-mode, etc).
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::MakeProductState(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution::Type prod_type,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidator::InstallationType inst_type,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Level install_level,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Channel channel,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vehicle vehicle,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FakeProductState* state) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(state);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool is_multi_install =
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prod_type == BrowserDistribution::CHROME_BINARIES ||
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (prod_type == BrowserDistribution::CHROME_BROWSER &&
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (inst_type & InstallationValidator::ProductBits::CHROME_MULTI) != 0) ||
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (prod_type == BrowserDistribution::CHROME_FRAME &&
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (inst_type &
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (InstallationValidator::ProductBits::CHROME_FRAME_MULTI |
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            InstallationValidator::ProductBits::CHROME_FRAME_READY_MODE)) != 0);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const* channels = &kChromeChannels[0];
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prod_type == BrowserDistribution::CHROME_FRAME && !is_multi_install)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channels = &kChromeFrameChannels[0];  // SxS GCF has its own channel names.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int channel_modifiers =
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_multi_install ? GetChannelModifiers(inst_type) : 0;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->Clear();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->SetChannel(channels[channel], channel_modifiers);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->SetVersion(chrome::kChromeVersion);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->SetUninstallCommand(prod_type, install_level, chrome::kChromeVersion,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             channel_modifiers, vehicle);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->set_multi_install(is_multi_install);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (prod_type == BrowserDistribution::CHROME_BINARIES) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (inst_type == InstallationValidator::CHROME_MULTI ||
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         inst_type ==
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             InstallationValidator::CHROME_FRAME_READY_MODE_CHROME_MULTI) {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state->AddQuickEnableCfCommand(prod_type, install_level,
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     chrome::kChromeVersion, channel_modifiers);
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state->AddQueryEULAAcceptanceCommand(prod_type,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         install_level,
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         chrome::kChromeVersion,
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         channel_modifiers);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prod_type == BrowserDistribution::CHROME_BINARIES) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state->AddQuickEnableApplicationHostCommand(prod_type,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                install_level,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                chrome::kChromeVersion,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                channel_modifiers);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prod_type == BrowserDistribution::CHROME_BROWSER) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state->AddOsUpgradeCommand(prod_type,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               install_level,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               chrome::kChromeVersion,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               channel_modifiers);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state->AddInstallExtensionCommand(prod_type,
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      install_level,
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::kChromeVersion,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      channel_modifiers);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Populates |state| with the state of a valid installation of |inst_type|.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::MakeMachineState(
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidator::InstallationType inst_type,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Level install_level,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Channel channel,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vehicle vehicle,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FakeInstallationState* state) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(state);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kChromeMask =
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (InstallationValidator::ProductBits::CHROME_SINGLE |
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       InstallationValidator::ProductBits::CHROME_MULTI);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kChromeFrameMask =
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (InstallationValidator::ProductBits::CHROME_FRAME_SINGLE |
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       InstallationValidator::ProductBits::CHROME_FRAME_MULTI |
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       InstallationValidator::ProductBits::CHROME_FRAME_READY_MODE);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kBinariesMask =
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (InstallationValidator::ProductBits::CHROME_MULTI |
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       InstallationValidator::ProductBits::CHROME_FRAME_MULTI |
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       InstallationValidator::ProductBits::CHROME_FRAME_READY_MODE);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeProductState prod_state;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((inst_type & kChromeMask) != 0) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeProductState(BrowserDistribution::CHROME_BROWSER, inst_type,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     install_level, channel, vehicle, &prod_state);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state->SetProductState(BrowserDistribution::CHROME_BROWSER, install_level,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           prod_state);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((inst_type & kChromeFrameMask) != 0) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeProductState(BrowserDistribution::CHROME_FRAME, inst_type,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     install_level, channel, vehicle, &prod_state);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state->SetProductState(BrowserDistribution::CHROME_FRAME, install_level,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           prod_state);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((inst_type & kBinariesMask) != 0) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeProductState(BrowserDistribution::CHROME_BINARIES, inst_type,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     install_level, channel, vehicle, &prod_state);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state->SetProductState(BrowserDistribution::CHROME_BINARIES, install_level,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           prod_state);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstallationValidatorTest::TearDown() {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  validation_error_recipient_ = NULL;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Builds a proper machine state for a given InstallationType, then validates
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(InstallationValidatorTest, TestValidInstallation) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InstallationValidator::InstallationType inst_type = GetParam();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeInstallationState machine_state;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallationValidator::InstallationType type;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockValidationErrorRecipient> recipient;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_validation_error_recipient(&recipient);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeMachineState(inst_type, SYSTEM_LEVEL, STABLE_CHANNEL, GOOGLE_UPDATE,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &machine_state);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallationValidator::ValidateInstallationTypeForState(
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  machine_state, true, &type));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(inst_type, type);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run the test for all installation types.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AllValidInstallations,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallationValidatorTest,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Values(InstallationValidator::NO_PRODUCTS,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_SINGLE,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_MULTI,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_SINGLE,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_SINGLE_CHROME_SINGLE,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_SINGLE_CHROME_MULTI,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_MULTI,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_MULTI_CHROME_MULTI,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           InstallationValidator::CHROME_FRAME_READY_MODE_CHROME_MULTI));
627