Index: chrome/installer/setup/install_unittest.cc |
diff --git a/chrome/installer/setup/install_unittest.cc b/chrome/installer/setup/install_unittest.cc |
index 8d4606f8c32d9015fa745e3adf3b24b7464e8bcc..e0cfd0b474f7087298ca648a8f57566215e44151 100644 |
--- a/chrome/installer/setup/install_unittest.cc |
+++ b/chrome/installer/setup/install_unittest.cc |
@@ -2,16 +2,28 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <objbase.h> |
+ |
#include <string> |
+#include "base/file_path.h" |
#include "base/file_util.h" |
+#include "base/path_service.h" |
#include "base/platform_file.h" |
#include "base/scoped_temp_dir.h" |
#include "base/string16.h" |
#include "base/utf_string_conversions.h" |
#include "base/version.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/test/test_shortcut_win.h" |
+#include "base/win/shortcut.h" |
#include "chrome/installer/setup/install.h" |
+#include "chrome/installer/setup/install_worker.h" |
#include "chrome/installer/setup/setup_constants.h" |
+#include "chrome/installer/util/browser_distribution.h" |
+#include "chrome/installer/util/installer_state.h" |
+#include "chrome/installer/util/product.h" |
+#include "chrome/installer/util/util_constants.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace { |
@@ -49,6 +61,142 @@ class CreateVisualElementsManifestTest : public testing::Test { |
FilePath manifest_path_; |
}; |
+class InstallShortcutTest : public testing::Test { |
+ protected: |
+ // A mock installer state on which .system_install() will return |
+ // |system_install|, .target_path() will return |target_path|, and .is_msi() |
+ // will return |is_msi|. |
+ class MockInstallerState : public installer::InstallerState { |
+ public: |
+ MockInstallerState(const FilePath& target_path, |
+ bool system_install, |
+ bool is_msi) : InstallerState() { |
+ target_path_ = target_path; |
+ set_level(system_install ? SYSTEM_LEVEL : USER_LEVEL); |
+ msi_ = is_msi; |
+ } |
+ }; |
+ |
+ virtual void SetUp() OVERRIDE { |
+ EXPECT_EQ(S_OK, CoInitialize(NULL)); |
+ |
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
+ ASSERT_TRUE(dist != NULL); |
+ product_.reset(new installer::Product(dist)); |
+ |
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
+ chrome_exe_ = temp_dir_.path().Append(installer::kChromeExe); |
+ setup_exe_ = temp_dir_.path().Append(installer::kSetupExe); |
+ EXPECT_EQ(0, file_util::WriteFile(chrome_exe_, "", 0)); |
+ EXPECT_EQ(0, file_util::WriteFile(setup_exe_, "", 0)); |
+ |
+ mock_user_installer_state_.reset( |
+ new MockInstallerState(chrome_exe_.DirName(), false, false)); |
+ mock_system_installer_state_.reset( |
+ new MockInstallerState(chrome_exe_.DirName(), true, false)); |
+ |
+ expected_properties_.set_target(chrome_exe_); |
+ expected_properties_.set_dual_mode(true); |
+ |
+ ASSERT_TRUE(fake_user_desktop_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(fake_common_desktop_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(fake_user_quick_launch_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(fake_default_user_quick_launch_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(fake_start_menu_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(fake_common_start_menu_.CreateUniqueTempDir()); |
+ ASSERT_TRUE(PathService::Override(base::DIR_USER_DESKTOP, |
+ fake_user_desktop_.path())); |
+ ASSERT_TRUE(PathService::Override(base::DIR_COMMON_DESKTOP, |
+ fake_common_desktop_.path())); |
+ ASSERT_TRUE(PathService::Override(base::DIR_USER_QUICK_LAUNCH, |
+ fake_user_quick_launch_.path())); |
+ ASSERT_TRUE(PathService::Override(base::DIR_DEFAULT_USER_QUICK_LAUNCH, |
+ fake_default_user_quick_launch_.path())); |
+ ASSERT_TRUE(PathService::Override(base::DIR_START_MENU, |
+ fake_start_menu_.path())); |
+ ASSERT_TRUE(PathService::Override(base::DIR_COMMON_START_MENU, |
+ fake_common_start_menu_.path())); |
+ |
+ string16 shortcut_name(dist->GetAppShortCutName() + installer::kLnkExt); |
+ string16 uninstall_shorcut_name( |
+ dist->GetUninstallLinkName() + installer::kLnkExt); |
+ string16 alternate_shortcut_name( |
+ dist->GetAlternateApplicationName() + installer::kLnkExt); |
+ |
+ user_desktop_shortcut_ = |
+ fake_user_desktop_.path().Append(shortcut_name); |
+ user_quick_launch_shortcut_ = |
+ fake_user_quick_launch_.path().Append(shortcut_name); |
+ user_start_menu_shortcut_ = |
+ fake_start_menu_.path().Append(dist->GetAppShortCutName()) |
+ .Append(shortcut_name); |
+ user_uninstall_shortcut_ = |
+ fake_start_menu_.path().Append(dist->GetAppShortCutName()) |
+ .Append(uninstall_shorcut_name); |
+ system_desktop_shortcut_ = |
+ fake_common_desktop_.path().Append(shortcut_name); |
+ system_quick_launch_shortcut_ = |
+ fake_default_user_quick_launch_.path().Append(shortcut_name); |
+ system_start_menu_shortcut_ = |
+ fake_common_start_menu_.path().Append(dist->GetAppShortCutName()) |
+ .Append(shortcut_name); |
+ system_uninstall_shortcut_ = |
+ fake_common_start_menu_.path().Append(dist->GetAppShortCutName()) |
+ .Append(uninstall_shorcut_name); |
+ user_alternate_desktop_shortcut_ = |
+ fake_user_desktop_.path().Append(alternate_shortcut_name); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ // Try to unpin potentially pinned shortcuts (although pinning isn't tested, |
+ // the call itself might still have pinned the Start Menu shortcuts). |
+ base::win::TaskbarUnpinShortcutLink( |
+ user_start_menu_shortcut_.value().c_str()); |
+ base::win::TaskbarUnpinShortcutLink( |
+ system_start_menu_shortcut_.value().c_str()); |
+ CoUninitialize(); |
+ } |
+ |
+ base::win::ShortcutProperties GetExpectedUninstallShortcutProperties( |
+ bool system_level) { |
+ CommandLine arguments(CommandLine::NO_PROGRAM); |
+ const installer::InstallerState& installer_state = system_level ? |
+ *mock_system_installer_state_ : *mock_user_installer_state_; |
+ AppendUninstallCommandLineFlags(installer_state, *product_, &arguments); |
+ |
+ base::win::ShortcutProperties properties; |
+ properties.set_target(setup_exe_); |
+ properties.set_arguments(arguments.GetCommandLineString()); |
+ return properties; |
+ } |
+ |
+ base::win::ShortcutProperties expected_properties_; |
+ |
+ FilePath chrome_exe_; |
+ FilePath setup_exe_; |
+ scoped_ptr<installer::Product> product_; |
+ scoped_ptr<MockInstallerState> mock_user_installer_state_; |
+ scoped_ptr<MockInstallerState> mock_system_installer_state_; |
+ |
+ ScopedTempDir temp_dir_; |
+ ScopedTempDir fake_user_desktop_; |
+ ScopedTempDir fake_common_desktop_; |
+ ScopedTempDir fake_user_quick_launch_; |
+ ScopedTempDir fake_default_user_quick_launch_; |
+ ScopedTempDir fake_start_menu_; |
+ ScopedTempDir fake_common_start_menu_; |
+ |
+ FilePath user_desktop_shortcut_; |
+ FilePath user_quick_launch_shortcut_; |
+ FilePath user_start_menu_shortcut_; |
+ FilePath user_uninstall_shortcut_; |
+ FilePath system_desktop_shortcut_; |
+ FilePath system_quick_launch_shortcut_; |
+ FilePath system_start_menu_shortcut_; |
+ FilePath system_uninstall_shortcut_; |
+ FilePath user_alternate_desktop_shortcut_; |
+}; |
+ |
} // namespace |
// Test that VisualElementsManifest.xml is not created when VisualElements are |
@@ -88,6 +236,141 @@ TEST_F(CreateVisualElementsManifestTest, VisualElementsManifestCreated) { |
ASSERT_STREQ(kExpectedManifest, read_manifest.c_str()); |
} |
+TEST_F(InstallShortcutTest, CreateAllShortcuts) { |
+ CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
+ base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
+ base::win::ValidateShortcut(user_quick_launch_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(false)); |
+ base::win::ValidateShortcut(user_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+} |
+ |
+TEST_F(InstallShortcutTest, CreateAllShortcutsSystemLevel) { |
+ CreateOrUpdateShortcuts(*mock_system_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
+ base::win::ValidateShortcut(system_desktop_shortcut_, expected_properties_); |
+ base::win::ValidateShortcut(system_quick_launch_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(system_start_menu_shortcut_, |
+ expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(true)); |
+ base::win::ValidateShortcut(system_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+ // On system-level installs, the quick launch shortcut for the current user |
+ // should also be installed. |
+ base::win::ValidateShortcut(user_quick_launch_shortcut_, |
+ expected_properties_); |
+} |
+ |
+TEST_F(InstallShortcutTest, CreateAllShortcutsAlternateDesktopName) { |
+ CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_CREATE_ALL, true); |
+ base::win::ValidateShortcut(user_alternate_desktop_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(user_quick_launch_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(user_start_menu_shortcut_, |
+ expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(false)); |
+ base::win::ValidateShortcut(user_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+} |
+ |
+TEST_F(InstallShortcutTest, CreateMandatoryShortcuts) { |
+ CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_CREATE_MANDATORY, false); |
+ ASSERT_FALSE(file_util::PathExists(user_desktop_shortcut_)); |
+ ASSERT_FALSE(file_util::PathExists(user_quick_launch_shortcut_)); |
+ base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(false)); |
+ base::win::ValidateShortcut(user_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+} |
+ |
+TEST_F(InstallShortcutTest, ReplaceAll) { |
+ base::win::ShortcutProperties dummy_properties; |
+ FilePath dummy_target; |
+ ASSERT_TRUE( |
+ file_util::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target)); |
+ dummy_properties.set_target(dummy_target); |
+ dummy_properties.set_working_dir(fake_user_desktop_.path()); |
+ dummy_properties.set_arguments(L"--dummy --args"); |
+ dummy_properties.set_app_id(L"El.Dummiest"); |
+ |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_desktop_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_quick_launch_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ ASSERT_TRUE(file_util::CreateDirectory(user_start_menu_shortcut_.DirName())); |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_start_menu_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_uninstall_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ |
+ CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_REPLACE_EXISTING, false); |
+ base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
+ base::win::ValidateShortcut(user_quick_launch_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(user_start_menu_shortcut_, |
+ expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(false)); |
+ base::win::ValidateShortcut(user_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+} |
+ |
+TEST_F(InstallShortcutTest, ReplaceExisting) { |
+ base::win::ShortcutProperties dummy_properties; |
+ FilePath dummy_target; |
+ ASSERT_TRUE( |
+ file_util::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target)); |
+ dummy_properties.set_target(dummy_target); |
+ dummy_properties.set_working_dir(fake_user_desktop_.path()); |
+ dummy_properties.set_arguments(L"--dummy --args"); |
+ dummy_properties.set_app_id(L"El.Dummiest"); |
+ |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_desktop_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ ASSERT_TRUE(file_util::CreateDirectory(user_start_menu_shortcut_.DirName())); |
+ ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
+ user_uninstall_shortcut_, dummy_properties, |
+ base::win::SHORTCUT_CREATE_ALWAYS)); |
+ |
+ CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_REPLACE_EXISTING, false); |
+ base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
+ base::win::ShortcutProperties expected_uninstall_properties( |
+ GetExpectedUninstallShortcutProperties(false)); |
+ base::win::ValidateShortcut(user_uninstall_shortcut_, |
+ expected_uninstall_properties); |
+ ASSERT_FALSE(file_util::PathExists(user_quick_launch_shortcut_)); |
+ ASSERT_FALSE(file_util::PathExists(user_start_menu_shortcut_)); |
+} |
+ |
+TEST_F(InstallShortcutTest, NoUninstallLinkForMSIInstalls) { |
+ MockInstallerState no_msi_installer_state(chrome_exe_.DirName(), false, true); |
+ CreateOrUpdateShortcuts(no_msi_installer_state, setup_exe_, *product_, |
+ installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
+ base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
+ base::win::ValidateShortcut(user_quick_launch_shortcut_, |
+ expected_properties_); |
+ base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
+ ASSERT_FALSE(file_util::PathExists(user_uninstall_shortcut_)); |
+} |
+ |
TEST(EscapeXmlAttributeValueTest, EscapeCrazyValue) { |
string16 val(L"This has 'crazy' \"chars\" && < and > signs."); |
static const wchar_t kExpectedEscapedVal[] = |