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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <objbase.h> // For CoInitialize(). 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base_paths.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_shortcut_win.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/shortcut.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_shortcut_manager.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_shortcut_manager_win.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/shell_integration.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/browser_distribution.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/installer/util/product.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/shell_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileShortcutManagerTest : public testing::Test { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileShortcutManagerTest() 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui_thread_(BrowserThread::UI, &message_loop_), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_(NULL), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_user_desktop_(base::DIR_USER_DESKTOP), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_system_desktop_(base::DIR_COMMON_DESKTOP) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CoInitialize(NULL); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingBrowserProcess* browser_process = 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.reset(new TestingProfileManager(browser_process)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile_manager_->SetUp()); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_ = profile_manager_->profile_info_cache(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_.reset( 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileShortcutManager::Create(profile_manager_->profile_manager())); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_1_name_ = L"My profile"; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_1_path_ = CreateProfileDirectory(profile_1_name_); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_name_ = L"My profile 2"; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_ = CreateProfileDirectory(profile_2_name_); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_3_name_ = L"My profile 3"; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_3_path_ = CreateProfileDirectory(profile_3_name_); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete all profiles and ensure their shortcuts got removed. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int num_profiles = profile_info_cache_->GetNumberOfProfiles(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_profiles; ++i) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_path = 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetPathOfProfileAtIndex(0); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 profile_name = profile_info_cache_->GetNameOfProfileAtIndex(0); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_path); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_name)); 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // The icon file is not deleted until the profile directory is deleted. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath icon_path = 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_path); 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(base::PathExists(icon_path)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath CreateProfileDirectory(const string16& profile_name) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_path = 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetUserDataDir().Append(profile_name); 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch file_util::CreateDirectory(profile_path); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile_path; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RunPendingTasks() { 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetupDefaultProfileShortcut(const tracked_objects::Location& location) { 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(0, profile_info_cache_->GetNumberOfProfiles()) 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) << location.ToString(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_1_name_)) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << location.ToString(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->AddProfileToCache(profile_1_path_, profile_1_name_, 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16(), 0, std::string()); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Also create a non-badged shortcut for Chrome, which is conveniently done 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // by |CreateProfileShortcut()| since there is only one profile. 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_shortcut_manager_->CreateProfileShortcut(profile_1_path_); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Verify that there's now a shortcut with no profile information. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcut(location); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetupAndCreateTwoShortcuts(const tracked_objects::Location& location) { 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetupDefaultProfileShortcut(location); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(location, profile_2_name_, profile_2_path_); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(location, profile_1_name_, profile_1_path_); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the default shortcut path for this profile. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetDefaultShortcutPathForProfile( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& profile_name) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetUserShortcutsDirectory().Append( 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::GetShortcutFilenameForProfile(profile_name, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution())); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the shortcut for this profile exists. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ProfileShortcutExistsAtDefaultPath(const string16& profile_name) { 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::PathExists( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_name)); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls base::win::ValidateShortcut() with expected properties for the 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shortcut at |shortcut_path| for the profile at |profile_path|. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ValidateProfileShortcutAtPath(const tracked_objects::Location& location, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& shortcut_path, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_path) { 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(shortcut_path)) << location.ToString(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that the corresponding icon exists. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath icon_path = 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_path); 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(icon_path)) << location.ToString(); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::win::ShortcutProperties expected_properties; 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) expected_properties.set_app_id( 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShellIntegration::GetChromiumModelIdForProfile(profile_path)); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_target(GetExePath()); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_description(GetDistribution()->GetAppDescription()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_dual_mode(false); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_arguments( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::CreateProfileShortcutFlags(profile_path)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_icon(icon_path, 0); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::win::ValidateShortcut(shortcut_path, expected_properties); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls base::win::ValidateShortcut() with expected properties for 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |profile_name|'s shortcut. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ValidateProfileShortcut(const tracked_objects::Location& location, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& profile_name, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_path) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location, GetDefaultShortcutPathForProfile(profile_name), profile_path); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ValidateNonProfileShortcutAtPath( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& location, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& shortcut_path) { 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(shortcut_path)) << location.ToString(); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::win::ShortcutProperties expected_properties; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_target(GetExePath()); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_arguments(string16()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_icon(GetExePath(), 0); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_description(GetDistribution()->GetAppDescription()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_properties.set_dual_mode(false); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::win::ValidateShortcut(shortcut_path, expected_properties); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ValidateNonProfileShortcut(const tracked_objects::Location& location) { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath shortcut_path = 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(string16()); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcutAtPath(location, shortcut_path); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateProfileWithShortcut(const tracked_objects::Location& location, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& profile_name, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_path) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_name)) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << location.ToString(); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->AddProfileToCache(profile_path, profile_name, 1882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16(), 0, std::string()); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->CreateProfileShortcut(profile_path); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(location, profile_name, profile_path); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a regular (non-profile) desktop shortcut with the given name and 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returns its path. Fails the test if an error occurs. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath CreateRegularShortcutWithName( 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& location, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& shortcut_name) { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath shortcut_path = 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(shortcut_name + installer::kLnkExt); 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(shortcut_path)) << location.ToString(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installer::Product product(GetDistribution()); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::ShortcutProperties properties(ShellUtil::CURRENT_USER); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) product.AddDefaultShortcutProperties(GetExePath(), &properties); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.set_shortcut_name(shortcut_name); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ShellUtil::CreateOrUpdateShortcut( 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::SHORTCUT_LOCATION_DESKTOP, GetDistribution(), properties, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)) << location.ToString(); 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(shortcut_path)) << location.ToString(); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shortcut_path; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath CreateRegularSystemLevelShortcut( 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& location) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution* distribution = GetDistribution(); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) installer::Product product(distribution); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::ShortcutProperties properties(ShellUtil::SYSTEM_LEVEL); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) product.AddDefaultShortcutProperties(GetExePath(), &properties); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ShellUtil::CreateOrUpdateShortcut( 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::SHORTCUT_LOCATION_DESKTOP, distribution, properties, 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)) << location.ToString(); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath system_level_shortcut_path = 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSystemShortcutsDirectory().Append( 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) distribution->GetAppShortCutName() + installer::kLnkExt); 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(system_level_shortcut_path)) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << location.ToString(); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_level_shortcut_path; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RenameProfile(const tracked_objects::Location& location, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_path, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& new_profile_name) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t profile_index = 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetIndexOfProfileWithPath(profile_2_path_); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(std::string::npos, profile_index); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(profile_info_cache_->GetNameOfProfileAtIndex(profile_index), 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_profile_name); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->SetNameOfProfileAtIndex(profile_index, 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_profile_name); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution* GetDistribution() { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return BrowserDistribution::GetDistribution(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetExePath() { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath exe_path; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(PathService::Get(base::FILE_EXE, &exe_path)); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return exe_path; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetUserShortcutsDirectory() { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_shortcuts_directory; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution(), 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::CURRENT_USER, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &user_shortcuts_directory)); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_shortcuts_directory; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetSystemShortcutsDirectory() { 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath system_shortcuts_directory; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution(), 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellUtil::SYSTEM_LEVEL, 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &system_shortcuts_directory)); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_shortcuts_directory; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfileManager> profile_manager_; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ProfileShortcutManager> profile_shortcut_manager_; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileInfoCache* profile_info_cache_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ScopedPathOverride fake_user_desktop_; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedPathOverride fake_system_desktop_; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 profile_1_name_; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_1_path_; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 profile_2_name_; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_2_path_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 profile_3_name_; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_3_path_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, ShortcutFilename) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 kProfileName = L"Harry"; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution* distribution = GetDistribution(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 expected_name = kProfileName + L" - " + 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME) + installer::kLnkExt; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_name, 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::GetShortcutFilenameForProfile(kProfileName, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) distribution)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, ShortcutLongFilenameIsTrimmed) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 kLongProfileName = L"Harry Harry Harry Harry Harry Harry Harry" 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"Harry Harry Harry Harry Harry Harry Harry Harry Harry Harry Harry" 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"Harry Harry Harry Harry Harry Harry Harry Harry Harry Harry Harry"; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 file_name = 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::GetShortcutFilenameForProfile(kLongProfileName, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LT(file_name.size(), kLongProfileName.size()); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, ShortcutFilenameStripsReservedCharacters) { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 kProfileName = L"<Harry/>"; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 kSanitizedProfileName = L"Harry"; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution* distribution = GetDistribution(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 expected_name = kSanitizedProfileName + L" - " + 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) distribution->GetAppShortCutName() + installer::kLnkExt; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_name, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::GetShortcutFilenameForProfile(kProfileName, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) distribution)); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, UnbadgedShortcutFilename) { 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserDistribution* distribution = GetDistribution(); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(distribution->GetAppShortCutName() + installer::kLnkExt, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::GetShortcutFilenameForProfile(string16(), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) distribution)); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, ShortcutFlags) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 kProfileName = L"MyProfileX"; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_path = 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetUserDataDir().Append(kProfileName); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(L"--profile-directory=\"" + kProfileName + L"\"", 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profiles::internal::CreateProfileShortcutFlags(profile_path)); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DesktopShortcutsCreate) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDefaultProfileShortcut(FROM_HERE); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Validation is done by |ValidateProfileShortcutAtPath()| which is called 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by |CreateProfileWithShortcut()|. 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DesktopShortcutsUpdate) { 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDefaultProfileShortcut(FROM_HERE); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cause an update in ProfileShortcutManager by modifying the profile info 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cache. 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 new_profile_2_name = L"New Profile Name"; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenameProfile(FROM_HERE, profile_2_path_, new_profile_2_name); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, new_profile_2_name, profile_2_path_); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, CreateSecondProfileBadgesFirstShortcut) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDefaultProfileShortcut(FROM_HERE); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assert that a shortcut without a profile name exists. 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ProfileShortcutExistsAtDefaultPath(string16())); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a second profile without a shortcut. 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->AddProfileToCache(profile_2_path_, profile_2_name_, 3612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16(), 0, std::string()); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that the second profile doesn't have a shortcut and that the first 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // profile's shortcut got renamed and badged. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(string16())); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_1_name_, profile_1_path_); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DesktopShortcutsDeleteSecondToLast) { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete one shortcut. 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the profile name has been removed from the remaining shortcut. 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcut(FROM_HERE); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that an additional shortcut, with the default profile's name does 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not exist. 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_1_name_)); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DeleteSecondToLastProfileWithoutShortcut) { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path = 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path = 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut for the first profile, but keep the one for the 2nd. 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_1_shortcut_path, false)); 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); 3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(profile_2_shortcut_path)); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the profile that doesn't have a shortcut. 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_1_path_); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the remaining shortcut does not have a profile name. 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcut(FROM_HERE); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that shortcuts with profile names do not exist. 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_1_shortcut_path)); 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path)); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DeleteSecondToLastProfileWithShortcut) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path = 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path = 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut for the first profile, but keep the one for the 2nd. 4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_1_shortcut_path, false)); 4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); 4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(profile_2_shortcut_path)); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the profile that has a shortcut. 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the remaining shortcut does not have a profile name. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcut(FROM_HERE); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that shortcuts with profile names do not exist. 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_1_shortcut_path)); 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path)); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DeleteOnlyProfileWithShortcuts) { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_3_name_, profile_3_path_); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath non_profile_shortcut_path = 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(string16()); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path = 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path = 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_3_shortcut_path = 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_3_name_); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete shortcuts for the first two profiles. 4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_1_shortcut_path, false)); 4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_2_shortcut_path, false)); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only the shortcut to the third profile should exist. 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); 4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_2_shortcut_path)); 4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(non_profile_shortcut_path)); 4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(profile_3_shortcut_path)); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the third profile and check that its shortcut is gone and no 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shortcuts have been re-created. 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_3_path_); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_2_shortcut_path)); 4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_3_shortcut_path)); 4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(non_profile_shortcut_path)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileShortcutManagerTest, DesktopShortcutsCreateSecond) { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete one shortcut. 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that a default shortcut exists (no profile name/avatar). 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcut(FROM_HERE); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that an additional shortcut, with the first profile's name does 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not exist. 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_1_name_)); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a second profile and shortcut. 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the original shortcut received the profile's name. 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_1_name_, profile_1_path_); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that a default shortcut no longer exists. 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(string16())); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, RenamedDesktopShortcuts) { 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_1 = 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_2 = 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"MyChrome.lnk"); 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(base::Move(profile_2_shortcut_path_1, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_shortcut_path_2)); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that a new shortcut does not get made if the old one was renamed. 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->CreateProfileShortcut(profile_2_path_); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the renamed shortcut and try to create it again, which should work. 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_2_shortcut_path_2, false)); 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_2)); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->CreateProfileShortcut(profile_2_path_); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, RenamedDesktopShortcutsGetDeleted) { 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_1 = 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_2 = 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"MyChrome.lnk"); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make a copy of the shortcut. 5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(profile_2_shortcut_path_1, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_shortcut_path_2)); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_1, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also, copy the shortcut for the first user and ensure it gets preserved. 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath preserved_profile_1_shortcut_path = 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"Preserved.lnk"); 5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile( 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_), 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preserved_profile_1_shortcut_path)); 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(preserved_profile_1_shortcut_path)); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the profile and ensure both shortcuts were also deleted. 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_1)); 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_2)); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateNonProfileShortcutAtPath(FROM_HERE, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preserved_profile_1_shortcut_path); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, RenamedDesktopShortcutsAfterProfileRename) { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_1 = 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_2 = 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"MyChrome.lnk"); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make a copy of the shortcut. 5547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(profile_2_shortcut_path_1, 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_shortcut_path_2)); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_1, 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now, rename the profile. 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 new_profile_2_name = L"New profile"; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenameProfile(FROM_HERE, profile_2_path_, new_profile_2_name); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The original shortcut should be renamed but the copied shortcut should 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keep its name. 5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path_1)); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, new_profile_2_name, profile_2_path_); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, UpdateShortcutWithNoFlags) { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDefaultProfileShortcut(FROM_HERE); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut that got created for this profile and instead make 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a new one without any command-line flags. 5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(GetDefaultShortcutPathForProfile(string16()), 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath regular_shortcut_path = 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularShortcutWithName(FROM_HERE, 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution()->GetAppShortCutName()); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add another profile and check that the shortcut was replaced with 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a badged shortcut with the right command line for the profile 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 5877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(regular_shortcut_path)); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_1_name_, profile_1_path_); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, UpdateTwoShortcutsWithNoFlags) { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDefaultProfileShortcut(FROM_HERE); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut that got created for this profile and instead make 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // two new ones without any command-line flags. 5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(GetDefaultShortcutPathForProfile(string16()), 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false)); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath regular_shortcut_path = 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularShortcutWithName(FROM_HERE, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDistribution()->GetAppShortCutName()); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath customized_regular_shortcut_path = 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularShortcutWithName(FROM_HERE, L"MyChrome"); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add another profile and check that one shortcut was renamed and that the 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // other shortcut was updated but kept the same name. 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 6077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(regular_shortcut_path)); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, customized_regular_shortcut_path, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_1_path_); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_1_name_, profile_1_path_); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, RemoveProfileShortcuts) { 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_3_name_, profile_3_path_); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path_1 = 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_1 = 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make copies of the shortcuts for both profiles. 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path_2 = 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"Copied1.lnk"); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path_2 = 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUserShortcutsDirectory().Append(L"Copied2.lnk"); 6277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(profile_1_shortcut_path_1, 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_1_shortcut_path_2)); 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(profile_2_shortcut_path_1, 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_shortcut_path_2)); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_1_shortcut_path_2, 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_1_path_); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete shortcuts for profile 1 and ensure that they got deleted while the 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shortcuts for profile 2 were kept. 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->RemoveProfileShortcuts(profile_1_path_); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_1_shortcut_path_1)); 6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_1_shortcut_path_2)); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_1, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcutAtPath(FROM_HERE, profile_2_shortcut_path_2, 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_2_path_); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, HasProfileShortcuts) { 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct HasShortcutsResult { 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_shortcuts; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_has_shortcuts(bool value) { has_shortcuts = value; } 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } result = { false }; 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool)> callback = 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HasShortcutsResult::set_has_shortcuts, 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&result)); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Profile 2 should have a shortcut initially. 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result.has_shortcuts); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut and check that the function returns false. 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path = 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 6687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_2_shortcut_path, false)); 6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path)); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_shortcut_manager_->HasProfileShortcuts(profile_2_path_, callback); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result.has_shortcuts); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, ProfileShortcutsWithSystemLevelShortcut) { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath system_level_shortcut_path = 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularSystemLevelShortcut(FROM_HERE); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the initial profile. 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->AddProfileToCache(profile_1_path_, profile_1_name_, 6812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16(), 0, std::string()); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1U, profile_info_cache_->GetNumberOfProfiles()); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure system-level continues to exist and user-level was not created. 6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); 6877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists( 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(string16()))); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create another profile with a shortcut and ensure both profiles receive 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // user-level profile shortcuts and the system-level one still exists. 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_1_name_, profile_1_path_); 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 6957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a third profile without a shortcut and ensure it doesn't get one. 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->AddProfileToCache(profile_3_path_, profile_3_name_, 6992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16(), 0, std::string()); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that changing the avatar icon and the name does not result in a 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shortcut being created. 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->SetAvatarIconOfProfileAtIndex( 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetIndexOfProfileWithPath(profile_3_path_), 3); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 new_profile_3_name = L"New Name 3"; 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->SetNameOfProfileAtIndex( 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetIndexOfProfileWithPath(profile_3_path_), 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_profile_3_name); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_3_name_)); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(new_profile_3_name)); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rename the second profile and ensure its shortcut got renamed. 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16 new_profile_2_name = L"New Name 2"; 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->SetNameOfProfileAtIndex( 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->GetIndexOfProfileWithPath(profile_2_path_), 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_profile_2_name); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateProfileShortcut(FROM_HERE, new_profile_2_name, profile_2_path_); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeleteSecondToLastProfileWithSystemLevelShortcut) { 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath system_level_shortcut_path = 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularSystemLevelShortcut(FROM_HERE); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete a profile and verify that only the system-level shortcut still 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exists. 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_1_path_); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(string16())); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_1_name_)); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ProfileShortcutExistsAtDefaultPath(profile_2_name_)); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileShortcutManagerTest, 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeleteSecondToLastProfileWithShortcutWhenSystemLevelShortcutExists) { 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupAndCreateTwoShortcuts(FROM_HERE); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_1_shortcut_path = 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_1_name_); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_2_shortcut_path = 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(profile_2_name_); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the shortcut for the first profile, but keep the one for the 2nd. 7567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(profile_1_shortcut_path, false)); 7577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(profile_1_shortcut_path)); 7587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(profile_2_shortcut_path)); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath system_level_shortcut_path = 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRegularSystemLevelShortcut(FROM_HERE); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the profile that has a shortcut, which will exercise the non-profile 764ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // shortcut creation path in |DeleteDesktopShortcuts()|, which is 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not covered by the |DeleteSecondToLastProfileWithSystemLevelShortcut| test. 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingTasks(); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that only the system-level shortcut still exists. 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(system_level_shortcut_path)); 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists( 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultShortcutPathForProfile(string16()))); 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_1_shortcut_path)); 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(profile_2_shortcut_path)); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 777ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ProfileShortcutManagerTest, CreateProfileIcon) { 778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetupDefaultProfileShortcut(FROM_HERE); 779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath icon_path = 781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_1_path_); 782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(base::PathExists(icon_path)); 784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(base::DeleteFile(icon_path, false)); 785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_FALSE(base::PathExists(icon_path)); 786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 787ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_shortcut_manager_->CreateOrUpdateProfileIcon(profile_1_path_, 788ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Closure()); 789ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunPendingTasks(); 790ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(base::PathExists(icon_path)); 791ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 793ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ProfileShortcutManagerTest, UnbadgeProfileIconOnDeletion) { 794ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetupDefaultProfileShortcut(FROM_HERE); 795ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath icon_path_1 = 796ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_1_path_); 797ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath icon_path_2 = 798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_2_path_); 799ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 800ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Default profile has unbadged icon to start. 801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string unbadged_icon_1; 802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &unbadged_icon_1)); 803ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 804ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Creating a new profile adds a badge to both the new profile icon and the 805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // default profile icon. Since they use the same icon index, the icon files 806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // should be the same. 807ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CreateProfileWithShortcut(FROM_HERE, profile_2_name_, profile_2_path_); 808ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 809ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string badged_icon_1; 810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &badged_icon_1)); 811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string badged_icon_2; 812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_2, &badged_icon_2)); 813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 814ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_NE(badged_icon_1, unbadged_icon_1); 815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(badged_icon_1, badged_icon_2); 816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Deleting the default profile will unbadge the new profile's icon and should 818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // result in an icon that is identical to the unbadged default profile icon. 819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_info_cache_->DeleteProfileFromCache(profile_1_path_); 820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunPendingTasks(); 821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string unbadged_icon_2; 823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_2, &unbadged_icon_2)); 824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(unbadged_icon_1, unbadged_icon_2); 825ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 826ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ProfileShortcutManagerTest, ProfileIconOnAvatarChange) { 828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetupAndCreateTwoShortcuts(FROM_HERE); 829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath icon_path_1 = 830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_1_path_); 831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath icon_path_2 = 832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profiles::internal::GetProfileIconPath(profile_2_path_); 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const size_t profile_index_1 = 834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_info_cache_->GetIndexOfProfileWithPath(profile_1_path_); 835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string badged_icon_1; 837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &badged_icon_1)); 838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string badged_icon_2; 839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_2, &badged_icon_2)); 840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Profile 1 and 2 are created with the same icon. 842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(badged_icon_1, badged_icon_2); 843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Change profile 1's icon. 845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_info_cache_->SetAvatarIconOfProfileAtIndex(profile_index_1, 1); 846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunPendingTasks(); 847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string new_badged_icon_1; 849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &new_badged_icon_1)); 850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_NE(new_badged_icon_1, badged_icon_1); 851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Ensure the new icon is not the unbadged icon. 853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_info_cache_->DeleteProfileFromCache(profile_2_path_); 854ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunPendingTasks(); 855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string unbadged_icon_1; 857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &unbadged_icon_1)); 858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_NE(unbadged_icon_1, new_badged_icon_1); 859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Ensure the icon doesn't change on avatar change without 2 profiles. 861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch profile_info_cache_->SetAvatarIconOfProfileAtIndex(profile_index_1, 1); 862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunPendingTasks(); 863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string unbadged_icon_1_a; 865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(file_util::ReadFileToString(icon_path_1, &unbadged_icon_1_a)); 866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(unbadged_icon_1, unbadged_icon_1_a); 867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 868