profile_manager_browsertest.cc revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache_observer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_window.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profiles_state.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An observer that returns back to test code after a new profile is
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OnUnblockOnProfileCreation(Profile* profile,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Profile::CreateStatus status) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == Profile::CREATE_STATUS_INITIALIZED)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileCreationComplete(Profile* profile, Profile::CreateStatus status) {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_NE(status, Profile::CREATE_STATUS_LOCAL_FAIL);
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_NE(status, Profile::CREATE_STATUS_REMOTE_FAIL);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No browser should have been created for this profile yet.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(chrome::GetTotalBrowserCountForProfile(profile), 0U);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status == Profile::CREATE_STATUS_INITIALIZED)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileRemovalObserver : public ProfileInfoCacheObserver {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileRemovalObserver() {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->profile_manager()->GetProfileInfoCache().AddObserver(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ProfileRemovalObserver() {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string last_used_profile_name() { return last_used_profile_name_; }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ProfileInfoCacheObserver overrides:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileWillBeRemoved(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& profile_path) OVERRIDE {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_used_profile_name_ = g_browser_process->local_state()->GetString(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs::kProfileLastUsed);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string last_used_profile_name_;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains tests for the ProfileManager that require a heavyweight
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InProcessBrowserTest.  These include tests involving profile deletion.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jeremy): crbug.com/103355 - These tests should be enabled on all
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platforms.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManagerBrowserTest : public InProcessBrowserTest {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete single profile and make sure a new one is created.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteSingletonProfile) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileRemovalObserver observer;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should start out with 1 profile.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(cache.GetNumberOfProfiles(), 1U);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete singleton profile.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath singleton_profile_path = cache.GetPathOfProfileAtIndex(0);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(singleton_profile_path.empty());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->ScheduleProfileForDeletion(singleton_profile_path,
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              ProfileManager::CreateCallback());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Spin things till profile is actually deleted.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure a new profile was created automatically.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(cache.GetNumberOfProfiles(), 1U);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(new_profile_path, singleton_profile_path);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that last used profile preference is set correctly.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* last_used = ProfileManager::GetLastUsedProfile();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_profile_path, last_used->GetPath());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the last used profile was set correctly before the notification
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // was sent.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string last_used_profile_name =
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_used->GetPath().BaseName().MaybeAsASCII();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete all profiles in a multi profile setup and make sure a new one is
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashes/CHECKs. See crbug.com/104851
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an additional profile.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(new_path,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      base::Bind(&OnUnblockOnProfileCreation),
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                      string16(), string16(), std::string());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Spin to allow profile creation to take place, loop is terminated
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by OnUnblockOnProfileCreation when the profile is created.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunMessageLoop();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(cache.GetNumberOfProfiles(), 2U);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete all profiles.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_path1 = cache.GetPathOfProfileAtIndex(0);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_path2 = cache.GetPathOfProfileAtIndex(1);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_path1.empty());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_path2.empty());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->ScheduleProfileForDeletion(profile_path1,
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              ProfileManager::CreateCallback());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->ScheduleProfileForDeletion(profile_path2,
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              ProfileManager::CreateCallback());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Spin things so deletion can take place.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure a new profile was created automatically.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(cache.GetNumberOfProfiles(), 1U);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_profile_path = cache.GetPathOfProfileAtIndex(0);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(new_profile_path, profile_path1);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(new_profile_path, profile_path2);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that last used profile preference is set correctly.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* last_used = ProfileManager::GetLastUsedProfile();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_profile_path, last_used->GetPath());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // OS_MACOSX
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out (http://crbug.com/159002)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_CreateProfileWithCallback) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(profile_manager->GetNumberOfProfiles(), 1U);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a profile, make sure callback is invoked before any callbacks are
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // invoked (so they can do things like sign in the profile, etc).
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileManager::CreateMultiProfileAsync(
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16(), // name
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16(), // icon url
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(ProfileCreationComplete),
1742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      std::string());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for profile to finish loading.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RunMessageLoop();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(profile_manager->GetNumberOfProfiles(), 2U);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now close all browser windows.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<Profile*>::const_iterator it = profiles.begin();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != profiles.end(); ++it) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserList::CloseAllBrowsersWithProfile(*it);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest,
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                       SwitchToProfile) {
190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // If multiprofile mode is not enabled, you can't switch between profiles.
197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!profiles::IsMultipleProfilesEnabled())
198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ProfileManager* profile_manager = g_browser_process->profile_manager();
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FilePath path_profile1 = cache.GetPathOfProfileAtIndex(0);
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(profile_manager->GetNumberOfProfiles(), 1U);
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U);
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Create an additional profile.
208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FilePath path_profile2 =
209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      profile_manager->GenerateNextProfileDirectoryPath();
210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  profile_manager->CreateProfileAsync(path_profile2,
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                      base::Bind(&OnUnblockOnProfileCreation),
2122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                      string16(), string16(), std::string());
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Spin to allow profile creation to take place, loop is terminated
215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // by OnUnblockOnProfileCreation when the profile is created.
216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::RunMessageLoop();
217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  chrome::HostDesktopType desktop_type = chrome::GetActiveDesktop();
219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  BrowserList* browser_list = BrowserList::GetInstance(desktop_type);
220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(cache.GetNumberOfProfiles(), 2U);
221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(1U, browser_list->size());
222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Open a browser window for the first profile.
224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  profiles::SwitchToProfile(path_profile1, desktop_type, false);
225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(chrome::GetTotalBrowserCount(), 1U);
226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(1U, browser_list->size());
227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Open a browser window for the second profile.
230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  profiles::SwitchToProfile(path_profile2, desktop_type, false);
231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U);
232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2U, browser_list->size());
233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath());
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Switch to the first profile without opening a new window.
236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  profiles::SwitchToProfile(path_profile1, desktop_type, false);
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(chrome::GetTotalBrowserCount(), 2U);
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2U, browser_list->size());
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath());
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath());
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
243