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