profile_manager_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/system_monitor/system_monitor.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router_forwarder.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"
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)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cros_library.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This global variable is used to check that value returned to different
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// observers is the same.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* g_created_profile;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace testing {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileManager : public ::ProfileManagerWithoutInit {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ProfileManager(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 {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!file_util::PathExists(file_path)) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!file_util::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,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&file_util::CreateDirectory), path));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new TestingProfile(path, this);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace testing
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()
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : local_state_(TestingBrowserProcess::GetGlobal()),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_event_router_forwarder_(new extensions::EventRouterForwarder),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_thread_(BrowserThread::UI, &message_loop_),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB, &message_loop_),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE, &message_loop_),
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        io_thread_(local_state_.Get(), g_browser_process->policy_service(),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   NULL, extension_event_router_forwarder_) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SystemMonitor::AllocateSystemIOPorts();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_monitor_dummy_.reset(new base::SystemMonitor);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingBrowserProcess::GetGlobal()->SetIOThread(&io_thread_);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a new temporary directory, and store the path
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingBrowserProcess::GetGlobal()->SetProfileManager(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new testing::ProfileManager(temp_dir_.path()));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* cl = CommandLine::ForCurrentProcess();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cl->AppendSwitch(switches::kTestType);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not change order of stub_cros_enabler_, which needs to be constructed
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before io_thread_ which requires CrosLibrary to be initialized to construct
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its data member pref_proxy_config_tracker_ on ChromeOS.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::ScopedStubCrosEnabler stub_cros_enabler_;
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_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::EventRouterForwarder>
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_event_router_forwarder_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForUI message_loop_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IOThread is necessary for the creation of some services below.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThread io_thread_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::SystemMonitor> system_monitor_dummy_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, GetProfile) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path = temp_dir_.path();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create a profile.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = profile_manager->GetProfile(dest_path);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile already exists when we call GetProfile. Just load it.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile, profile_manager->GetProfile(dest_path));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DefaultProfileDir) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expected_default =
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath().AppendASCII(chrome::kInitialProfile);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_default.value(),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_browser_process->profile_manager()->GetInitialProfileDir().value());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This functionality only exists on Chrome OS.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LoggedInProfileDir) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine *cl = CommandLine::ForCurrentProcess();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string profile_dir("my_user");
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cl->AppendSwitchASCII(switches::kLoginProfile, profile_dir);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expected_default =
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath().AppendASCII(chrome::kInitialProfile);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_default.value(),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            profile_manager->GetInitialProfileDir().value());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           content::NotificationService::AllSources(),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           content::NotificationService::NoDetails());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expected_logged_in(profile_dir);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_logged_in.value(),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            profile_manager->GetInitialProfileDir().value());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << temp_dir_.path().Append(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager->GetInitialProfileDir()).value();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path1 = temp_dir_.path();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path2 = temp_dir_.path();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profiles.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile1 =
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile1);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile2 =
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile2);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force lazy-init of some profile services to simulate use.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile1->CreateHistoryService(true, false);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile1,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   Profile::EXPLICIT_ACCESS));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile1->CreateBookmarkModel(true);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile2->CreateBookmarkModel(true);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile2->CreateHistoryService(true, false);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   Profile::EXPLICIT_ACCESS));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure any pending tasks run before we destroy the profiles.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure history cleans up correctly.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(NotFail, "Profile creation failure status is not reported.") {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg == Profile::CREATE_STATUS_CREATED ||
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         arg == Profile::CREATE_STATUS_INITIALIZED;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests asynchronous profile creation mechanism.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Crashes: http://crbug.com/89421
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, DISABLED_CreateProfileAsync) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path =
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile"));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockObserver mock_observer;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_observer, OnProfileCreated(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing::NotNull(), NotFail())).Times(testing::AtLeast(1));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->profile_manager()->CreateProfileAsync(dest_path,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&mock_observer)),
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16(), string16(), false);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(SameNotNull, "The same non-NULL value for all calls.") {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!g_created_profile)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_created_profile = arg;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg != NULL && arg == g_created_profile;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path =
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile"));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
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();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(dest_path,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&mock_observer1)),
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 string16(), string16(), false);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(dest_path,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&mock_observer2)),
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 string16(), string16(), false);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(dest_path,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&mock_observer3)),
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 string16(), string16(), false);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, CreateProfilesAsync) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path1 =
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 1"));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path2 =
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 2"));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockObserver mock_observer;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_observer, OnProfileCreated(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(dest_path1,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&mock_observer)),
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 string16(), string16(), false);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->CreateProfileAsync(dest_path2,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MockObserver::OnProfileCreated,
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&mock_observer)),
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 string16(), string16(), false);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Value::CreateBooleanValue(true));
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting a pref which is not applicable to a system (i.e., Android in this
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case) does not necessarily create it. Don't bother continuing with the
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // test if this pref doesn't exist because it will not load the profiles if
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it cannot verify that the pref for background mode is enabled.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled))
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cache.GetNumberOfProfiles());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ASCIIToUTF16("name_1"), string16(), 0, false);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ASCIIToUTF16("name_2"), string16(), 0, false);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_3"),
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ASCIIToUTF16("name_3"), string16(), 0, false);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.SetBackgroundStatusOfProfileAtIndex(0, true);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.SetBackgroundStatusOfProfileAtIndex(2, true);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3u, cache.GetNumberOfProfiles());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager->AutoloadProfiles();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProfileManagerTest, DoNotAutoloadProfilesIfBackgroundModeOff) {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Value::CreateBooleanValue(false));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, cache.GetNumberOfProfiles());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ASCIIToUTF16("name_1"), string16(), 0, false);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ASCIIToUTF16("name_2"), string16(), 0, false);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache.SetBackgroundStatusOfProfileAtIndex(0, false);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache.SetBackgroundStatusOfProfileAtIndex(1, true);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, cache.GetNumberOfProfiles());
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile_manager->AutoloadProfiles();
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, profile_manager->GetLoadedProfiles().size());
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileUserPrefs) {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path = temp_dir_.path();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profile
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile = profile_manager->GetProfile(dest_path);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the profile name is non empty
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string profile_name =
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile->GetPrefs()->GetString(prefs::kProfileName);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(profile_name.empty());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the profile avatar index is valid
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t avatar_index =
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile_manager->GetProfileInfoCache().IsDefaultAvatarIconIndex(
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_index));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a new profile's entry in the profile info cache is setup with the
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same values that are in the profile prefs.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, InitProfileInfoCacheForAProfile) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path = temp_dir_.path();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profile
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = profile_manager->GetProfile(dest_path);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string profile_name =
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile->GetPrefs()->GetString(prefs::kProfileName);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t avatar_index =
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t profile_index = cache.GetIndexOfProfileWithPath(dest_path);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the profile prefs are the same as the cache prefs
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile_name,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UTF16ToUTF8(cache.GetNameOfProfileAtIndex(profile_index)));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(avatar_index,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cache.GetAvatarIconIndexOfProfileAtIndex(profile_index));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There's no Browser object on Android.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfiles) {
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path1 = temp_dir_.path();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path2 = temp_dir_.path();
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profiles.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile1 =
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile1);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile2 =
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile2);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles =
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager->GetLastOpenedProfiles();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, last_opened_profiles.size());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a browser for profile1.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile1_params(profile1,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser1a(
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And for profile2.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile2_params(profile2,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser2(
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, last_opened_profiles.size());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[1]);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding more browsers doesn't change anything.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser1b(
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, last_opened_profiles.size());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[1]);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browsers.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser1a.reset();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, last_opened_profiles.size());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[1]);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser1b.reset();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[0]);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser2.reset();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, last_opened_profiles.size());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesAtShutdown) {
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path1 = temp_dir_.path();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path2 = temp_dir_.path();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profiles.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile1 =
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile1);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile2 =
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile2);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a browser for profile1.
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile1_params(profile1,
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser1(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And for profile2.
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile2_params(profile2,
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser2(
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles =
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager->GetLastOpenedProfiles();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, last_opened_profiles.size());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[1]);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a shutdown.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources(),
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even if the browsers are destructed during shutdown, the profiles stay
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // open.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser1.reset();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser2.reset();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, last_opened_profiles.size());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile2, last_opened_profiles[1]);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileManagerTest, LastOpenedProfilesDoesNotContainIncognito) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path1 = temp_dir_.path();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_path2 = temp_dir_.path();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successfully create the profiles.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile1 =
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile1);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // incognito profiles should not be managed by the profile manager but by the
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // original profile.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile2 = new TestingProfile();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile2);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile2->set_incognito(true);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile1->SetOffTheRecordProfile(profile2);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles =
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager->GetLastOpenedProfiles();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, last_opened_profiles.size());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a browser for profile1.
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile1_params(profile1,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser1(
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And for profile2.
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams profile2_params(profile2,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chrome::HOST_DESKTOP_TYPE_NATIVE);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser2a(
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding more browsers doesn't change anything.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser2b(
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browsers.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser2a.reset();
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)  browser2b.reset();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, last_opened_profiles.size());
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile1, last_opened_profiles[0]);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser1.reset();
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles = profile_manager->GetLastOpenedProfiles();
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, last_opened_profiles.size());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_ANDROID)
612