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