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