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 <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_browser_window.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This global variable is used to check that value returned to different 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// observers is the same. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* g_created_profile; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class UnittestProfileManager : public ::ProfileManagerWithoutInit { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit UnittestProfileManager(const base::FilePath& user_data_dir) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ::ProfileManagerWithoutInit(user_data_dir) {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Profile* CreateProfileHelper( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path) OVERRIDE { 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(file_path)) { 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::CreateDirectory(file_path)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestingProfile(file_path, NULL); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Profile* CreateProfileAsyncHelper(const base::FilePath& path, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate) OVERRIDE { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is safe while all file operations are done on the FILE thread. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(base::IgnoreResult(&base::CreateDirectory), path)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestingProfile(path, this); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManagerTest : public testing::Test { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockObserver { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnProfileCreated, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(Profile* profile, Profile::CreateStatus status)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManagerTest() 94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch : local_state_(TestingBrowserProcess::GetGlobal()) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new temporary directory, and store the path 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager( 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new UnittestProfileManager(temp_dir_.path())); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* cl = CommandLine::ForCurrentProcess(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cl->AppendSwitch(switches::kTestType); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Helper function to create a profile with |name| for a profile |manager|. 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CreateProfileAsync(ProfileManager* manager, 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name, 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver* mock_observer) { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch manager->CreateProfileAsync( 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(name), 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&MockObserver::OnProfileCreated, 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(mock_observer)), 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UTF8ToUTF16(name), 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::string()); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestCrosSettings test_cros_settings_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path to temporary directory used to contain the test operations. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTestingLocalState local_state_; 135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 136a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestUserManager test_user_manager_; 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, GetProfile) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create a profile. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = profile_manager->GetProfile(dest_path); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(profile); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile already exists when we call GetProfile. Just load it. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile, profile_manager->GetProfile(dest_path)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DefaultProfileDir) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_default = 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII(chrome::kInitialProfile); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_default.value(), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->profile_manager()->GetInitialProfileDir().value()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This functionality only exists on Chrome OS. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LoggedInProfileDir) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine *cl = CommandLine::ForCurrentProcess(); 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string profile_dir(chrome::kTestUserProfileDir); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cl->AppendSwitchASCII(chromeos::switches::kLoginProfile, profile_dir); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_default = 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII(chrome::kInitialProfile); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_default.value(), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir().value()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<chromeos::MockUserManager> mock_user_manager; 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_user_manager.reset(new chromeos::MockUserManager()); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_user_manager->SetActiveUser("user@gmail.com"); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::User* active_user = mock_user_manager->GetActiveUser(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<const chromeos::User>(active_user)); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_logged_in(profile_dir); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_logged_in.value(), 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir().value()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << temp_dir_.path().Append( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir()).value(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force lazy-init of some profile services to simulate use. 214bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(profile1->CreateHistoryService(true, false)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile1, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile1->CreateBookmarkModel(true); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2->CreateBookmarkModel(true); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2)); 221bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(profile2->CreateHistoryService(true, false)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure any pending tasks run before we destroy the profiles. 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure history cleans up correctly. 231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(NotFail, "Profile creation failure status is not reported.") { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg == Profile::CREATE_STATUS_CREATED || 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg == Profile::CREATE_STATUS_INITIALIZED; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests asynchronous profile creation mechanism. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Crashes: http://crbug.com/89421 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DISABLED_CreateProfileAsync) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer, OnProfileCreated( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), NotFail())).Times(testing::AtLeast(1)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(g_browser_process->profile_manager(), 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "New Profile", &mock_observer); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(SameNotNull, "The same non-NULL value for all calls.") { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_created_profile) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_created_profile = arg; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg != NULL && arg == g_created_profile; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_created_profile = NULL; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer1; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer1, OnProfileCreated( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer2; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer2, OnProfileCreated( 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer3; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer3, OnProfileCreated( 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name = "New Profile"; 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer1); 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer2); 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer3); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfilesAsync) { 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer, OnProfileCreated( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name2, &mock_observer); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 293a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ProfileManagerTest, GetGuestProfilePath) { 2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath guest_path = ProfileManager::GetGuestProfilePath(); 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath expected_path = temp_dir_.path(); 2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_path = expected_path.Append(chrome::kGuestProfileDir); 3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_path, guest_path); 3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value::CreateBooleanValue(true)); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting a pref which is not applicable to a system (i.e., Android in this 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // case) does not necessarily create it. Don't bother continuing with the 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test if this pref doesn't exist because it will not load the profiles if 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it cannot verify that the pref for background mode is enabled. 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled)) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cache.GetNumberOfProfiles()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"), 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("name_1"), base::string16(), 0, 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"), 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("name_2"), base::string16(), 0, 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_3"), 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("name_3"), base::string16(), 0, 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(0, true); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(2, true); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3u, cache.GetNumberOfProfiles()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->AutoloadProfiles(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileManagerTest, DoNotAutoloadProfilesIfBackgroundModeOff) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value::CreateBooleanValue(false)); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, cache.GetNumberOfProfiles()); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"), 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("name_1"), base::string16(), 0, 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"), 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("name_2"), base::string16(), 0, 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(0, false); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(1, true); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, cache.GetNumberOfProfiles()); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_manager->AutoloadProfiles(); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, profile_manager->GetLoadedProfiles().size()); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileUserPrefs) { 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profile 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile = profile_manager->GetProfile(dest_path); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the profile name is non empty 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string profile_name = 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(profile_name.empty()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the profile avatar index is valid 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t avatar_index = 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(profile_manager->GetProfileInfoCache().IsDefaultAvatarIconIndex( 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_index)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a new profile's entry in the profile info cache is setup with the 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same values that are in the profile prefs. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileInfoCacheForAProfile) { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profile 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = profile_manager->GetProfile(dest_path); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string profile_name = 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t avatar_index = 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t profile_index = cache.GetIndexOfProfileWithPath(dest_path); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the profile prefs are the same as the cache prefs 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile_name, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(cache.GetNameOfProfileAtIndex(profile_index))); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(avatar_index, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.GetAvatarIconIndexOfProfileAtIndex(profile_index)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProfileManagerTest, GetLastUsedProfileAllowedByPolicy) { 409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile_manager); 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy(); 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile); 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(profile->IsOffTheRecord()); 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(IncognitoModePrefs::ENABLED, 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::GetAvailability(prefs)); 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Attach an incognito Profile to the TestingProfile. 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_FALSE(profile->GetOffTheRecordProfile()); 4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestingProfile::Builder builder; 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) builder.SetIncognito(); 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<TestingProfile> incognito_profile = builder.Build(); 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(incognito_profile->IsOffTheRecord()); 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestingProfile* testing_profile = static_cast<TestingProfile*>(profile); 4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) testing_profile->SetOffTheRecordProfile(incognito_profile.PassAs<Profile>()); 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile->GetOffTheRecordProfile()); 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::DISABLED); 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE( 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // incognito mode is forced. 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED); 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There's no Browser object on Android. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfiles) { 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1a( 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2( 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding more browsers doesn't change anything. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1b( 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the browsers. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1a.reset(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1b.reset(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[0]); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2.reset(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesAtShutdown) { 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1( 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2( 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a shutdown. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Even if the browsers are destructed during shutdown, the profiles stay 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // open. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1.reset(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2.reset(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesDoesNotContainIncognito) { 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // incognito profiles should not be managed by the profile manager but by the 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original profile. 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestingProfile::Builder builder; 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) builder.SetIncognito(); 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<TestingProfile> profile2 = builder.Build(); 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) profile1->SetOffTheRecordProfile(profile2.PassAs<Profile>()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1( 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Browser::CreateParams profile2_params(profile1->GetOffTheRecordProfile(), 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) chrome::GetActiveDesktop()); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2a( 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding more browsers doesn't change anything. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2b( 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the browsers. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2a.reset(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2b.reset(); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1.reset(); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_ANDROID) 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// There's no Browser object on Android and there's no multi-profiles on Chrome. 6288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastProfile) { 6298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 6308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("Ephemeral Profile")); 6318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 6338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestingProfile* profile = 6358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path)); 6368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_TRUE(profile); 6378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, true); 6388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Here the last used profile is still the "Default" profile. 6408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Profile* last_used_profile = profile_manager->GetLastUsedProfile(); 6418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(profile, last_used_profile); 6428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Create a browser for the profile. 6448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Browser::CreateParams profile_params(profile, chrome::GetActiveDesktop()); 6458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<Browser> browser( 6468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile_params)); 6478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) last_used_profile = profile_manager->GetLastUsedProfile(); 6488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(profile, last_used_profile); 6498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Close the browser. 6518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) browser.reset(); 6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) last_used_profile = profile_manager->GetLastUsedProfile(); 6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(profile, last_used_profile); 6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastOpenedAtShutdown) { 6578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 6588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("Normal Profile")); 6598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 6611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("Ephemeral Profile 1")); 6621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::FilePath dest_path3 = temp_dir_.path(); 6641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dest_path3 = dest_path3.Append(FILE_PATH_LITERAL("Ephemeral Profile 2")); 6658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 6678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Successfully create the profiles. 6698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestingProfile* normal_profile = 6708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 6718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_TRUE(normal_profile); 6728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Add one ephemeral profile which should not end up in this list. 6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestingProfile* ephemeral_profile1 = 6758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(ephemeral_profile1); 6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ephemeral_profile1->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, 6781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) true); 6791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Add second ephemeral profile but don't mark it as such yet. 6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestingProfile* ephemeral_profile2 = 6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path3)); 6831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(ephemeral_profile2); 6848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Create a browser for profile1. 6868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Browser::CreateParams profile1_params(normal_profile, 6878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::GetActiveDesktop()); 6888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<Browser> browser1( 6898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 6908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Create browsers for the ephemeral profile. 6921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Browser::CreateParams profile2_params(ephemeral_profile1, 6938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::GetActiveDesktop()); 6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<Browser> browser2( 6958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Browser::CreateParams profile3_params(ephemeral_profile2, 6981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) chrome::GetActiveDesktop()); 6991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<Browser> browser3( 7001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile3_params)); 7011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<Profile*> last_opened_profiles = 7038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 7041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 7058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(normal_profile, last_opened_profiles[0]); 7061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ephemeral_profile2, last_opened_profiles[1]); 7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Mark the second profile ephemeral. 7091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ephemeral_profile2->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, 7101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) true); 7118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulate a shutdown. 7138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::NotificationService::current()->Notify( 7148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::NotificationService::AllSources(), 7168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::NotificationService::NoDetails()); 7178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) browser1.reset(); 7188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) browser2.reset(); 7191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) browser3.reset(); 7208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 7228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 7238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(normal_profile, last_opened_profiles[0]); 7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 7258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeleted) { 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load two profiles. 731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name2, &mock_observer); 744a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); 747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles()); 748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, profile_name1); 752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile. 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 757a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); 760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) 763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) 765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// These tests are for a Mac-only code path that assumes the browser 766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// process isn't killed when all browser windows are closed. 767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) { 768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load one profile, and just create a second profile. 772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); 782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 783a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Track the profile, but don't load it. 786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), 0, std::string()); 789a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); 792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, cache.GetNumberOfProfiles()); 793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path1.BaseName().MaybeAsASCII()); 798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile. This should switch and load the unloaded 800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // profile. 801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 805a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); 808eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); 809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 810eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded 812eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// by simulating a scenario in which the profile that is being loaded as 813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the next active profile has also been marked for deletion, so the 814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ProfileManager needs to recursively select a different next profile. 815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) { 816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load one profile, and create two more profiles. 820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 821eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name3 = "New Profile 3"; 823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path3 = 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name3); 829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 834a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the other profiles, but don't load them. Assign a fake avatar icon 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to ensure that profiles in the info cache are sorted by the profile name, 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and not randomly by the avatar name. 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), 8412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASCIIToUTF16(profile_name2), 1, std::string()); 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3), 8432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ASCIIToUTF16(profile_name3), 2, std::string()); 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 845a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(3u, cache.GetNumberOfProfiles()); 849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path1.BaseName().MaybeAsASCII()); 854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile, Profile1. 856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This will post a CreateProfileAsync message, that tries to load Profile2, 857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // which checks that the profile is not being deleted, and then calls back 858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // FinishDeletingProfile for Profile1. 859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Try to break this flow by setting the active profile to Profile2 in the 860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // middle (so after the first posted message), and trying to delete Profile2, 861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so that the ProfileManager has to look for a different profile to load. 862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path2.BaseName().MaybeAsASCII()); 866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path2, 867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 869a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath()); 872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed)); 873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(OS_MACOSX) 875