Home | History | Annotate | Download | only in profiles
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "base/command_line.h"
      8 #include "base/files/file_util.h"
      9 #include "base/files/scoped_temp_dir.h"
     10 #include "base/path_service.h"
     11 #include "base/run_loop.h"
     12 #include "base/strings/utf_string_conversions.h"
     13 #include "base/values.h"
     14 #include "build/build_config.h"
     15 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
     16 #include "chrome/browser/browser_process.h"
     17 #include "chrome/browser/chrome_notification_types.h"
     18 #include "chrome/browser/chromeos/settings/cros_settings.h"
     19 #include "chrome/browser/history/history_service.h"
     20 #include "chrome/browser/history/history_service_factory.h"
     21 #include "chrome/browser/io_thread.h"
     22 #include "chrome/browser/prefs/browser_prefs.h"
     23 #include "chrome/browser/prefs/incognito_mode_prefs.h"
     24 #include "chrome/browser/profiles/profile.h"
     25 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
     26 #include "chrome/browser/profiles/profile_info_cache.h"
     27 #include "chrome/browser/profiles/profile_manager.h"
     28 #include "chrome/browser/profiles/profiles_state.h"
     29 #include "chrome/browser/ui/browser.h"
     30 #include "chrome/common/chrome_constants.h"
     31 #include "chrome/common/chrome_paths.h"
     32 #include "chrome/common/chrome_switches.h"
     33 #include "chrome/common/pref_names.h"
     34 #include "chrome/grit/generated_resources.h"
     35 #include "chrome/test/base/scoped_testing_local_state.h"
     36 #include "chrome/test/base/test_browser_window.h"
     37 #include "chrome/test/base/testing_browser_process.h"
     38 #include "chrome/test/base/testing_profile.h"
     39 #include "components/signin/core/common/profile_management_switches.h"
     40 #include "content/public/browser/notification_service.h"
     41 #include "content/public/common/content_switches.h"
     42 #include "content/public/test/test_browser_thread_bundle.h"
     43 #include "testing/gmock/include/gmock/gmock.h"
     44 #include "testing/gtest/include/gtest/gtest.h"
     45 #include "ui/base/l10n/l10n_util.h"
     46 
     47 #if defined(OS_CHROMEOS)
     48 #include "chrome/browser/chromeos/login/users/fake_user_manager.h"
     49 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
     50 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
     51 #include "chrome/browser/chromeos/profiles/profile_helper.h"
     52 #include "chrome/browser/chromeos/settings/cros_settings.h"
     53 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     54 #include "chromeos/chromeos_switches.h"
     55 #include "chromeos/login/user_names.h"
     56 #include "components/user_manager/user_manager.h"
     57 #endif  // defined(OS_CHROMEOS)
     58 
     59 using base::ASCIIToUTF16;
     60 using content::BrowserThread;
     61 
     62 namespace {
     63 
     64 // This global variable is used to check that value returned to different
     65 // observers is the same.
     66 Profile* g_created_profile;
     67 
     68 class UnittestProfileManager : public ::ProfileManagerWithoutInit {
     69  public:
     70   explicit UnittestProfileManager(const base::FilePath& user_data_dir)
     71       : ::ProfileManagerWithoutInit(user_data_dir) {}
     72 
     73  protected:
     74   virtual Profile* CreateProfileHelper(
     75       const base::FilePath& file_path) OVERRIDE {
     76     if (!base::PathExists(file_path)) {
     77       if (!base::CreateDirectory(file_path))
     78         return NULL;
     79     }
     80     return new TestingProfile(file_path, NULL);
     81   }
     82 
     83   virtual Profile* CreateProfileAsyncHelper(const base::FilePath& path,
     84                                             Delegate* delegate) OVERRIDE {
     85     // This is safe while all file operations are done on the FILE thread.
     86     BrowserThread::PostTask(
     87         BrowserThread::FILE, FROM_HERE,
     88         base::Bind(base::IgnoreResult(&base::CreateDirectory), path));
     89 
     90     return new TestingProfile(path, this);
     91   }
     92 };
     93 
     94 }  // namespace
     95 
     96 class ProfileManagerTest : public testing::Test {
     97  protected:
     98   class MockObserver {
     99    public:
    100     MOCK_METHOD2(OnProfileCreated,
    101         void(Profile* profile, Profile::CreateStatus status));
    102   };
    103 
    104   ProfileManagerTest()
    105       : local_state_(TestingBrowserProcess::GetGlobal()) {
    106   }
    107 
    108   virtual void SetUp() {
    109     // Create a new temporary directory, and store the path
    110     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    111     TestingBrowserProcess::GetGlobal()->SetProfileManager(
    112         new UnittestProfileManager(temp_dir_.path()));
    113 
    114 #if defined(OS_CHROMEOS)
    115     CommandLine* cl = CommandLine::ForCurrentProcess();
    116     cl->AppendSwitch(switches::kTestType);
    117 #endif
    118   }
    119 
    120   virtual void TearDown() {
    121     TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
    122     base::RunLoop().RunUntilIdle();
    123   }
    124 
    125   // Helper function to create a profile with |name| for a profile |manager|.
    126   void CreateProfileAsync(ProfileManager* manager,
    127                           const std::string& name,
    128                           bool is_supervised,
    129                           MockObserver* mock_observer) {
    130     manager->CreateProfileAsync(
    131         temp_dir_.path().AppendASCII(name),
    132         base::Bind(&MockObserver::OnProfileCreated,
    133                    base::Unretained(mock_observer)),
    134         base::UTF8ToUTF16(name),
    135         base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(0)),
    136         is_supervised ? "Dummy ID" : std::string());
    137   }
    138 
    139   // Helper function to add a profile with |profile_name| to
    140   // |profile_manager|'s ProfileInfoCache, and return the profile created.
    141   Profile* AddProfileToCache(ProfileManager* profile_manager,
    142                              const std::string& path_suffix,
    143                              const base::string16& profile_name) {
    144     ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    145     size_t num_profiles = cache.GetNumberOfProfiles();
    146     base::FilePath path = temp_dir_.path().AppendASCII(path_suffix);
    147     cache.AddProfileToCache(path, profile_name,
    148                             base::string16(), 0, std::string());
    149     EXPECT_EQ(num_profiles + 1, cache.GetNumberOfProfiles());
    150     return profile_manager->GetProfile(path);
    151   }
    152 
    153 #if defined(OS_CHROMEOS)
    154   // Helper function to register an user with id |user_id| and create profile
    155   // with a correct path.
    156   void RegisterUser(const std::string& user_id) {
    157     chromeos::ProfileHelper* profile_helper = chromeos::ProfileHelper::Get();
    158     const std::string user_id_hash =
    159         profile_helper->GetUserIdHashByUserIdForTesting(user_id);
    160     user_manager::UserManager::Get()->UserLoggedIn(
    161         user_id, user_id_hash, false);
    162     g_browser_process->profile_manager()->GetProfile(
    163         profile_helper->GetProfilePathByUserIdHash(user_id_hash));
    164   }
    165 
    166   chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
    167   chromeos::ScopedTestCrosSettings test_cros_settings_;
    168 #endif
    169 
    170   // The path to temporary directory used to contain the test operations.
    171   base::ScopedTempDir temp_dir_;
    172   ScopedTestingLocalState local_state_;
    173 
    174   content::TestBrowserThreadBundle thread_bundle_;
    175 
    176 #if defined(OS_CHROMEOS)
    177   chromeos::ScopedTestUserManager test_user_manager_;
    178 #endif
    179 
    180   DISALLOW_COPY_AND_ASSIGN(ProfileManagerTest);
    181 };
    182 
    183 TEST_F(ProfileManagerTest, GetProfile) {
    184   base::FilePath dest_path = temp_dir_.path();
    185   dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
    186 
    187   ProfileManager* profile_manager = g_browser_process->profile_manager();
    188 
    189   // Successfully create a profile.
    190   Profile* profile = profile_manager->GetProfile(dest_path);
    191   EXPECT_TRUE(profile);
    192 
    193   // The profile already exists when we call GetProfile. Just load it.
    194   EXPECT_EQ(profile, profile_manager->GetProfile(dest_path));
    195 }
    196 
    197 TEST_F(ProfileManagerTest, DefaultProfileDir) {
    198   base::FilePath expected_default =
    199       base::FilePath().AppendASCII(chrome::kInitialProfile);
    200   EXPECT_EQ(
    201       expected_default.value(),
    202       g_browser_process->profile_manager()->GetInitialProfileDir().value());
    203 }
    204 
    205 MATCHER(NotFail, "Profile creation failure status is not reported.") {
    206   return arg == Profile::CREATE_STATUS_CREATED ||
    207          arg == Profile::CREATE_STATUS_INITIALIZED;
    208 }
    209 
    210 MATCHER(SameNotNull, "The same non-NULL value for all calls.") {
    211   if (!g_created_profile)
    212     g_created_profile = arg;
    213   return arg != NULL && arg == g_created_profile;
    214 }
    215 
    216 #if defined(OS_CHROMEOS)
    217 
    218 // This functionality only exists on Chrome OS.
    219 TEST_F(ProfileManagerTest, LoggedInProfileDir) {
    220   base::FilePath expected_default =
    221       base::FilePath().AppendASCII(chrome::kInitialProfile);
    222   ProfileManager* profile_manager = g_browser_process->profile_manager();
    223   EXPECT_EQ(expected_default.value(),
    224             profile_manager->GetInitialProfileDir().value());
    225 
    226   const char kTestUserName[] = "test-user (at) example.com";
    227   chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager();
    228   chromeos::ScopedUserManagerEnabler enabler(user_manager);
    229 
    230   const user_manager::User* active_user = user_manager->AddUser(kTestUserName);
    231   user_manager->LoginUser(kTestUserName);
    232   user_manager->SwitchActiveUser(kTestUserName);
    233 
    234   profile_manager->Observe(
    235       chrome::NOTIFICATION_LOGIN_USER_CHANGED,
    236       content::NotificationService::AllSources(),
    237       content::Details<const user_manager::User>(active_user));
    238   base::FilePath expected_logged_in(
    239       chromeos::ProfileHelper::GetUserProfileDir(active_user->username_hash()));
    240   EXPECT_EQ(expected_logged_in.value(),
    241             profile_manager->GetInitialProfileDir().value());
    242   VLOG(1) << temp_dir_.path().Append(
    243       profile_manager->GetInitialProfileDir()).value();
    244 }
    245 
    246 #endif
    247 
    248 TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) {
    249   base::FilePath dest_path1 = temp_dir_.path();
    250   dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
    251 
    252   base::FilePath dest_path2 = temp_dir_.path();
    253   dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
    254 
    255   ProfileManager* profile_manager = g_browser_process->profile_manager();
    256 
    257   // Successfully create the profiles.
    258   TestingProfile* profile1 =
    259       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
    260   ASSERT_TRUE(profile1);
    261 
    262   TestingProfile* profile2 =
    263       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
    264   ASSERT_TRUE(profile2);
    265 
    266   // Force lazy-init of some profile services to simulate use.
    267   ASSERT_TRUE(profile1->CreateHistoryService(true, false));
    268   EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile1,
    269                                                    Profile::EXPLICIT_ACCESS));
    270   profile1->CreateBookmarkModel(true);
    271   EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1));
    272   profile2->CreateBookmarkModel(true);
    273   EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2));
    274   ASSERT_TRUE(profile2->CreateHistoryService(true, false));
    275   EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2,
    276                                                    Profile::EXPLICIT_ACCESS));
    277 
    278   // Make sure any pending tasks run before we destroy the profiles.
    279     base::RunLoop().RunUntilIdle();
    280 
    281   TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
    282 
    283   // Make sure history cleans up correctly.
    284   base::RunLoop().RunUntilIdle();
    285 }
    286 
    287 TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) {
    288   g_created_profile = NULL;
    289 
    290   MockObserver mock_observer1;
    291   EXPECT_CALL(mock_observer1, OnProfileCreated(
    292       SameNotNull(), NotFail())).Times(testing::AtLeast(1));
    293   MockObserver mock_observer2;
    294   EXPECT_CALL(mock_observer2, OnProfileCreated(
    295       SameNotNull(), NotFail())).Times(testing::AtLeast(1));
    296   MockObserver mock_observer3;
    297   EXPECT_CALL(mock_observer3, OnProfileCreated(
    298       SameNotNull(), NotFail())).Times(testing::AtLeast(1));
    299 
    300   ProfileManager* profile_manager = g_browser_process->profile_manager();
    301   const std::string profile_name = "New Profile";
    302   CreateProfileAsync(profile_manager, profile_name, false, &mock_observer1);
    303   CreateProfileAsync(profile_manager, profile_name, false, &mock_observer2);
    304   CreateProfileAsync(profile_manager, profile_name, false, &mock_observer3);
    305 
    306   base::RunLoop().RunUntilIdle();
    307 }
    308 
    309 TEST_F(ProfileManagerTest, CreateProfilesAsync) {
    310   const std::string profile_name1 = "New Profile 1";
    311   const std::string profile_name2 = "New Profile 2";
    312 
    313   MockObserver mock_observer;
    314   EXPECT_CALL(mock_observer, OnProfileCreated(
    315       testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
    316 
    317   ProfileManager* profile_manager = g_browser_process->profile_manager();
    318 
    319   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
    320   CreateProfileAsync(profile_manager, profile_name2, false, &mock_observer);
    321 
    322   base::RunLoop().RunUntilIdle();
    323 }
    324 
    325 TEST_F(ProfileManagerTest, CreateProfileAsyncCheckOmitted) {
    326   std::string name = "0 Supervised Profile";
    327 
    328   MockObserver mock_observer;
    329   EXPECT_CALL(mock_observer, OnProfileCreated(
    330       testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
    331 
    332   ProfileManager* profile_manager = g_browser_process->profile_manager();
    333   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    334   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
    335 
    336   CreateProfileAsync(profile_manager, name, true, &mock_observer);
    337   base::RunLoop().RunUntilIdle();
    338 
    339   EXPECT_EQ(1u, cache.GetNumberOfProfiles());
    340   // Supervised profiles should start out omitted from the profile list.
    341   EXPECT_TRUE(cache.IsOmittedProfileAtIndex(0));
    342 
    343   name = "1 Regular Profile";
    344   CreateProfileAsync(profile_manager, name, false, &mock_observer);
    345   base::RunLoop().RunUntilIdle();
    346 
    347   EXPECT_EQ(2u, cache.GetNumberOfProfiles());
    348   // Non-supervised profiles should be included in the profile list.
    349   EXPECT_FALSE(cache.IsOmittedProfileAtIndex(1));
    350 }
    351 
    352 TEST_F(ProfileManagerTest, AddProfileToCacheCheckOmitted) {
    353   ProfileManager* profile_manager = g_browser_process->profile_manager();
    354   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    355   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
    356 
    357   const base::FilePath supervised_path =
    358       temp_dir_.path().AppendASCII("Supervised");
    359   TestingProfile* supervised_profile =
    360       new TestingProfile(supervised_path, NULL);
    361   supervised_profile->GetPrefs()->SetString(prefs::kSupervisedUserId, "An ID");
    362 
    363   // RegisterTestingProfile adds the profile to the cache and takes ownership.
    364   profile_manager->RegisterTestingProfile(supervised_profile, true, false);
    365   EXPECT_EQ(1u, cache.GetNumberOfProfiles());
    366   EXPECT_TRUE(cache.IsOmittedProfileAtIndex(0));
    367 
    368   const base::FilePath nonsupervised_path = temp_dir_.path().AppendASCII(
    369       "Non-Supervised");
    370   TestingProfile* nonsupervised_profile = new TestingProfile(nonsupervised_path,
    371                                                              NULL);
    372   profile_manager->RegisterTestingProfile(nonsupervised_profile, true, false);
    373 
    374   EXPECT_EQ(2u, cache.GetNumberOfProfiles());
    375   size_t supervised_index = cache.GetIndexOfProfileWithPath(supervised_path);
    376   EXPECT_TRUE(cache.IsOmittedProfileAtIndex(supervised_index));
    377   size_t nonsupervised_index =
    378       cache.GetIndexOfProfileWithPath(nonsupervised_path);
    379   EXPECT_FALSE(cache.IsOmittedProfileAtIndex(nonsupervised_index));
    380 }
    381 
    382 TEST_F(ProfileManagerTest, GetGuestProfilePath) {
    383   base::FilePath guest_path = ProfileManager::GetGuestProfilePath();
    384   base::FilePath expected_path = temp_dir_.path();
    385   expected_path = expected_path.Append(chrome::kGuestProfileDir);
    386   EXPECT_EQ(expected_path, guest_path);
    387 }
    388 
    389 class UnittestGuestProfileManager : public UnittestProfileManager {
    390  public:
    391   explicit UnittestGuestProfileManager(const base::FilePath& user_data_dir)
    392       : UnittestProfileManager(user_data_dir) {}
    393 
    394  protected:
    395   virtual Profile* CreateProfileHelper(
    396       const base::FilePath& file_path) OVERRIDE {
    397     TestingProfile::Builder builder;
    398     builder.SetGuestSession();
    399     builder.SetPath(file_path);
    400     TestingProfile* testing_profile = builder.Build().release();
    401     return testing_profile;
    402   }
    403 };
    404 
    405 class ProfileManagerGuestTest : public ProfileManagerTest  {
    406  protected:
    407   virtual void SetUp() {
    408     // Create a new temporary directory, and store the path
    409     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    410     TestingBrowserProcess::GetGlobal()->SetProfileManager(
    411         new UnittestGuestProfileManager(temp_dir_.path()));
    412 
    413 #if defined(OS_CHROMEOS)
    414     CommandLine* cl = CommandLine::ForCurrentProcess();
    415     // This switch is needed to skip non-test specific behavior in
    416     // ProfileManager (accessing DBusThreadManager).
    417     cl->AppendSwitch(switches::kTestType);
    418 
    419     cl->AppendSwitch(chromeos::switches::kGuestSession);
    420     cl->AppendSwitch(::switches::kIncognito);
    421 
    422     RegisterUser(chromeos::login::kGuestUserName);
    423 #endif
    424   }
    425 };
    426 
    427 TEST_F(ProfileManagerGuestTest, GetLastUsedProfileAllowedByPolicy) {
    428   ProfileManager* profile_manager = g_browser_process->profile_manager();
    429   ASSERT_TRUE(profile_manager);
    430 
    431   Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy();
    432   ASSERT_TRUE(profile);
    433   EXPECT_TRUE(profile->IsOffTheRecord());
    434 }
    435 
    436 #if defined(OS_CHROMEOS)
    437 TEST_F(ProfileManagerGuestTest, GuestProfileIngonito) {
    438   Profile* primary_profile = ProfileManager::GetPrimaryUserProfile();
    439   EXPECT_TRUE(primary_profile->IsOffTheRecord());
    440 
    441   Profile* active_profile = ProfileManager::GetActiveUserProfile();
    442   EXPECT_TRUE(active_profile->IsOffTheRecord());
    443 
    444   EXPECT_TRUE(active_profile->IsSameProfile(primary_profile));
    445 
    446   Profile* last_used_profile = ProfileManager::GetLastUsedProfile();
    447   EXPECT_TRUE(last_used_profile->IsOffTheRecord());
    448 
    449   EXPECT_TRUE(last_used_profile->IsSameProfile(active_profile));
    450 }
    451 #endif
    452 
    453 TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) {
    454   ProfileManager* profile_manager = g_browser_process->profile_manager();
    455   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    456   local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
    457                                   new base::FundamentalValue(true));
    458 
    459   // Setting a pref which is not applicable to a system (i.e., Android in this
    460   // case) does not necessarily create it. Don't bother continuing with the
    461   // test if this pref doesn't exist because it will not load the profiles if
    462   // it cannot verify that the pref for background mode is enabled.
    463   if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled))
    464     return;
    465 
    466   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
    467   cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
    468                           ASCIIToUTF16("name_1"), base::string16(), 0,
    469                           std::string());
    470   cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
    471                           ASCIIToUTF16("name_2"), base::string16(), 0,
    472                           std::string());
    473   cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_3"),
    474                           ASCIIToUTF16("name_3"), base::string16(), 0,
    475                           std::string());
    476   cache.SetBackgroundStatusOfProfileAtIndex(0, true);
    477   cache.SetBackgroundStatusOfProfileAtIndex(2, true);
    478   EXPECT_EQ(3u, cache.GetNumberOfProfiles());
    479 
    480   profile_manager->AutoloadProfiles();
    481 
    482   EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
    483 }
    484 
    485 TEST_F(ProfileManagerTest, DoNotAutoloadProfilesIfBackgroundModeOff) {
    486   ProfileManager* profile_manager = g_browser_process->profile_manager();
    487   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    488   local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
    489                                   new base::FundamentalValue(false));
    490 
    491   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
    492   cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
    493                           ASCIIToUTF16("name_1"), base::string16(), 0,
    494                           std::string());
    495   cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
    496                           ASCIIToUTF16("name_2"), base::string16(), 0,
    497                           std::string());
    498   cache.SetBackgroundStatusOfProfileAtIndex(0, false);
    499   cache.SetBackgroundStatusOfProfileAtIndex(1, true);
    500   EXPECT_EQ(2u, cache.GetNumberOfProfiles());
    501 
    502   profile_manager->AutoloadProfiles();
    503 
    504   EXPECT_EQ(0u, profile_manager->GetLoadedProfiles().size());
    505 }
    506 
    507 TEST_F(ProfileManagerTest, InitProfileUserPrefs) {
    508   base::FilePath dest_path = temp_dir_.path();
    509   dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
    510 
    511   ProfileManager* profile_manager = g_browser_process->profile_manager();
    512 
    513   Profile* profile;
    514 
    515   // Successfully create the profile
    516   profile = profile_manager->GetProfile(dest_path);
    517   ASSERT_TRUE(profile);
    518 
    519   // Check that the profile name is non empty
    520   std::string profile_name =
    521       profile->GetPrefs()->GetString(prefs::kProfileName);
    522   EXPECT_FALSE(profile_name.empty());
    523 
    524   // Check that the profile avatar index is valid
    525   size_t avatar_index =
    526       profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
    527   EXPECT_TRUE(profiles::IsDefaultAvatarIconIndex(
    528       avatar_index));
    529 }
    530 
    531 // Tests that a new profile's entry in the profile info cache is setup with the
    532 // same values that are in the profile prefs.
    533 TEST_F(ProfileManagerTest, InitProfileInfoCacheForAProfile) {
    534   base::FilePath dest_path = temp_dir_.path();
    535   dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
    536 
    537   ProfileManager* profile_manager = g_browser_process->profile_manager();
    538   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
    539 
    540   // Successfully create the profile
    541   Profile* profile = profile_manager->GetProfile(dest_path);
    542   ASSERT_TRUE(profile);
    543 
    544   std::string profile_name =
    545       profile->GetPrefs()->GetString(prefs::kProfileName);
    546   size_t avatar_index =
    547       profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
    548 
    549   size_t profile_index = cache.GetIndexOfProfileWithPath(dest_path);
    550 
    551   // Check if the profile prefs are the same as the cache prefs
    552   EXPECT_EQ(profile_name,
    553             base::UTF16ToUTF8(cache.GetNameOfProfileAtIndex(profile_index)));
    554   EXPECT_EQ(avatar_index,
    555             cache.GetAvatarIconIndexOfProfileAtIndex(profile_index));
    556 }
    557 
    558 TEST_F(ProfileManagerTest, GetLastUsedProfileAllowedByPolicy) {
    559   ProfileManager* profile_manager = g_browser_process->profile_manager();
    560   ASSERT_TRUE(profile_manager);
    561 
    562 #if defined(OS_CHROMEOS)
    563   // On CrOS, profile returned by GetLastUsedProfile is a singin profile that
    564   // is forced to be incognito. That's why we need to create at least one user
    565   // to get a regular profile.
    566   RegisterUser("test-user (at) example.com");
    567 #endif
    568 
    569   Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy();
    570   ASSERT_TRUE(profile);
    571   EXPECT_FALSE(profile->IsOffTheRecord());
    572   PrefService* prefs = profile->GetPrefs();
    573   EXPECT_EQ(IncognitoModePrefs::ENABLED,
    574             IncognitoModePrefs::GetAvailability(prefs));
    575 
    576   ASSERT_TRUE(profile->GetOffTheRecordProfile());
    577 
    578   IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::DISABLED);
    579   EXPECT_FALSE(
    580       profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
    581 
    582   // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when
    583   // incognito mode is forced.
    584   IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED);
    585   EXPECT_TRUE(
    586       profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
    587 }
    588 
    589 #if !defined(OS_ANDROID)
    590 // There's no Browser object on Android.
    591 TEST_F(ProfileManagerTest, LastOpenedProfiles) {
    592   base::FilePath dest_path1 = temp_dir_.path();
    593   dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
    594 
    595   base::FilePath dest_path2 = temp_dir_.path();
    596   dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
    597 
    598   ProfileManager* profile_manager = g_browser_process->profile_manager();
    599 
    600   // Successfully create the profiles.
    601   TestingProfile* profile1 =
    602       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
    603   ASSERT_TRUE(profile1);
    604 
    605   TestingProfile* profile2 =
    606       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
    607   ASSERT_TRUE(profile2);
    608 
    609   std::vector<Profile*> last_opened_profiles =
    610       profile_manager->GetLastOpenedProfiles();
    611   ASSERT_EQ(0U, last_opened_profiles.size());
    612 
    613   // Create a browser for profile1.
    614   Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
    615   scoped_ptr<Browser> browser1a(
    616       chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
    617 
    618   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    619   ASSERT_EQ(1U, last_opened_profiles.size());
    620   EXPECT_EQ(profile1, last_opened_profiles[0]);
    621 
    622   // And for profile2.
    623   Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop());
    624   scoped_ptr<Browser> browser2(
    625       chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
    626 
    627   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    628   ASSERT_EQ(2U, last_opened_profiles.size());
    629   EXPECT_EQ(profile1, last_opened_profiles[0]);
    630   EXPECT_EQ(profile2, last_opened_profiles[1]);
    631 
    632   // Adding more browsers doesn't change anything.
    633   scoped_ptr<Browser> browser1b(
    634       chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
    635   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    636   ASSERT_EQ(2U, last_opened_profiles.size());
    637   EXPECT_EQ(profile1, last_opened_profiles[0]);
    638   EXPECT_EQ(profile2, last_opened_profiles[1]);
    639 
    640   // Close the browsers.
    641   browser1a.reset();
    642   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    643   ASSERT_EQ(2U, last_opened_profiles.size());
    644   EXPECT_EQ(profile1, last_opened_profiles[0]);
    645   EXPECT_EQ(profile2, last_opened_profiles[1]);
    646 
    647   browser1b.reset();
    648   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    649   ASSERT_EQ(1U, last_opened_profiles.size());
    650   EXPECT_EQ(profile2, last_opened_profiles[0]);
    651 
    652   browser2.reset();
    653   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    654   ASSERT_EQ(0U, last_opened_profiles.size());
    655 }
    656 
    657 TEST_F(ProfileManagerTest, LastOpenedProfilesAtShutdown) {
    658   base::FilePath dest_path1 = temp_dir_.path();
    659   dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
    660 
    661   base::FilePath dest_path2 = temp_dir_.path();
    662   dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
    663 
    664   ProfileManager* profile_manager = g_browser_process->profile_manager();
    665 
    666   // Successfully create the profiles.
    667   TestingProfile* profile1 =
    668       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
    669   ASSERT_TRUE(profile1);
    670 
    671   TestingProfile* profile2 =
    672       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
    673   ASSERT_TRUE(profile2);
    674 
    675   // Create a browser for profile1.
    676   Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
    677   scoped_ptr<Browser> browser1(
    678       chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
    679 
    680   // And for profile2.
    681   Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop());
    682   scoped_ptr<Browser> browser2(
    683       chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
    684 
    685   std::vector<Profile*> last_opened_profiles =
    686       profile_manager->GetLastOpenedProfiles();
    687   ASSERT_EQ(2U, last_opened_profiles.size());
    688   EXPECT_EQ(profile1, last_opened_profiles[0]);
    689   EXPECT_EQ(profile2, last_opened_profiles[1]);
    690 
    691   // Simulate a shutdown.
    692   content::NotificationService::current()->Notify(
    693       chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
    694       content::NotificationService::AllSources(),
    695       content::NotificationService::NoDetails());
    696 
    697   // Even if the browsers are destructed during shutdown, the profiles stay
    698   // open.
    699   browser1.reset();
    700   browser2.reset();
    701 
    702   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    703   ASSERT_EQ(2U, last_opened_profiles.size());
    704   EXPECT_EQ(profile1, last_opened_profiles[0]);
    705   EXPECT_EQ(profile2, last_opened_profiles[1]);
    706 }
    707 
    708 TEST_F(ProfileManagerTest, LastOpenedProfilesDoesNotContainIncognito) {
    709   base::FilePath dest_path1 = temp_dir_.path();
    710   dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
    711   base::FilePath dest_path2 = temp_dir_.path();
    712   dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
    713 
    714   ProfileManager* profile_manager = g_browser_process->profile_manager();
    715 
    716   // Successfully create the profiles.
    717   TestingProfile* profile1 =
    718       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
    719   ASSERT_TRUE(profile1);
    720 
    721   std::vector<Profile*> last_opened_profiles =
    722       profile_manager->GetLastOpenedProfiles();
    723   ASSERT_EQ(0U, last_opened_profiles.size());
    724 
    725   // Create a browser for profile1.
    726   Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
    727   scoped_ptr<Browser> browser1(
    728       chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
    729 
    730   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    731   ASSERT_EQ(1U, last_opened_profiles.size());
    732   EXPECT_EQ(profile1, last_opened_profiles[0]);
    733 
    734   // And for profile2.
    735   Browser::CreateParams profile2_params(profile1->GetOffTheRecordProfile(),
    736                                         chrome::GetActiveDesktop());
    737   scoped_ptr<Browser> browser2a(
    738       chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
    739 
    740   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    741   ASSERT_EQ(1U, last_opened_profiles.size());
    742   EXPECT_EQ(profile1, last_opened_profiles[0]);
    743 
    744   // Adding more browsers doesn't change anything.
    745   scoped_ptr<Browser> browser2b(
    746       chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
    747   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    748   ASSERT_EQ(1U, last_opened_profiles.size());
    749   EXPECT_EQ(profile1, last_opened_profiles[0]);
    750 
    751   // Close the browsers.
    752   browser2a.reset();
    753   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    754   ASSERT_EQ(1U, last_opened_profiles.size());
    755   EXPECT_EQ(profile1, last_opened_profiles[0]);
    756 
    757   browser2b.reset();
    758   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    759   ASSERT_EQ(1U, last_opened_profiles.size());
    760   EXPECT_EQ(profile1, last_opened_profiles[0]);
    761 
    762   browser1.reset();
    763   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    764   ASSERT_EQ(0U, last_opened_profiles.size());
    765 }
    766 #endif  // !defined(OS_ANDROID)
    767 
    768 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
    769 // There's no Browser object on Android and there's no multi-profiles on Chrome.
    770 TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastProfile) {
    771   base::FilePath dest_path = temp_dir_.path();
    772   dest_path = dest_path.Append(FILE_PATH_LITERAL("Ephemeral Profile"));
    773 
    774   ProfileManager* profile_manager = g_browser_process->profile_manager();
    775 
    776   TestingProfile* profile =
    777       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path));
    778   ASSERT_TRUE(profile);
    779   profile->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, true);
    780 
    781   // Here the last used profile is still the "Default" profile.
    782   Profile* last_used_profile = profile_manager->GetLastUsedProfile();
    783   EXPECT_NE(profile, last_used_profile);
    784 
    785   // Create a browser for the profile.
    786   Browser::CreateParams profile_params(profile, chrome::GetActiveDesktop());
    787   scoped_ptr<Browser> browser(
    788       chrome::CreateBrowserWithTestWindowForParams(&profile_params));
    789   last_used_profile = profile_manager->GetLastUsedProfile();
    790   EXPECT_NE(profile, last_used_profile);
    791 
    792   // Close the browser.
    793   browser.reset();
    794   last_used_profile = profile_manager->GetLastUsedProfile();
    795   EXPECT_NE(profile, last_used_profile);
    796 }
    797 
    798 TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastOpenedAtShutdown) {
    799   base::FilePath dest_path1 = temp_dir_.path();
    800   dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("Normal Profile"));
    801 
    802   base::FilePath dest_path2 = temp_dir_.path();
    803   dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("Ephemeral Profile 1"));
    804 
    805   base::FilePath dest_path3 = temp_dir_.path();
    806   dest_path3 = dest_path3.Append(FILE_PATH_LITERAL("Ephemeral Profile 2"));
    807 
    808   ProfileManager* profile_manager = g_browser_process->profile_manager();
    809 
    810   // Successfully create the profiles.
    811   TestingProfile* normal_profile =
    812       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
    813   ASSERT_TRUE(normal_profile);
    814 
    815   // Add one ephemeral profile which should not end up in this list.
    816   TestingProfile* ephemeral_profile1 =
    817       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
    818   ASSERT_TRUE(ephemeral_profile1);
    819   ephemeral_profile1->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles,
    820                                              true);
    821 
    822   // Add second ephemeral profile but don't mark it as such yet.
    823   TestingProfile* ephemeral_profile2 =
    824       static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path3));
    825   ASSERT_TRUE(ephemeral_profile2);
    826 
    827   // Create a browser for profile1.
    828   Browser::CreateParams profile1_params(normal_profile,
    829                                         chrome::GetActiveDesktop());
    830   scoped_ptr<Browser> browser1(
    831       chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
    832 
    833   // Create browsers for the ephemeral profile.
    834   Browser::CreateParams profile2_params(ephemeral_profile1,
    835                                         chrome::GetActiveDesktop());
    836   scoped_ptr<Browser> browser2(
    837       chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
    838 
    839   Browser::CreateParams profile3_params(ephemeral_profile2,
    840                                         chrome::GetActiveDesktop());
    841   scoped_ptr<Browser> browser3(
    842       chrome::CreateBrowserWithTestWindowForParams(&profile3_params));
    843 
    844   std::vector<Profile*> last_opened_profiles =
    845       profile_manager->GetLastOpenedProfiles();
    846   ASSERT_EQ(2U, last_opened_profiles.size());
    847   EXPECT_EQ(normal_profile, last_opened_profiles[0]);
    848   EXPECT_EQ(ephemeral_profile2, last_opened_profiles[1]);
    849 
    850   // Mark the second profile ephemeral.
    851   ephemeral_profile2->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles,
    852                                              true);
    853 
    854   // Simulate a shutdown.
    855   content::NotificationService::current()->Notify(
    856       chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
    857       content::NotificationService::AllSources(),
    858       content::NotificationService::NoDetails());
    859   browser1.reset();
    860   browser2.reset();
    861   browser3.reset();
    862 
    863   last_opened_profiles = profile_manager->GetLastOpenedProfiles();
    864   ASSERT_EQ(1U, last_opened_profiles.size());
    865   EXPECT_EQ(normal_profile, last_opened_profiles[0]);
    866 }
    867 
    868 TEST_F(ProfileManagerTest, ActiveProfileDeleted) {
    869   ProfileManager* profile_manager = g_browser_process->profile_manager();
    870   ASSERT_TRUE(profile_manager);
    871 
    872   // Create and load two profiles.
    873   const std::string profile_name1 = "New Profile 1";
    874   const std::string profile_name2 = "New Profile 2";
    875   base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
    876   base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
    877 
    878   MockObserver mock_observer;
    879   EXPECT_CALL(mock_observer, OnProfileCreated(
    880       testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
    881 
    882   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
    883   CreateProfileAsync(profile_manager, profile_name2, false, &mock_observer);
    884   base::RunLoop().RunUntilIdle();
    885 
    886   EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
    887   EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
    888 
    889   // Set the active profile.
    890   PrefService* local_state = g_browser_process->local_state();
    891   local_state->SetString(prefs::kProfileLastUsed, profile_name1);
    892 
    893   // Delete the active profile.
    894   profile_manager->ScheduleProfileForDeletion(dest_path1,
    895                                               ProfileManager::CreateCallback());
    896   // Spin the message loop so that all the callbacks can finish running.
    897   base::RunLoop().RunUntilIdle();
    898 
    899   EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
    900   EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
    901 }
    902 
    903 TEST_F(ProfileManagerTest, LastProfileDeleted) {
    904   ProfileManager* profile_manager = g_browser_process->profile_manager();
    905   ASSERT_TRUE(profile_manager);
    906 
    907   // Create and load a profile.
    908   const std::string profile_name1 = "New Profile 1";
    909   base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
    910 
    911   MockObserver mock_observer;
    912   EXPECT_CALL(mock_observer, OnProfileCreated(
    913       testing::NotNull(), NotFail())).Times(testing::AtLeast(1));
    914 
    915   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
    916   base::RunLoop().RunUntilIdle();
    917 
    918   EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
    919   EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
    920 
    921   // Set it as the active profile.
    922   PrefService* local_state = g_browser_process->local_state();
    923   local_state->SetString(prefs::kProfileLastUsed, profile_name1);
    924 
    925   // Delete the active profile.
    926   profile_manager->ScheduleProfileForDeletion(dest_path1,
    927                                               ProfileManager::CreateCallback());
    928   // Spin the message loop so that all the callbacks can finish running.
    929   base::RunLoop().RunUntilIdle();
    930 
    931   // A new profile should have been created
    932   const std::string profile_name2 = "Profile 1";
    933   base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
    934 
    935   EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
    936   EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
    937   EXPECT_EQ(dest_path2,
    938       profile_manager->GetProfileInfoCache().GetPathOfProfileAtIndex(0));
    939 }
    940 
    941 TEST_F(ProfileManagerTest, LastProfileDeletedWithGuestActiveProfile) {
    942   ProfileManager* profile_manager = g_browser_process->profile_manager();
    943   ASSERT_TRUE(profile_manager);
    944 
    945   // Create and load a profile.
    946   const std::string profile_name1 = "New Profile 1";
    947   base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
    948 
    949   MockObserver mock_observer;
    950   EXPECT_CALL(mock_observer, OnProfileCreated(
    951       testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
    952 
    953   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
    954   base::RunLoop().RunUntilIdle();
    955 
    956   EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
    957   EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
    958 
    959   // Create the profile and register it.
    960   const std::string guest_profile_name =
    961       ProfileManager::GetGuestProfilePath().BaseName().MaybeAsASCII();
    962 
    963   TestingProfile::Builder builder;
    964   builder.SetGuestSession();
    965   builder.SetPath(ProfileManager::GetGuestProfilePath());
    966   TestingProfile* guest_profile = builder.Build().release();
    967   guest_profile->set_profile_name(guest_profile_name);
    968   // Registering the profile passes ownership to the ProfileManager.
    969   profile_manager->RegisterTestingProfile(guest_profile, false, false);
    970 
    971   // The Guest profile does not get added to the ProfileInfoCache.
    972   EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
    973   EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
    974 
    975   // Set the Guest profile as the active profile.
    976   PrefService* local_state = g_browser_process->local_state();
    977   local_state->SetString(prefs::kProfileLastUsed, guest_profile_name);
    978 
    979   // Delete the other profile.
    980   profile_manager->ScheduleProfileForDeletion(dest_path1,
    981                                               ProfileManager::CreateCallback());
    982   // Spin the message loop so that all the callbacks can finish running.
    983   base::RunLoop().RunUntilIdle();
    984 
    985   // A new profile should have been created.
    986   const std::string profile_name2 = "Profile 1";
    987   base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
    988 
    989   EXPECT_EQ(3u, profile_manager->GetLoadedProfiles().size());
    990   EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
    991   EXPECT_EQ(dest_path2,
    992       profile_manager->GetProfileInfoCache().GetPathOfProfileAtIndex(0));
    993 }
    994 
    995 TEST_F(ProfileManagerTest, ProfileDisplayNameResetsDefaultName) {
    996   if (!profiles::IsMultipleProfilesEnabled())
    997     return;
    998 
    999   // The command line is reset at the end of every test by the test suite.
   1000   switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
   1001 
   1002   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1003   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1004   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
   1005 
   1006   // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
   1007   const base::string16 default_profile_name =
   1008       l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
   1009   const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
   1010   Profile* profile1 = AddProfileToCache(profile_manager,
   1011                                         "path_1", profile_name1);
   1012   EXPECT_EQ(default_profile_name,
   1013             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1014 
   1015   // Multiple profiles means displaying the actual profile names.
   1016   const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
   1017   Profile* profile2 = AddProfileToCache(profile_manager,
   1018                                         "path_2", profile_name2);
   1019   EXPECT_EQ(profile_name1,
   1020             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1021   EXPECT_EQ(profile_name2,
   1022             profiles::GetAvatarNameForProfile(profile2->GetPath()));
   1023 
   1024   // Deleting a profile means returning to the default name.
   1025   profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
   1026                                               ProfileManager::CreateCallback());
   1027   // Spin the message loop so that all the callbacks can finish running.
   1028   base::RunLoop().RunUntilIdle();
   1029   EXPECT_EQ(default_profile_name,
   1030             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1031 }
   1032 
   1033 TEST_F(ProfileManagerTest, ProfileDisplayNamePreservesCustomName) {
   1034   if (!profiles::IsMultipleProfilesEnabled())
   1035     return;
   1036 
   1037   // The command line is reset at the end of every test by the test suite.
   1038   switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
   1039 
   1040   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1041   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1042   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
   1043 
   1044   // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
   1045   const base::string16 default_profile_name =
   1046       l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
   1047   const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
   1048   Profile* profile1 = AddProfileToCache(profile_manager,
   1049                                         "path_1", profile_name1);
   1050   EXPECT_EQ(default_profile_name,
   1051             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1052 
   1053   // We should display custom names for local profiles.
   1054   const base::string16 custom_profile_name = ASCIIToUTF16("Batman");
   1055   cache.SetNameOfProfileAtIndex(0, custom_profile_name);
   1056   cache.SetProfileIsUsingDefaultNameAtIndex(0, false);
   1057   EXPECT_EQ(custom_profile_name, cache.GetNameOfProfileAtIndex(0));
   1058   EXPECT_EQ(custom_profile_name,
   1059             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1060 
   1061   // Multiple profiles means displaying the actual profile names.
   1062   const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
   1063   Profile* profile2 = AddProfileToCache(profile_manager,
   1064                                         "path_2", profile_name2);
   1065   EXPECT_EQ(custom_profile_name,
   1066             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1067   EXPECT_EQ(profile_name2,
   1068             profiles::GetAvatarNameForProfile(profile2->GetPath()));
   1069 
   1070   // Deleting a profile means returning to the original, custom name.
   1071   profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
   1072                                               ProfileManager::CreateCallback());
   1073   // Spin the message loop so that all the callbacks can finish running.
   1074   base::RunLoop().RunUntilIdle();
   1075   EXPECT_EQ(custom_profile_name,
   1076             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1077 }
   1078 
   1079 TEST_F(ProfileManagerTest, ProfileDisplayNamePreservesSignedInName) {
   1080   if (!profiles::IsMultipleProfilesEnabled())
   1081     return;
   1082 
   1083   // The command line is reset at the end of every test by the test suite.
   1084   switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
   1085 
   1086   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1087   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1088   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
   1089 
   1090   // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
   1091   const base::string16 default_profile_name =
   1092       l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
   1093   const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
   1094   Profile* profile1 = AddProfileToCache(profile_manager,
   1095                                         "path_1", profile_name1);
   1096   EXPECT_EQ(default_profile_name,
   1097             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1098 
   1099   // For a signed in profile with a default name we still display
   1100   // IDS_SINGLE_PROFILE_DISPLAY_NAME.
   1101   cache.SetUserNameOfProfileAtIndex(0, ASCIIToUTF16("user (at) gmail.com"));
   1102   EXPECT_EQ(profile_name1, cache.GetNameOfProfileAtIndex(0));
   1103   EXPECT_EQ(default_profile_name,
   1104             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1105 
   1106   // For a signed in profile with a non-default Gaia given name we display the
   1107   // Gaia given name.
   1108   cache.SetUserNameOfProfileAtIndex(0, ASCIIToUTF16("user (at) gmail.com"));
   1109   const base::string16 gaia_given_name(ASCIIToUTF16("given name"));
   1110   cache.SetGAIAGivenNameOfProfileAtIndex(0, gaia_given_name);
   1111   EXPECT_EQ(gaia_given_name, cache.GetNameOfProfileAtIndex(0));
   1112   EXPECT_EQ(gaia_given_name,
   1113       profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1114 
   1115   // Multiple profiles means displaying the actual profile names.
   1116   const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
   1117   Profile* profile2 = AddProfileToCache(profile_manager,
   1118                                         "path_2", profile_name2);
   1119   EXPECT_EQ(gaia_given_name,
   1120             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1121   EXPECT_EQ(profile_name2,
   1122             profiles::GetAvatarNameForProfile(profile2->GetPath()));
   1123 
   1124   // Deleting a profile means returning to the original, actual profile name.
   1125   profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
   1126                                               ProfileManager::CreateCallback());
   1127   // Spin the message loop so that all the callbacks can finish running.
   1128   base::RunLoop().RunUntilIdle();
   1129   EXPECT_EQ(gaia_given_name,
   1130             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1131 }
   1132 
   1133 TEST_F(ProfileManagerTest, ProfileDisplayNameIsEmailIfDefaultName) {
   1134   if (!profiles::IsMultipleProfilesEnabled())
   1135     return;
   1136 
   1137   // The command line is reset at the end of every test by the test suite.
   1138   switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
   1139 
   1140   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1141   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1142   EXPECT_EQ(0u, cache.GetNumberOfProfiles());
   1143 
   1144   // Create two signed in profiles, with both new and legacy default names, and
   1145   // a profile with a custom name.
   1146   Profile* profile1 = AddProfileToCache(
   1147       profile_manager, "path_1", ASCIIToUTF16("Person 1"));
   1148   Profile* profile2 = AddProfileToCache(
   1149       profile_manager, "path_2", ASCIIToUTF16("Default Profile"));
   1150   const base::string16 profile_name3(ASCIIToUTF16("Batman"));
   1151   Profile* profile3 = AddProfileToCache(
   1152       profile_manager, "path_3", profile_name3);
   1153   EXPECT_EQ(3u, cache.GetNumberOfProfiles());
   1154 
   1155   // Sign in all profiles, and make sure they do not have a Gaia name set.
   1156   const base::string16 email1(ASCIIToUTF16("user1 (at) gmail.com"));
   1157   const base::string16 email2(ASCIIToUTF16("user2 (at) gmail.com"));
   1158   const base::string16 email3(ASCIIToUTF16("user3 (at) gmail.com"));
   1159 
   1160   int index = cache.GetIndexOfProfileWithPath(profile1->GetPath());
   1161   cache.SetUserNameOfProfileAtIndex(index, email1);
   1162   cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
   1163   cache.SetGAIANameOfProfileAtIndex(index, base::string16());
   1164 
   1165   // This may resort the cache, so be extra cautious to use the right profile.
   1166   index = cache.GetIndexOfProfileWithPath(profile2->GetPath());
   1167   cache.SetUserNameOfProfileAtIndex(index, email2);
   1168   cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
   1169   cache.SetGAIANameOfProfileAtIndex(index, base::string16());
   1170 
   1171   index = cache.GetIndexOfProfileWithPath(profile3->GetPath());
   1172   cache.SetUserNameOfProfileAtIndex(index, email3);
   1173   cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
   1174   cache.SetGAIANameOfProfileAtIndex(index, base::string16());
   1175 
   1176   // The profiles with default names should display the email address.
   1177   EXPECT_EQ(email1, profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1178   EXPECT_EQ(email2, profiles::GetAvatarNameForProfile(profile2->GetPath()));
   1179 
   1180   // The profile with the custom name should display that.
   1181   EXPECT_EQ(profile_name3,
   1182             profiles::GetAvatarNameForProfile(profile3->GetPath()));
   1183 
   1184   // Adding a Gaia name to a profile that previously had a default name should
   1185   // start displaying it.
   1186   const base::string16 gaia_given_name(ASCIIToUTF16("Robin"));
   1187   cache.SetGAIAGivenNameOfProfileAtIndex(
   1188       cache.GetIndexOfProfileWithPath(profile1->GetPath()), gaia_given_name);
   1189   EXPECT_EQ(gaia_given_name,
   1190             profiles::GetAvatarNameForProfile(profile1->GetPath()));
   1191 }
   1192 #endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
   1193 
   1194 #if defined(OS_MACOSX)
   1195 // These tests are for a Mac-only code path that assumes the browser
   1196 // process isn't killed when all browser windows are closed.
   1197 TEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) {
   1198   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1199   ASSERT_TRUE(profile_manager);
   1200 
   1201   // Create and load one profile, and just create a second profile.
   1202   const std::string profile_name1 = "New Profile 1";
   1203   const std::string profile_name2 = "New Profile 2";
   1204   base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
   1205   base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
   1206 
   1207   MockObserver mock_observer;
   1208   EXPECT_CALL(mock_observer, OnProfileCreated(
   1209       testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
   1210   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
   1211   base::RunLoop().RunUntilIdle();
   1212 
   1213   // Track the profile, but don't load it.
   1214   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1215   cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2),
   1216                           base::string16(), 0, std::string());
   1217   base::RunLoop().RunUntilIdle();
   1218 
   1219   EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
   1220   EXPECT_EQ(2u, cache.GetNumberOfProfiles());
   1221 
   1222   // Set the active profile.
   1223   PrefService* local_state = g_browser_process->local_state();
   1224   local_state->SetString(prefs::kProfileLastUsed,
   1225                          dest_path1.BaseName().MaybeAsASCII());
   1226 
   1227   // Delete the active profile. This should switch and load the unloaded
   1228   // profile.
   1229   profile_manager->ScheduleProfileForDeletion(dest_path1,
   1230                                               ProfileManager::CreateCallback());
   1231 
   1232   // Spin the message loop so that all the callbacks can finish running.
   1233   base::RunLoop().RunUntilIdle();
   1234 
   1235   EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
   1236   EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
   1237 }
   1238 
   1239 // This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded
   1240 // by simulating a scenario in which the profile that is being loaded as
   1241 // the next active profile has also been marked for deletion, so the
   1242 // ProfileManager needs to recursively select a different next profile.
   1243 TEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) {
   1244   ProfileManager* profile_manager = g_browser_process->profile_manager();
   1245   ASSERT_TRUE(profile_manager);
   1246 
   1247   // Create and load one profile, and create two more profiles.
   1248   const std::string profile_name1 = "New Profile 1";
   1249   const std::string profile_name2 = "New Profile 2";
   1250   const std::string profile_name3 = "New Profile 3";
   1251   base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
   1252   base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
   1253   base::FilePath dest_path3 = temp_dir_.path().AppendASCII(profile_name3);
   1254 
   1255   MockObserver mock_observer;
   1256   EXPECT_CALL(mock_observer, OnProfileCreated(
   1257       testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
   1258   CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
   1259   base::RunLoop().RunUntilIdle();
   1260 
   1261   // Create the other profiles, but don't load them. Assign a fake avatar icon
   1262   // to ensure that profiles in the info cache are sorted by the profile name,
   1263   // and not randomly by the avatar name.
   1264   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
   1265   cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2),
   1266                           ASCIIToUTF16(profile_name2), 1, std::string());
   1267   cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3),
   1268                           ASCIIToUTF16(profile_name3), 2, std::string());
   1269 
   1270   base::RunLoop().RunUntilIdle();
   1271 
   1272   EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
   1273   EXPECT_EQ(3u, cache.GetNumberOfProfiles());
   1274 
   1275   // Set the active profile.
   1276   PrefService* local_state = g_browser_process->local_state();
   1277   local_state->SetString(prefs::kProfileLastUsed,
   1278                          dest_path1.BaseName().MaybeAsASCII());
   1279 
   1280   // Delete the active profile, Profile1.
   1281   // This will post a CreateProfileAsync message, that tries to load Profile2,
   1282   // which checks that the profile is not being deleted, and then calls back
   1283   // FinishDeletingProfile for Profile1.
   1284   // Try to break this flow by setting the active profile to Profile2 in the
   1285   // middle (so after the first posted message), and trying to delete Profile2,
   1286   // so that the ProfileManager has to look for a different profile to load.
   1287   profile_manager->ScheduleProfileForDeletion(dest_path1,
   1288                                               ProfileManager::CreateCallback());
   1289   local_state->SetString(prefs::kProfileLastUsed,
   1290                          dest_path2.BaseName().MaybeAsASCII());
   1291   profile_manager->ScheduleProfileForDeletion(dest_path2,
   1292                                               ProfileManager::CreateCallback());
   1293   // Spin the message loop so that all the callbacks can finish running.
   1294   base::RunLoop().RunUntilIdle();
   1295 
   1296   EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath());
   1297   EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed));
   1298 }
   1299 #endif  // !defined(OS_MACOSX)
   1300