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

Side by Side Diff: chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc

Issue 11876027: ProfileShortcutManagerWin: Don't create user level shortcut when system level one exists. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 11 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> // For CoInitialize(). 5 #include <objbase.h> // For CoInitialize().
6 6
7 #include "base/base_paths.h"
7 #include "base/file_util.h" 8 #include "base/file_util.h"
8 #include "base/location.h" 9 #include "base/location.h"
9 #include "base/message_loop.h" 10 #include "base/message_loop.h"
10 #include "base/path_service.h" 11 #include "base/path_service.h"
11 #include "base/test/scoped_path_override.h" 12 #include "base/test/scoped_path_override.h"
12 #include "base/string16.h" 13 #include "base/string16.h"
13 #include "base/test/test_shortcut_win.h" 14 #include "base/test/test_shortcut_win.h"
14 #include "base/win/shortcut.h" 15 #include "base/win/shortcut.h"
15 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/profiles/profile_manager.h" 17 #include "chrome/browser/profiles/profile_manager.h"
(...skipping 10 matching lines...) Expand all
27 28
28 using content::BrowserThread; 29 using content::BrowserThread;
29 30
30 class ProfileShortcutManagerTest : public testing::Test { 31 class ProfileShortcutManagerTest : public testing::Test {
31 protected: 32 protected:
32 ProfileShortcutManagerTest() 33 ProfileShortcutManagerTest()
33 : distribution_(NULL), 34 : distribution_(NULL),
34 ui_thread_(BrowserThread::UI, &message_loop_), 35 ui_thread_(BrowserThread::UI, &message_loop_),
35 file_thread_(BrowserThread::FILE, &message_loop_), 36 file_thread_(BrowserThread::FILE, &message_loop_),
36 profile_shortcut_manager_(NULL), 37 profile_shortcut_manager_(NULL),
37 profile_info_cache_(NULL), 38 profile_info_cache_(NULL) {
38 fake_user_desktop_(base::DIR_USER_DESKTOP) {
39 } 39 }
40 40
41 virtual void SetUp() OVERRIDE { 41 virtual void SetUp() OVERRIDE {
42 CoInitialize(NULL); 42 CoInitialize(NULL);
43 distribution_ = BrowserDistribution::GetDistribution(); 43 distribution_ = BrowserDistribution::GetDistribution();
44 ASSERT_TRUE(distribution_ != NULL); 44 ASSERT_TRUE(distribution_ != NULL);
45 45
46 TestingBrowserProcess* browser_process = 46 TestingBrowserProcess* browser_process =
47 TestingBrowserProcess::GetGlobal(); 47 TestingBrowserProcess::GetGlobal();
48 profile_manager_.reset(new TestingProfileManager(browser_process)); 48 profile_manager_.reset(new TestingProfileManager(browser_process));
49 ASSERT_TRUE(profile_manager_->SetUp()); 49 ASSERT_TRUE(profile_manager_->SetUp());
50 profile_info_cache_ = profile_manager_->profile_info_cache(); 50 profile_info_cache_ = profile_manager_->profile_info_cache();
51 profile_shortcut_manager_.reset( 51 profile_shortcut_manager_.reset(
52 ProfileShortcutManager::Create(profile_manager_->profile_manager())); 52 ProfileShortcutManager::Create(profile_manager_->profile_manager()));
53 53
54 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &exe_path_)); 54 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &exe_path_));
55 fake_user_desktop_.reset(
sail 2013/01/14 21:45:19 Are you moving this here to ensure that it runs on
Alexei Svitkine (slow) 2013/01/14 22:40:24 Ah, that makes sense. Thanks for letting me know,
Alexei Svitkine (slow) 2013/01/15 22:03:02 Done.
56 new base::ScopedPathOverride(base::DIR_USER_DESKTOP));
55 ASSERT_TRUE(ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP, 57 ASSERT_TRUE(ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP,
56 distribution_, 58 distribution_,
57 ShellUtil::CURRENT_USER, 59 ShellUtil::CURRENT_USER,
58 &shortcuts_directory_)); 60 &shortcuts_directory_));
59 61 fake_system_desktop_.reset(
sail 2013/01/14 21:45:19 same here
Alexei Svitkine (slow) 2013/01/15 22:03:02 Done.
62 new base::ScopedPathOverride(base::DIR_COMMON_DESKTOP));
63 ASSERT_TRUE(ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP,
64 distribution_,
65 ShellUtil::SYSTEM_LEVEL,
66 &system_shortcuts_directory_));
60 profile_1_name_ = L"My profile"; 67 profile_1_name_ = L"My profile";
61 profile_1_path_ = CreateProfileDirectory(profile_1_name_); 68 profile_1_path_ = CreateProfileDirectory(profile_1_name_);
62 profile_2_name_ = L"My profile 2"; 69 profile_2_name_ = L"My profile 2";
63 profile_2_path_ = CreateProfileDirectory(profile_2_name_); 70 profile_2_path_ = CreateProfileDirectory(profile_2_name_);
64 profile_3_name_ = L"My profile 3"; 71 profile_3_name_ = L"My profile 3";
65 profile_3_path_ = CreateProfileDirectory(profile_3_name_); 72 profile_3_path_ = CreateProfileDirectory(profile_3_name_);
66 } 73 }
67 74
68 virtual void TearDown() OVERRIDE { 75 virtual void TearDown() OVERRIDE {
69 message_loop_.RunUntilIdle(); 76 message_loop_.RunUntilIdle();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 product.AddDefaultShortcutProperties(exe_path_, &properties); 216 product.AddDefaultShortcutProperties(exe_path_, &properties);
210 properties.set_shortcut_name(shortcut_name); 217 properties.set_shortcut_name(shortcut_name);
211 EXPECT_TRUE(ShellUtil::CreateOrUpdateShortcut( 218 EXPECT_TRUE(ShellUtil::CreateOrUpdateShortcut(
212 ShellUtil::SHORTCUT_LOCATION_DESKTOP, distribution_, properties, 219 ShellUtil::SHORTCUT_LOCATION_DESKTOP, distribution_, properties,
213 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)) << location.ToString(); 220 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)) << location.ToString();
214 EXPECT_TRUE(file_util::PathExists(shortcut_path)) << location.ToString(); 221 EXPECT_TRUE(file_util::PathExists(shortcut_path)) << location.ToString();
215 222
216 return shortcut_path; 223 return shortcut_path;
217 } 224 }
218 225
226 FilePath CreateRegularSystemLevelShortcut(
227 const tracked_objects::Location& location) {
228 installer::Product product(distribution_);
229 ShellUtil::ShortcutProperties properties(ShellUtil::SYSTEM_LEVEL);
230 product.AddDefaultShortcutProperties(exe_path_, &properties);
231 EXPECT_TRUE(ShellUtil::CreateOrUpdateShortcut(
232 ShellUtil::SHORTCUT_LOCATION_DESKTOP, distribution_, properties,
233 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)) << location.ToString();
234 const FilePath system_level_shortcut_path =
235 system_shortcuts_directory_.Append(distribution_->GetAppShortCutName() +
236 installer::kLnkExt);
237 EXPECT_TRUE(file_util::PathExists(system_level_shortcut_path))
238 << location.ToString();
239 return system_level_shortcut_path;
240 }
241
219 void RenameProfile(const tracked_objects::Location& location, 242 void RenameProfile(const tracked_objects::Location& location,
220 const FilePath& profile_path, 243 const FilePath& profile_path,
221 const string16& new_profile_name) { 244 const string16& new_profile_name) {
222 const size_t profile_index = 245 const size_t profile_index =
223 profile_info_cache_->GetIndexOfProfileWithPath(profile_2_path_); 246 profile_info_cache_->GetIndexOfProfileWithPath(profile_2_path_);
224 ASSERT_NE(std::string::npos, profile_index); 247 ASSERT_NE(std::string::npos, profile_index);
225 ASSERT_NE(profile_info_cache_->GetNameOfProfileAtIndex(profile_index), 248 ASSERT_NE(profile_info_cache_->GetNameOfProfileAtIndex(profile_index),
226 new_profile_name); 249 new_profile_name);
227 profile_info_cache_->SetNameOfProfileAtIndex(profile_index, 250 profile_info_cache_->SetNameOfProfileAtIndex(profile_index,
228 new_profile_name); 251 new_profile_name);
229 RunPendingTasks(); 252 RunPendingTasks();
230 } 253 }
231 254
232 BrowserDistribution* distribution_; 255 BrowserDistribution* distribution_;
233 MessageLoopForUI message_loop_; 256 MessageLoopForUI message_loop_;
234 content::TestBrowserThread ui_thread_; 257 content::TestBrowserThread ui_thread_;
235 content::TestBrowserThread file_thread_; 258 content::TestBrowserThread file_thread_;
236 scoped_ptr<TestingProfileManager> profile_manager_; 259 scoped_ptr<TestingProfileManager> profile_manager_;
237 scoped_ptr<ProfileShortcutManager> profile_shortcut_manager_; 260 scoped_ptr<ProfileShortcutManager> profile_shortcut_manager_;
238 ProfileInfoCache* profile_info_cache_; 261 ProfileInfoCache* profile_info_cache_;
239 base::ScopedPathOverride fake_user_desktop_;
240 FilePath exe_path_; 262 FilePath exe_path_;
263 scoped_ptr<base::ScopedPathOverride> fake_user_desktop_;
241 FilePath shortcuts_directory_; 264 FilePath shortcuts_directory_;
265 scoped_ptr<base::ScopedPathOverride> fake_system_desktop_;
266 FilePath system_shortcuts_directory_;
sail 2013/01/14 21:45:19 Ideally we shouldn't cache things in member variab
Alexei Svitkine (slow) 2013/01/14 22:40:24 Things are cached in member variables to make the
sail 2013/01/14 22:43:55 It's not too bad, GetFakeUserDesktop(). That's onl
242 string16 profile_1_name_; 267 string16 profile_1_name_;
243 FilePath profile_1_path_; 268 FilePath profile_1_path_;
244 string16 profile_2_name_; 269 string16 profile_2_name_;
245 FilePath profile_2_path_; 270 FilePath profile_2_path_;
246 string16 profile_3_name_; 271 string16 profile_3_name_;
247 FilePath profile_3_path_; 272 FilePath profile_3_path_;
248 }; 273 };
249 274
250 TEST_F(ProfileShortcutManagerTest, ShortcutFilename) { 275 TEST_F(ProfileShortcutManagerTest, ShortcutFilename) {
251 const string16 kProfileName = L"Harry"; 276 const string16 kProfileName = L"Harry";
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 647
623 // Delete the shortcut and check that the function returns false. 648 // Delete the shortcut and check that the function returns false.
624 const FilePath profile_2_shortcut_path = 649 const FilePath profile_2_shortcut_path =
625 GetDefaultShortcutPathForProfile(profile_2_name_); 650 GetDefaultShortcutPathForProfile(profile_2_name_);
626 ASSERT_TRUE(file_util::Delete(profile_2_shortcut_path, false)); 651 ASSERT_TRUE(file_util::Delete(profile_2_shortcut_path, false));
627 EXPECT_FALSE(file_util::PathExists(profile_2_shortcut_path)); 652 EXPECT_FALSE(file_util::PathExists(profile_2_shortcut_path));
628 profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback); 653 profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback);
629 RunPendingTasks(); 654 RunPendingTasks();
630 EXPECT_FALSE(result.has_shortcuts); 655 EXPECT_FALSE(result.has_shortcuts);
631 } 656 }
657
658 TEST_F(ProfileShortcutManagerTest,
659 ShortcutNotCreatedWhenSystemLevelShortcutExists) {
660 const FilePath system_level_shortcut_path =
661 CreateRegularSystemLevelShortcut(FROM_HERE);
662
663 // Create the initial profile.
664 profile_info_cache_->AddProfileToCache(profile_1_path_, profile_1_name_,
665 string16(), 0, false);
666 RunPendingTasks();
667 ASSERT_EQ(1U, profile_info_cache_->GetNumberOfProfiles());
668
669 // Ensure system level continues to exist and user level was not created.
670 EXPECT_TRUE(file_util::PathExists(system_level_shortcut_path));
671 EXPECT_FALSE(file_util::PathExists(
672 GetDefaultShortcutPathForProfile(string16())));
673 }
674
675 TEST_F(ProfileShortcutManagerTest,
676 DeleteSecondToLastProfileWithoutShortcutWhenSystemLevelShortcutExists) {
677 SetupAndCreateTwoShortcuts(FROM_HERE);
678
679 const FilePath profile_1_shortcut_path =
680 GetDefaultShortcutPathForProfile(profile_1_name_);
681 const FilePath profile_2_shortcut_path =
682 GetDefaultShortcutPathForProfile(profile_2_name_);
683
684 // Delete the shortcut for the first profile, but keep the one for the 2nd.
gab 2013/01/14 21:49:30 Why is it necessary to delete shortcut 1 first? I
Alexei Svitkine (slow) 2013/01/14 22:40:24 These two tests are based on the existing tests De
gab 2013/01/14 22:49:55 Right that sgtm.
685 ASSERT_TRUE(file_util::Delete(profile_1_shortcut_path, false));
686 ASSERT_FALSE(file_util::PathExists(profile_1_shortcut_path));
687 ASSERT_TRUE(file_util::PathExists(profile_2_shortcut_path));
688
689 const FilePath system_level_shortcut_path =
690 CreateRegularSystemLevelShortcut(FROM_HERE);
691
692 // Delete the profile that doesn't have a shortcut.
693 profile_info_cache_->DeleteProfileFromCache(profile_1_path_);
694 RunPendingTasks();
695
696 // Verify that only the system level shortcut still exists.
697 EXPECT_TRUE(file_util::PathExists(system_level_shortcut_path));
698 EXPECT_FALSE(file_util::PathExists(
699 GetDefaultShortcutPathForProfile(string16())));
700 EXPECT_FALSE(file_util::PathExists(profile_1_shortcut_path));
701 EXPECT_FALSE(file_util::PathExists(profile_2_shortcut_path));
702 }
703
704 TEST_F(ProfileShortcutManagerTest,
705 DeleteSecondToLastProfileWithShortcutWhenSystemShortcutLevelExists) {
706 SetupAndCreateTwoShortcuts(FROM_HERE);
707
708 const FilePath profile_1_shortcut_path =
709 GetDefaultShortcutPathForProfile(profile_1_name_);
710 const FilePath profile_2_shortcut_path =
711 GetDefaultShortcutPathForProfile(profile_2_name_);
712
713 // Delete the shortcut for the first profile, but keep the one for the 2nd.
714 ASSERT_TRUE(file_util::Delete(profile_1_shortcut_path, false));
gab 2013/01/14 21:49:30 Same comment about why deleting shortcut 1? It pro
715 ASSERT_FALSE(file_util::PathExists(profile_1_shortcut_path));
716 ASSERT_TRUE(file_util::PathExists(profile_2_shortcut_path));
717
718 const FilePath system_level_shortcut_path =
719 CreateRegularSystemLevelShortcut(FROM_HERE);
720
721 // Delete the profile that has a shortcut.
722 profile_info_cache_->DeleteProfileFromCache(profile_2_path_);
723 RunPendingTasks();
724
725 // Verify that only the system level shortcut still exists.
726 EXPECT_TRUE(file_util::PathExists(system_level_shortcut_path));
727 EXPECT_FALSE(file_util::PathExists(
728 GetDefaultShortcutPathForProfile(string16())));
729 EXPECT_FALSE(file_util::PathExists(profile_1_shortcut_path));
730 EXPECT_FALSE(file_util::PathExists(profile_2_shortcut_path));
731 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698