Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: chrome/installer/setup/install_unittest.cc

Issue 10836247: Refactor ShellUtil shortcut code -- single multi-purpose methods as opposed to many slighlty diffe… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: brand new shell_util shortcut API + TESTS :)! Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 &apos;crazy&apos; \"chars\" &amp;&amp; &lt; and > signs."; 373 L"This has &apos;crazy&apos; \"chars\" &amp;&amp; &lt; 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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698