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 <objbase.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_shortcut_win.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/shortcut.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/setup/install.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/setup/install_worker.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/setup/setup_constants.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/browser_distribution.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/installer_state.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/product.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/shell_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CreateVisualElementsManifestTest : public testing::Test {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a temp directory for testing.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    version_ = Version("0.0.0.0");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    version_dir_ = test_dir_.path().AppendASCII(version_.GetString());
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(version_dir_));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest_path_ =
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_dir_.path().Append(installer::kVisualElementsManifest);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clean up test directory manually so we can fail if it leaks.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_dir_.Delete());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The temporary directory used to contain the test operations.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir test_dir_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A dummy version number used to create the version directory.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The path to |test_dir_|\|version_|.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath version_dir_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The path to VisualElementsManifest.xml.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath manifest_path_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstallShortcutTest : public testing::Test {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, CoInitialize(NULL));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dist_ = BrowserDistribution::GetDistribution();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dist_ != NULL);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    product_.reset(new installer::Product(dist_));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_exe_ = temp_dir_.path().Append(installer::kChromeExe);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(0, base::WriteFile(chrome_exe_, "", 0));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellUtil::ShortcutProperties chrome_properties(ShellUtil::CURRENT_USER);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    product_->AddDefaultShortcutProperties(chrome_exe_, &chrome_properties);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_properties_.set_target(chrome_exe_);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_properties_.set_icon(chrome_properties.icon,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  chrome_properties.icon_index);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_properties_.set_app_id(chrome_properties.app_id);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_properties_.set_description(chrome_properties.description);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_properties_.set_dual_mode(false);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_start_menu_properties_ = expected_properties_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_start_menu_properties_.set_dual_mode(true);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_.reset(GetFakeMasterPrefs(false, false, false));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fake_user_desktop_.CreateUniqueTempDir());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fake_common_desktop_.CreateUniqueTempDir());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fake_user_quick_launch_.CreateUniqueTempDir());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fake_start_menu_.CreateUniqueTempDir());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fake_common_start_menu_.CreateUniqueTempDir());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_desktop_override_.reset(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::ScopedPathOverride(base::DIR_USER_DESKTOP,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fake_user_desktop_.path()));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    common_desktop_override_.reset(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::ScopedPathOverride(base::DIR_COMMON_DESKTOP,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fake_common_desktop_.path()));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_quick_launch_override_.reset(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::ScopedPathOverride(base::DIR_USER_QUICK_LAUNCH,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fake_user_quick_launch_.path()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_menu_override_.reset(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::ScopedPathOverride(base::DIR_START_MENU,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fake_start_menu_.path()));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    common_start_menu_override_.reset(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::ScopedPathOverride(base::DIR_COMMON_START_MENU,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fake_common_start_menu_.path()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 shortcut_name(
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME) +
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        installer::kLnkExt);
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 alternate_shortcut_name(
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME_ALTERNATE) +
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        installer::kLnkExt);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_desktop_shortcut_ =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_user_desktop_.path().Append(shortcut_name);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_quick_launch_shortcut_ =
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_user_quick_launch_.path().Append(shortcut_name);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_start_menu_shortcut_ =
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        fake_start_menu_.path().Append(
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            dist_->GetStartMenuShortcutSubfolder(
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                BrowserDistribution::SUBFOLDER_CHROME))
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Append(shortcut_name);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_desktop_shortcut_ =
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_common_desktop_.path().Append(shortcut_name);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_start_menu_shortcut_ =
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        fake_common_start_menu_.path().Append(
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            dist_->GetStartMenuShortcutSubfolder(
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                BrowserDistribution::SUBFOLDER_CHROME))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Append(shortcut_name);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_alternate_desktop_shortcut_ =
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_user_desktop_.path().Append(alternate_shortcut_name);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try to unpin potentially pinned shortcuts (although pinning isn't tested,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the call itself might still have pinned the Start Menu shortcuts).
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::TaskbarUnpinShortcutLink(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        user_start_menu_shortcut_.value().c_str());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::TaskbarUnpinShortcutLink(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        system_start_menu_shortcut_.value().c_str());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CoUninitialize();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::MasterPreferences* GetFakeMasterPrefs(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool do_not_create_desktop_shortcut,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool do_not_create_quick_launch_shortcut,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool alternate_desktop_shortcut) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const struct {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* pref_name;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_desired;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } desired_prefs[] = {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { installer::master_preferences::kDoNotCreateDesktopShortcut,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        do_not_create_desktop_shortcut },
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { installer::master_preferences::kDoNotCreateQuickLaunchShortcut,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        do_not_create_quick_launch_shortcut },
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { installer::master_preferences::kAltShortcutText,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        alternate_desktop_shortcut },
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string master_prefs("{\"distribution\":{");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(desired_prefs); ++i) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      master_prefs += (i == 0 ? "\"" : ",\"");
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      master_prefs += desired_prefs[i].pref_name;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      master_prefs += "\":";
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      master_prefs += desired_prefs[i].is_desired ? "true" : "false";
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    master_prefs += "}}";
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new installer::MasterPreferences(master_prefs);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties expected_properties_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties expected_start_menu_properties_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* dist_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath chrome_exe_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<installer::Product> product_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<installer::MasterPreferences> prefs_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir fake_user_desktop_;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir fake_common_desktop_;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir fake_user_quick_launch_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir fake_start_menu_;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir fake_common_start_menu_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ScopedPathOverride> user_desktop_override_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ScopedPathOverride> common_desktop_override_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ScopedPathOverride> user_quick_launch_override_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ScopedPathOverride> start_menu_override_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ScopedPathOverride> common_start_menu_override_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_desktop_shortcut_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_quick_launch_shortcut_;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_start_menu_shortcut_;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath system_desktop_shortcut_;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath system_start_menu_shortcut_;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_alternate_desktop_shortcut_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that VisualElementsManifest.xml is not created when VisualElements are
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not present.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateVisualElementsManifestTest, VisualElementsManifestNotCreated) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::CreateVisualElementsManifest(test_dir_.path(), version_));
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(manifest_path_));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that VisualElementsManifest.xml is created with the correct content when
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VisualElements are present.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateVisualElementsManifestTest, VisualElementsManifestCreated) {
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version_dir_.Append(installer::kVisualElements)));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::CreateVisualElementsManifest(test_dir_.path(), version_));
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(manifest_path_));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string read_manifest;
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(manifest_path_, &read_manifest));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kExpectedManifest[] =
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<Application>\r\n"
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <VisualElements\r\n"
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      DisplayName='Google Chrome'\r\n"
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      Logo='0.0.0.0\\VisualElements\\Logo.png'\r\n"
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      SmallLogo='0.0.0.0\\VisualElements\\SmallLogo.png'\r\n"
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      ForegroundText='light'\r\n"
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "      BackgroundColor='#323232'>\r\n"
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <DefaultTile ShowName='allLogos'/>\r\n"
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <SplashScreen Image='0.0.0.0\\VisualElements\\splash-620x300.png'/>"
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\r\n"
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </VisualElements>\r\n"
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</Application>";
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_STREQ(kExpectedManifest, read_manifest.c_str());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateAllShortcuts) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_ALL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateAllShortcutsSystemLevel) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::ALL_USERS,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_ALL);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(system_desktop_shortcut_, expected_properties_);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(system_start_menu_shortcut_,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // The quick launch shortcut is always created per-user for the admin running
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // the install (other users will get it via Active Setup).
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              expected_properties_);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateAllShortcutsAlternateDesktopName) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<installer::MasterPreferences> prefs_alt_desktop(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetFakeMasterPrefs(false, false, true));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_alt_desktop, installer::CURRENT_USER,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_ALL);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_alternate_desktop_shortcut_,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateAllShortcutsButDesktopShortcut) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<installer::MasterPreferences> prefs_no_desktop(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetFakeMasterPrefs(true, false, false));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_no_desktop, installer::CURRENT_USER,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_ALL);
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_desktop_shortcut_));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateAllShortcutsButQuickLaunchShortcut) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<installer::MasterPreferences> prefs_no_ql(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetFakeMasterPrefs(false, true, false));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_no_ql, installer::CURRENT_USER,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_ALL);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_);
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_quick_launch_shortcut_));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, ReplaceAll) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties dummy_properties;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dummy_target;
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_target(dummy_target);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_working_dir(fake_user_desktop_.path());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_arguments(L"--dummy --args");
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_app_id(L"El.Dummiest");
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  user_desktop_shortcut_, dummy_properties,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  user_quick_launch_shortcut_, dummy_properties,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(user_start_menu_shortcut_.DirName()));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  user_start_menu_shortcut_, dummy_properties,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_REPLACE_EXISTING);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, ReplaceExisting) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties dummy_properties;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dummy_target;
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_target(dummy_target);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_working_dir(fake_user_desktop_.path());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_arguments(L"--dummy --args");
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_app_id(L"El.Dummiest");
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  user_desktop_shortcut_, dummy_properties,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(user_start_menu_shortcut_.DirName()));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_REPLACE_EXISTING);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_);
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_quick_launch_shortcut_));
3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_start_menu_shortcut_));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateIfNoSystemLevelAllSystemShortcutsExist) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties dummy_properties;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dummy_target;
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_target(dummy_target);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  system_desktop_shortcut_, dummy_properties,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        system_start_menu_shortcut_.DirName()));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  system_start_menu_shortcut_, dummy_properties,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL);
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_desktop_shortcut_));
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_start_menu_shortcut_));
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // There is no system-level quick launch shortcut, so creating the user-level
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // one should always succeed.
3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(base::PathExists(user_quick_launch_shortcut_));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateIfNoSystemLevelNoSystemShortcutsExist) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallShortcutTest, CreateIfNoSystemLevelSomeSystemShortcutsExist) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ShortcutProperties dummy_properties;
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dummy_target;
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dummy_properties.set_target(dummy_target);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  system_desktop_shortcut_, dummy_properties,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::win::SHORTCUT_CREATE_ALWAYS));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::CreateOrUpdateShortcuts(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_exe_, *product_, *prefs_, installer::CURRENT_USER,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installer::INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL);
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(user_desktop_shortcut_));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_quick_launch_shortcut_,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_properties_);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ValidateShortcut(user_start_menu_shortcut_,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              expected_start_menu_properties_);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(EscapeXmlAttributeValueTest, EscapeCrazyValue) {
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 val(L"This has 'crazy' \"chars\" && < and > signs.");
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kExpectedEscapedVal[] =
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"This has &apos;crazy&apos; \"chars\" &amp;&amp; &lt; and > signs.";
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::EscapeXmlAttributeValueInSingleQuotes(&val);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_STREQ(kExpectedEscapedVal, val.c_str());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(EscapeXmlAttributeValueTest, DontEscapeNormalValue) {
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 val(L"Google Chrome");
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kExpectedEscapedVal[] = L"Google Chrome";
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer::EscapeXmlAttributeValueInSingleQuotes(&val);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_STREQ(kExpectedEscapedVal, val.c_str());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
432