profile_manager_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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/message_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.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" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.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" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.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) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace testing { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManager : public ::ProfileManagerWithoutInit { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ProfileManager(const base::FilePath& user_data_dir) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ::ProfileManagerWithoutInit(user_data_dir) {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Profile* CreateProfileHelper( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path) OVERRIDE { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::PathExists(file_path)) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::CreateDirectory(file_path)) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestingProfile(file_path, NULL); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Profile* CreateProfileAsyncHelper(const base::FilePath& path, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate) OVERRIDE { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is safe while all file operations are done on the FILE thread. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(base::IgnoreResult(&file_util::CreateDirectory), path)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestingProfile(path, this); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace testing 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManagerTest : public testing::Test { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockObserver { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnProfileCreated, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(Profile* profile, Profile::CreateStatus status)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManagerTest() 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : local_state_(TestingBrowserProcess::GetGlobal()), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_thread_(BrowserThread::DB, &message_loop_), 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new temporary directory, and store the path 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new testing::ProfileManager(temp_dir_.path())); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* cl = CommandLine::ForCurrentProcess(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cl->AppendSwitch(switches::kTestType); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Helper function to create a profile with |name| for a profile |manager|. 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CreateProfileAsync(ProfileManager* manager, 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name, 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver* mock_observer) { 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch manager->CreateProfileAsync( 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(name), 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&MockObserver::OnProfileCreated, 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(mock_observer)), 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UTF8ToUTF16(name), 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16(), 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestCrosSettings test_cros_settings_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path to temporary directory used to contain the test operations. 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTestingLocalState local_state_; 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread db_thread_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestUserManager test_user_manager_; 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, GetProfile) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create a profile. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = profile_manager->GetProfile(dest_path); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(profile); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile already exists when we call GetProfile. Just load it. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile, profile_manager->GetProfile(dest_path)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DefaultProfileDir) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_default = 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII(chrome::kInitialProfile); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_default.value(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->profile_manager()->GetInitialProfileDir().value()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This functionality only exists on Chrome OS. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LoggedInProfileDir) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine *cl = CommandLine::ForCurrentProcess(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string profile_dir("my_user"); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cl->AppendSwitchASCII(chromeos::switches::kLoginProfile, profile_dir); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_default = 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII(chrome::kInitialProfile); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_default.value(), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir().value()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<chromeos::MockUserManager> mock_user_manager; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_user_manager.reset(new chromeos::MockUserManager()); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_user_manager->SetActiveUser("user@gmail.com"); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::User* active_user = mock_user_manager->GetActiveUser(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<const chromeos::User>(active_user)); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_logged_in(profile_dir); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_logged_in.value(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir().value()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << temp_dir_.path().Append( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetInitialProfileDir()).value(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force lazy-init of some profile services to simulate use. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile1->CreateHistoryService(true, false); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile1, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile1->CreateBookmarkModel(true); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2->CreateBookmarkModel(true); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2->CreateHistoryService(true, false); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure any pending tasks run before we destroy the profiles. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure history cleans up correctly. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(NotFail, "Profile creation failure status is not reported.") { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg == Profile::CREATE_STATUS_CREATED || 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg == Profile::CREATE_STATUS_INITIALIZED; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests asynchronous profile creation mechanism. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Crashes: http://crbug.com/89421 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DISABLED_CreateProfileAsync) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer, OnProfileCreated( 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), NotFail())).Times(testing::AtLeast(1)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(g_browser_process->profile_manager(), 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "New Profile", &mock_observer); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(SameNotNull, "The same non-NULL value for all calls.") { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_created_profile) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_created_profile = arg; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg != NULL && arg == g_created_profile; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_created_profile = NULL; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer1; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer1, OnProfileCreated( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer2; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer2, OnProfileCreated( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer3; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer3, OnProfileCreated( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SameNotNull(), NotFail())).Times(testing::AtLeast(1)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name = "New Profile"; 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer1); 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer2); 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name, &mock_observer3); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfilesAsync) { 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver mock_observer; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_observer, OnProfileCreated( 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name2, &mock_observer); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value::CreateBooleanValue(true)); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting a pref which is not applicable to a system (i.e., Android in this 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // case) does not necessarily create it. Don't bother continuing with the 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test if this pref doesn't exist because it will not load the profiles if 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it cannot verify that the pref for background mode is enabled. 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled)) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cache.GetNumberOfProfiles()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"), 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16("name_1"), string16(), 0, false); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"), 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16("name_2"), string16(), 0, false); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_3"), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16("name_3"), string16(), 0, false); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(0, true); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(2, true); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3u, cache.GetNumberOfProfiles()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->AutoloadProfiles(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileManagerTest, DoNotAutoloadProfilesIfBackgroundModeOff) { 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value::CreateBooleanValue(false)); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, cache.GetNumberOfProfiles()); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"), 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16("name_1"), string16(), 0, false); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"), 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16("name_2"), string16(), 0, false); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(0, false); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.SetBackgroundStatusOfProfileAtIndex(1, true); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, cache.GetNumberOfProfiles()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_manager->AutoloadProfiles(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, profile_manager->GetLoadedProfiles().size()); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileUserPrefs) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profile 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile = profile_manager->GetProfile(dest_path); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the profile name is non empty 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string profile_name = 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(profile_name.empty()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the profile avatar index is valid 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t avatar_index = 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(profile_manager->GetProfileInfoCache().IsDefaultAvatarIconIndex( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_index)); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a new profile's entry in the profile info cache is setup with the 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same values that are in the profile prefs. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileInfoCacheForAProfile) { 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path = temp_dir_.path(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profile 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = profile_manager->GetProfile(dest_path); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string profile_name = 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t avatar_index = 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t profile_index = cache.GetIndexOfProfileWithPath(dest_path); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the profile prefs are the same as the cache prefs 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile_name, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(cache.GetNameOfProfileAtIndex(profile_index))); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(avatar_index, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.GetAvatarIconIndexOfProfileAtIndex(profile_index)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProfileManagerTest, GetLastUsedProfileAllowedByPolicy) { 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile_manager); 408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy(); 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile); 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(profile->IsOffTheRecord()); 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(IncognitoModePrefs::ENABLED, 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::GetAvailability(prefs)); 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Attach an incognito Profile to the TestingProfile. 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_FALSE(profile->GetOffTheRecordProfile()); 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestingProfile* incognito_profile = new TestingProfile(); 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) incognito_profile->set_incognito(true); 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(incognito_profile->IsOffTheRecord()); 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestingProfile* testing_profile = static_cast<TestingProfile*>(profile); 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing_profile->SetOffTheRecordProfile(incognito_profile); 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(profile->GetOffTheRecordProfile()); 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::DISABLED); 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE( 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // incognito mode is forced. 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED); 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There's no Browser object on Android. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfiles) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1a( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2( 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding more browsers doesn't change anything. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1b( 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the browsers. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1a.reset(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1b.reset(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[0]); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2.reset(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesAtShutdown) { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2)); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1( 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop()); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2( 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a shutdown. 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Even if the browsers are destructed during shutdown, the profiles stay 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // open. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser1.reset(); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2.reset(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, last_opened_profiles.size()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile2, last_opened_profiles[1]); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesDoesNotContainIncognito) { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path1 = temp_dir_.path(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_path2 = temp_dir_.path(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successfully create the profiles. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile1 = 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1)); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile1); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // incognito profiles should not be managed by the profile manager but by the 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original profile. 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile2 = new TestingProfile(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2->set_incognito(true); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile1->SetOffTheRecordProfile(profile2); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> last_opened_profiles = 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->GetLastOpenedProfiles(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for profile1. 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser1( 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile1_params)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And for profile2. 589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop()); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2a( 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding more browsers doesn't change anything. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> browser2b( 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CreateBrowserWithTestWindowForParams(&profile2_params)); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the browsers. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2a.reset(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, last_opened_profiles.size()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(profile1, last_opened_profiles[0]); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2b.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) browser1.reset(); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, last_opened_profiles.size()); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_ANDROID) 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// There's no Browser object on Android and there's no multi-profiles on Chrome. 623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeleted) { 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load two profiles. 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); 638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name2, &mock_observer); 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles()); 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, profile_name1); 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile. 651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); 658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) 660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// These tests are for a Mac-only code path that assumes the browser 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// process isn't killed when all browser windows are closed. 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) { 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load one profile, and just create a second profile. 669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); 679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Track the profile, but don't load it. 683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), 685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16(), 0, false); 686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 687eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); 689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, cache.GetNumberOfProfiles()); 690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path1.BaseName().MaybeAsASCII()); 695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile. This should switch and load the unloaded 697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // profile. 698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); 705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); 706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded 709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// by simulating a scenario in which the profile that is being loaded as 710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the next active profile has also been marked for deletion, so the 711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ProfileManager needs to recursively select a different next profile. 712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) { 713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(profile_manager); 715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create and load one profile, and create two more profiles. 717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name1 = "New Profile 1"; 718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name2 = "New Profile 2"; 719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string profile_name3 = "New Profile 3"; 720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path1 = 721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name1); 722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path2 = 723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name2); 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath dest_path3 = 725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch temp_dir_.path().AppendASCII(profile_name3); 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockObserver mock_observer; 728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer, OnProfileCreated( 729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateProfileAsync(profile_manager, profile_name1, &mock_observer); 731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the other profiles, but don't load them. Assign a fake avatar icon 734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to ensure that profiles in the info cache are sorted by the profile name, 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and not randomly by the avatar name. 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), 738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASCIIToUTF16(profile_name2), 1, false); 739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3), 740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASCIIToUTF16(profile_name3), 2, false); 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); 745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(3u, cache.GetNumberOfProfiles()); 746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the active profile. 748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrefService* local_state = g_browser_process->local_state(); 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path1.BaseName().MaybeAsASCII()); 751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete the active profile, Profile1. 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This will post a CreateProfileAsync message, that tries to load Profile2, 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // which checks that the profile is not being deleted, and then calls back 755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // FinishDeletingProfile for Profile1. 756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Try to break this flow by setting the active profile to Profile2 in the 757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // middle (so after the first posted message), and trying to delete Profile2, 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so that the ProfileManager has to look for a different profile to load. 759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path1, 760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_state->SetString(prefs::kProfileLastUsed, 762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dest_path2.BaseName().MaybeAsASCII()); 763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_manager->ScheduleProfileForDeletion(dest_path2, 764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileManager::CreateCallback()); 765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Spin the message loop so that all the callbacks can finish running. 766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_.RunUntilIdle(); 767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath()); 769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed)); 770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(OS_MACOSX) 772