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