OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <objbase.h> |
| 6 |
5 #include <string> | 7 #include <string> |
6 | 8 |
| 9 #include "base/file_path.h" |
7 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/path_service.h" |
8 #include "base/platform_file.h" | 12 #include "base/platform_file.h" |
9 #include "base/scoped_temp_dir.h" | 13 #include "base/scoped_temp_dir.h" |
10 #include "base/string16.h" | 14 #include "base/string16.h" |
11 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
12 #include "base/version.h" | 16 #include "base/version.h" |
| 17 #include "base/memory/scoped_ptr.h" |
| 18 #include "base/test/test_shortcut_win.h" |
| 19 #include "base/win/shortcut.h" |
13 #include "chrome/installer/setup/install.h" | 20 #include "chrome/installer/setup/install.h" |
| 21 #include "chrome/installer/setup/install_worker.h" |
14 #include "chrome/installer/setup/setup_constants.h" | 22 #include "chrome/installer/setup/setup_constants.h" |
| 23 #include "chrome/installer/util/browser_distribution.h" |
| 24 #include "chrome/installer/util/installer_state.h" |
| 25 #include "chrome/installer/util/product.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
16 | 27 |
17 namespace { | 28 namespace { |
18 | 29 |
19 class CreateVisualElementsManifestTest : public testing::Test { | 30 class CreateVisualElementsManifestTest : public testing::Test { |
20 protected: | 31 protected: |
21 virtual void SetUp() OVERRIDE { | 32 virtual void SetUp() OVERRIDE { |
22 // Create a temp directory for testing. | 33 // Create a temp directory for testing. |
23 ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); | 34 ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); |
24 | 35 |
(...skipping 17 matching lines...) Expand all Loading... |
42 // A dummy version number used to create the version directory. | 53 // A dummy version number used to create the version directory. |
43 Version version_; | 54 Version version_; |
44 | 55 |
45 // The path to |test_dir_|\|version_|. | 56 // The path to |test_dir_|\|version_|. |
46 FilePath version_dir_; | 57 FilePath version_dir_; |
47 | 58 |
48 // The path to VisualElementsManifest.xml. | 59 // The path to VisualElementsManifest.xml. |
49 FilePath manifest_path_; | 60 FilePath manifest_path_; |
50 }; | 61 }; |
51 | 62 |
| 63 class InstallShorcutTest : public testing::Test { |
| 64 protected: |
| 65 // A mock installer state on which .system_install() will return |
| 66 // |system_install|, .target_path() will return |target_path|, and .is_msi() |
| 67 // will return |is_msi|. |
| 68 class MockInstallerState : public installer::InstallerState { |
| 69 public: |
| 70 MockInstallerState(const FilePath& target_path, |
| 71 bool system_install, |
| 72 bool is_msi) : InstallerState() { |
| 73 target_path_ = target_path; |
| 74 set_level(system_install ? SYSTEM_LEVEL : USER_LEVEL); |
| 75 msi_ = is_msi; |
| 76 } |
| 77 }; |
| 78 |
| 79 virtual void SetUp() OVERRIDE { |
| 80 EXPECT_EQ(S_OK, CoInitialize(NULL)); |
| 81 |
| 82 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 83 ASSERT_TRUE(dist != NULL); |
| 84 product_.reset(new installer::Product(dist)); |
| 85 |
| 86 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 87 chrome_exe_ = temp_dir_.path().Append(installer::kChromeExe); |
| 88 setup_exe_ = temp_dir_.path().Append(installer::kSetupExe); |
| 89 EXPECT_EQ(0, file_util::WriteFile(chrome_exe_, "", 0)); |
| 90 EXPECT_EQ(0, file_util::WriteFile(setup_exe_, "", 0)); |
| 91 |
| 92 mock_user_installer_state_.reset( |
| 93 new MockInstallerState(chrome_exe_.DirName(), false, false)); |
| 94 mock_system_installer_state_.reset( |
| 95 new MockInstallerState(chrome_exe_.DirName(), true, false)); |
| 96 |
| 97 expected_properties_.set_target(chrome_exe_); |
| 98 expected_properties_.set_dual_mode(true); |
| 99 |
| 100 ASSERT_TRUE(fake_user_desktop_.CreateUniqueTempDir()); |
| 101 ASSERT_TRUE(fake_common_desktop_.CreateUniqueTempDir()); |
| 102 ASSERT_TRUE(fake_user_quick_launch_.CreateUniqueTempDir()); |
| 103 ASSERT_TRUE(fake_default_user_quick_launch_.CreateUniqueTempDir()); |
| 104 ASSERT_TRUE(fake_start_menu_.CreateUniqueTempDir()); |
| 105 ASSERT_TRUE(fake_common_start_menu_.CreateUniqueTempDir()); |
| 106 ASSERT_TRUE(PathService::Override(base::DIR_USER_DESKTOP, |
| 107 fake_user_desktop_.path())); |
| 108 ASSERT_TRUE(PathService::Override(base::DIR_COMMON_DESKTOP, |
| 109 fake_common_desktop_.path())); |
| 110 ASSERT_TRUE(PathService::Override(base::DIR_USER_QUICK_LAUNCH, |
| 111 fake_user_quick_launch_.path())); |
| 112 ASSERT_TRUE(PathService::Override(base::DIR_DEFAULT_USER_QUICK_LAUNCH, |
| 113 fake_default_user_quick_launch_.path())); |
| 114 ASSERT_TRUE(PathService::Override(base::DIR_START_MENU, |
| 115 fake_start_menu_.path())); |
| 116 ASSERT_TRUE(PathService::Override(base::DIR_COMMON_START_MENU, |
| 117 fake_common_start_menu_.path())); |
| 118 |
| 119 string16 shortcut_name(dist->GetAppShortCutName()); |
| 120 string16 uninstall_shorcut_name(dist->GetUninstallLinkName()); |
| 121 string16 alternate_shortcut_name(dist->GetAlternateApplicationName()); |
| 122 shortcut_name.append(L".lnk"); |
| 123 uninstall_shorcut_name.append(L".lnk"); |
| 124 alternate_shortcut_name.append(L".lnk"); |
| 125 |
| 126 user_desktop_shortcut_ = |
| 127 fake_user_desktop_.path().Append(shortcut_name); |
| 128 user_quick_launch_shortcut_ = |
| 129 fake_user_quick_launch_.path().Append(shortcut_name); |
| 130 user_start_menu_shortcut_ = |
| 131 fake_start_menu_.path().Append(dist->GetAppShortCutName()) |
| 132 .Append(shortcut_name); |
| 133 user_uninstall_shortcut_ = |
| 134 fake_start_menu_.path().Append(dist->GetAppShortCutName()) |
| 135 .Append(uninstall_shorcut_name); |
| 136 system_desktop_shortcut_ = |
| 137 fake_common_desktop_.path().Append(shortcut_name); |
| 138 system_quick_launch_shortcut_ = |
| 139 fake_default_user_quick_launch_.path().Append(shortcut_name); |
| 140 system_start_menu_shortcut_ = |
| 141 fake_common_start_menu_.path().Append(dist->GetAppShortCutName()) |
| 142 .Append(shortcut_name); |
| 143 system_uninstall_shortcut_ = |
| 144 fake_common_start_menu_.path().Append(dist->GetAppShortCutName()) |
| 145 .Append(uninstall_shorcut_name); |
| 146 user_alternate_desktop_shortcut_ = |
| 147 fake_user_desktop_.path().Append(alternate_shortcut_name); |
| 148 } |
| 149 |
| 150 virtual void TearDown() OVERRIDE { |
| 151 // Try to unpin potentially pinned shortcuts (although pinning isn't tested, |
| 152 // the call itself might still have pinned the Start Menu shortcuts). |
| 153 base::win::TaskbarUnpinShortcutLink( |
| 154 user_start_menu_shortcut_.value().c_str()); |
| 155 base::win::TaskbarUnpinShortcutLink( |
| 156 system_start_menu_shortcut_.value().c_str()); |
| 157 CoUninitialize(); |
| 158 } |
| 159 |
| 160 base::win::ShortcutProperties GetExpectedUninstallShortcutProperties( |
| 161 bool system_level) { |
| 162 CommandLine arguments(CommandLine::NO_PROGRAM); |
| 163 const installer::InstallerState& installer_state = system_level ? |
| 164 *mock_system_installer_state_ : *mock_user_installer_state_; |
| 165 AppendUninstallCommandLineFlags(installer_state, *product_, &arguments); |
| 166 |
| 167 base::win::ShortcutProperties properties; |
| 168 properties.set_target(setup_exe_); |
| 169 properties.set_arguments(arguments.GetCommandLineString()); |
| 170 return properties; |
| 171 } |
| 172 |
| 173 base::win::ShortcutProperties expected_properties_; |
| 174 |
| 175 FilePath chrome_exe_; |
| 176 FilePath setup_exe_; |
| 177 scoped_ptr<installer::Product> product_; |
| 178 scoped_ptr<MockInstallerState> mock_user_installer_state_; |
| 179 scoped_ptr<MockInstallerState> mock_system_installer_state_; |
| 180 |
| 181 ScopedTempDir temp_dir_; |
| 182 ScopedTempDir fake_user_desktop_; |
| 183 ScopedTempDir fake_common_desktop_; |
| 184 ScopedTempDir fake_user_quick_launch_; |
| 185 ScopedTempDir fake_default_user_quick_launch_; |
| 186 ScopedTempDir fake_start_menu_; |
| 187 ScopedTempDir fake_common_start_menu_; |
| 188 |
| 189 FilePath user_desktop_shortcut_; |
| 190 FilePath user_quick_launch_shortcut_; |
| 191 FilePath user_start_menu_shortcut_; |
| 192 FilePath user_uninstall_shortcut_; |
| 193 FilePath system_desktop_shortcut_; |
| 194 FilePath system_quick_launch_shortcut_; |
| 195 FilePath system_start_menu_shortcut_; |
| 196 FilePath system_uninstall_shortcut_; |
| 197 FilePath user_alternate_desktop_shortcut_; |
| 198 }; |
| 199 |
52 } // namespace | 200 } // namespace |
53 | 201 |
54 // Test that VisualElementsManifest.xml is not created when VisualElements are | 202 // Test that VisualElementsManifest.xml is not created when VisualElements are |
55 // not present. | 203 // not present. |
56 TEST_F(CreateVisualElementsManifestTest, VisualElementsManifestNotCreated) { | 204 TEST_F(CreateVisualElementsManifestTest, VisualElementsManifestNotCreated) { |
57 ASSERT_TRUE( | 205 ASSERT_TRUE( |
58 installer::CreateVisualElementsManifest(test_dir_.path(), version_)); | 206 installer::CreateVisualElementsManifest(test_dir_.path(), version_)); |
59 ASSERT_FALSE(file_util::PathExists(manifest_path_)); | 207 ASSERT_FALSE(file_util::PathExists(manifest_path_)); |
60 } | 208 } |
61 | 209 |
(...skipping 19 matching lines...) Expand all Loading... |
81 " BackgroundColor='white'>\r\n" | 229 " BackgroundColor='white'>\r\n" |
82 " <DefaultTile ShowName='allLogos'/>\r\n" | 230 " <DefaultTile ShowName='allLogos'/>\r\n" |
83 " <SplashScreen Image='0.0.0.0\\VisualElements\\splash-620x300.png'/>" | 231 " <SplashScreen Image='0.0.0.0\\VisualElements\\splash-620x300.png'/>" |
84 "\r\n" | 232 "\r\n" |
85 " </VisualElements>\r\n" | 233 " </VisualElements>\r\n" |
86 "</Application>"; | 234 "</Application>"; |
87 | 235 |
88 ASSERT_STREQ(kExpectedManifest, read_manifest.c_str()); | 236 ASSERT_STREQ(kExpectedManifest, read_manifest.c_str()); |
89 } | 237 } |
90 | 238 |
| 239 TEST_F(InstallShorcutTest, CreateAllShortcuts) { |
| 240 CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
| 241 installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
| 242 base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
| 243 base::win::ValidateShortcut(user_quick_launch_shortcut_, |
| 244 expected_properties_); |
| 245 base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
| 246 base::win::ShortcutProperties expected_uninstall_properties( |
| 247 GetExpectedUninstallShortcutProperties(false)); |
| 248 base::win::ValidateShortcut(user_uninstall_shortcut_, |
| 249 expected_uninstall_properties); |
| 250 } |
| 251 |
| 252 TEST_F(InstallShorcutTest, CreateAllShortcutsSystemLevel) { |
| 253 CreateOrUpdateShortcuts(*mock_system_installer_state_, setup_exe_, *product_, |
| 254 installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
| 255 base::win::ValidateShortcut(system_desktop_shortcut_, expected_properties_); |
| 256 base::win::ValidateShortcut(system_quick_launch_shortcut_, |
| 257 expected_properties_); |
| 258 base::win::ValidateShortcut(system_start_menu_shortcut_, |
| 259 expected_properties_); |
| 260 base::win::ShortcutProperties expected_uninstall_properties( |
| 261 GetExpectedUninstallShortcutProperties(true)); |
| 262 base::win::ValidateShortcut(system_uninstall_shortcut_, |
| 263 expected_uninstall_properties); |
| 264 } |
| 265 |
| 266 TEST_F(InstallShorcutTest, CreateAllShortcutsAlternateDesktopName) { |
| 267 CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
| 268 installer::INSTALL_SHORTCUT_CREATE_ALL, true); |
| 269 base::win::ValidateShortcut(user_alternate_desktop_shortcut_, |
| 270 expected_properties_); |
| 271 base::win::ValidateShortcut(user_quick_launch_shortcut_, |
| 272 expected_properties_); |
| 273 base::win::ValidateShortcut(user_start_menu_shortcut_, |
| 274 expected_properties_); |
| 275 base::win::ShortcutProperties expected_uninstall_properties( |
| 276 GetExpectedUninstallShortcutProperties(false)); |
| 277 base::win::ValidateShortcut(user_uninstall_shortcut_, |
| 278 expected_uninstall_properties); |
| 279 } |
| 280 |
| 281 TEST_F(InstallShorcutTest, CreateMandatoryShortcuts) { |
| 282 CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
| 283 installer::INSTALL_SHORTCUT_CREATE_MANDATORY, false); |
| 284 ASSERT_FALSE(file_util::PathExists(user_desktop_shortcut_)); |
| 285 ASSERT_FALSE(file_util::PathExists(user_quick_launch_shortcut_)); |
| 286 base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
| 287 base::win::ShortcutProperties expected_uninstall_properties( |
| 288 GetExpectedUninstallShortcutProperties(false)); |
| 289 base::win::ValidateShortcut(user_uninstall_shortcut_, |
| 290 expected_uninstall_properties); |
| 291 } |
| 292 |
| 293 TEST_F(InstallShorcutTest, ReplaceAll) { |
| 294 base::win::ShortcutProperties dummy_properties; |
| 295 FilePath dummy_target; |
| 296 ASSERT_TRUE( |
| 297 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target)); |
| 298 dummy_properties.set_target(dummy_target); |
| 299 dummy_properties.set_working_dir(fake_user_desktop_.path()); |
| 300 dummy_properties.set_arguments(L"--dummy --args"); |
| 301 dummy_properties.set_app_id(L"El.Dummiest"); |
| 302 |
| 303 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 304 user_desktop_shortcut_, dummy_properties, |
| 305 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 306 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 307 user_quick_launch_shortcut_, dummy_properties, |
| 308 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 309 ASSERT_TRUE(file_util::CreateDirectory(user_start_menu_shortcut_.DirName())); |
| 310 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 311 user_start_menu_shortcut_, dummy_properties, |
| 312 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 313 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 314 user_uninstall_shortcut_, dummy_properties, |
| 315 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 316 |
| 317 CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
| 318 installer::INSTALL_SHORTCUT_REPLACE_EXISTING, false); |
| 319 base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
| 320 base::win::ValidateShortcut(user_quick_launch_shortcut_, |
| 321 expected_properties_); |
| 322 base::win::ValidateShortcut(user_start_menu_shortcut_, |
| 323 expected_properties_); |
| 324 base::win::ShortcutProperties expected_uninstall_properties( |
| 325 GetExpectedUninstallShortcutProperties(false)); |
| 326 base::win::ValidateShortcut(user_uninstall_shortcut_, |
| 327 expected_uninstall_properties); |
| 328 } |
| 329 |
| 330 TEST_F(InstallShorcutTest, ReplaceExisting) { |
| 331 base::win::ShortcutProperties dummy_properties; |
| 332 FilePath dummy_target; |
| 333 ASSERT_TRUE( |
| 334 file_util::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_target)); |
| 335 dummy_properties.set_target(dummy_target); |
| 336 dummy_properties.set_working_dir(fake_user_desktop_.path()); |
| 337 dummy_properties.set_arguments(L"--dummy --args"); |
| 338 dummy_properties.set_app_id(L"El.Dummiest"); |
| 339 |
| 340 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 341 user_desktop_shortcut_, dummy_properties, |
| 342 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 343 ASSERT_TRUE(file_util::CreateDirectory(user_start_menu_shortcut_.DirName())); |
| 344 ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink( |
| 345 user_uninstall_shortcut_, dummy_properties, |
| 346 base::win::SHORTCUT_CREATE_ALWAYS)); |
| 347 |
| 348 CreateOrUpdateShortcuts(*mock_user_installer_state_, setup_exe_, *product_, |
| 349 installer::INSTALL_SHORTCUT_REPLACE_EXISTING, false); |
| 350 base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
| 351 base::win::ShortcutProperties expected_uninstall_properties( |
| 352 GetExpectedUninstallShortcutProperties(false)); |
| 353 base::win::ValidateShortcut(user_uninstall_shortcut_, |
| 354 expected_uninstall_properties); |
| 355 ASSERT_FALSE(file_util::PathExists(user_quick_launch_shortcut_)); |
| 356 ASSERT_FALSE(file_util::PathExists(user_start_menu_shortcut_)); |
| 357 } |
| 358 |
| 359 TEST_F(InstallShorcutTest, NoUninstallLinkForMSIInstalls) { |
| 360 MockInstallerState no_msi_installer_state(chrome_exe_.DirName(), false, true); |
| 361 CreateOrUpdateShortcuts(no_msi_installer_state, setup_exe_, *product_, |
| 362 installer::INSTALL_SHORTCUT_CREATE_ALL, false); |
| 363 base::win::ValidateShortcut(user_desktop_shortcut_, expected_properties_); |
| 364 base::win::ValidateShortcut(user_quick_launch_shortcut_, |
| 365 expected_properties_); |
| 366 base::win::ValidateShortcut(user_start_menu_shortcut_, expected_properties_); |
| 367 ASSERT_FALSE(file_util::PathExists(user_uninstall_shortcut_)); |
| 368 } |
| 369 |
91 TEST(EscapeXmlAttributeValueTest, EscapeCrazyValue) { | 370 TEST(EscapeXmlAttributeValueTest, EscapeCrazyValue) { |
92 string16 val(L"This has 'crazy' \"chars\" && < and > signs."); | 371 string16 val(L"This has 'crazy' \"chars\" && < and > signs."); |
93 static const wchar_t kExpectedEscapedVal[] = | 372 static const wchar_t kExpectedEscapedVal[] = |
94 L"This has 'crazy' \"chars\" && < and > signs."; | 373 L"This has 'crazy' \"chars\" && < and > signs."; |
95 installer::EscapeXmlAttributeValueInSingleQuotes(&val); | 374 installer::EscapeXmlAttributeValueInSingleQuotes(&val); |
96 ASSERT_STREQ(kExpectedEscapedVal, val.c_str()); | 375 ASSERT_STREQ(kExpectedEscapedVal, val.c_str()); |
97 } | 376 } |
98 | 377 |
99 TEST(EscapeXmlAttributeValueTest, DontEscapeNormalValue) { | 378 TEST(EscapeXmlAttributeValueTest, DontEscapeNormalValue) { |
100 string16 val(L"Google Chrome"); | 379 string16 val(L"Google Chrome"); |
101 static const wchar_t kExpectedEscapedVal[] = L"Google Chrome"; | 380 static const wchar_t kExpectedEscapedVal[] = L"Google Chrome"; |
102 installer::EscapeXmlAttributeValueInSingleQuotes(&val); | 381 installer::EscapeXmlAttributeValueInSingleQuotes(&val); |
103 ASSERT_STREQ(kExpectedEscapedVal, val.c_str()); | 382 ASSERT_STREQ(kExpectedEscapedVal, val.c_str()); |
104 } | 383 } |
OLD | NEW |