blob: 671a1a91f30071a8cb08ac83beee47c084169168 [file] [log] [blame]
[email protected]52edf812012-01-12 11:48:461// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]d99bcaa2010-12-05 20:15:565#include <string>
6
[email protected]943aed5542010-06-11 15:57:087#include "base/command_line.h"
thestig18dfb7a52014-08-26 10:44:048#include "base/files/file_util.h"
[email protected]ea1a3f62012-11-16 20:34:239#include "base/files/scoped_temp_dir.h"
initial.commit09911bf2008-07-26 23:55:2910#include "base/path_service.h"
[email protected]37ac95b2013-07-23 23:39:3511#include "base/run_loop.h"
[email protected]e309f312013-06-07 21:50:0812#include "base/strings/utf_string_conversions.h"
[email protected]29d70252011-04-28 02:16:5813#include "base/values.h"
[email protected]775caec2011-09-01 17:14:3214#include "build/build_config.h"
[email protected]5114d182012-07-30 23:09:4915#include "chrome/browser/bookmarks/bookmark_model_factory.h"
[email protected]583844c2011-08-27 00:38:3516#include "chrome/browser/browser_process.h"
[email protected]25ff0862013-07-12 00:59:0317#include "chrome/browser/chrome_notification_types.h"
[email protected]363f5272013-04-23 17:21:4218#include "chrome/browser/chromeos/settings/cros_settings.h"
[email protected]6a2c09f2013-01-25 04:50:0719#include "chrome/browser/history/history_service.h"
[email protected]9718a722012-06-19 20:10:5320#include "chrome/browser/history/history_service_factory.h"
[email protected]63e26822011-07-16 19:07:3521#include "chrome/browser/io_thread.h"
[email protected]81ad7f4a2011-03-16 01:33:2922#include "chrome/browser/prefs/browser_prefs.h"
[email protected]13720532013-05-30 12:30:5923#include "chrome/browser/prefs/incognito_mode_prefs.h"
[email protected]8ecad5e2010-12-02 21:18:3324#include "chrome/browser/profiles/profile.h"
[email protected]c3e559772014-04-09 04:02:5425#include "chrome/browser/profiles/profile_avatar_icon_util.h"
[email protected]279170832011-10-12 23:38:0326#include "chrome/browser/profiles/profile_info_cache.h"
[email protected]8ecad5e2010-12-02 21:18:3327#include "chrome/browser/profiles/profile_manager.h"
[email protected]3f130532014-02-26 20:39:2428#include "chrome/browser/profiles/profiles_state.h"
[email protected]d8748142012-05-16 21:13:4329#include "chrome/browser/ui/browser.h"
[email protected]943aed5542010-06-11 15:57:0830#include "chrome/common/chrome_constants.h"
initial.commit09911bf2008-07-26 23:55:2931#include "chrome/common/chrome_paths.h"
[email protected]943aed5542010-06-11 15:57:0832#include "chrome/common/chrome_switches.h"
[email protected]29d70252011-04-28 02:16:5833#include "chrome/common/pref_names.h"
[email protected]af39f002014-08-22 10:18:1834#include "chrome/grit/generated_resources.h"
[email protected]7688968a2013-02-12 21:45:1335#include "chrome/test/base/scoped_testing_local_state.h"
[email protected]a4fe67012012-07-25 20:14:2936#include "chrome/test/base/test_browser_window.h"
[email protected]583844c2011-08-27 00:38:3537#include "chrome/test/base/testing_browser_process.h"
[email protected]537c1082011-12-02 02:37:1738#include "chrome/test/base/testing_profile.h"
[email protected]29896ee2014-06-17 17:20:5339#include "components/signin/core/common/profile_management_switches.h"
[email protected]ad50def52011-10-19 23:17:0740#include "content/public/browser/notification_service.h"
[email protected]f9357a442014-05-15 18:44:0741#include "content/public/common/content_switches.h"
[email protected]37ac95b2013-07-23 23:39:3542#include "content/public/test/test_browser_thread_bundle.h"
[email protected]844a1002011-04-19 11:37:2143#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2944#include "testing/gtest/include/gtest/gtest.h"
[email protected]3f130532014-02-26 20:39:2445#include "ui/base/l10n/l10n_util.h"
initial.commit09911bf2008-07-26 23:55:2946
[email protected]775caec2011-09-01 17:14:3247#if defined(OS_CHROMEOS)
dzhioev0298d722014-08-26 13:18:5248#include "chrome/browser/chromeos/login/users/fake_user_manager.h"
[email protected]4d390782014-08-15 09:22:5849#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
dzhioev0298d722014-08-26 13:18:5250#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
51#include "chrome/browser/chromeos/profiles/profile_helper.h"
[email protected]363f5272013-04-23 17:21:4252#include "chrome/browser/chromeos/settings/cros_settings.h"
[email protected]e4854dc2013-04-24 00:11:5153#include "chrome/browser/chromeos/settings/device_settings_service.h"
[email protected]931d1042013-04-05 17:50:4454#include "chromeos/chromeos_switches.h"
[email protected]4c40e062014-07-09 21:22:5155#include "chromeos/login/user_names.h"
[email protected]4d390782014-08-15 09:22:5856#include "components/user_manager/user_manager.h"
dzhioev0298d722014-08-26 13:18:5257#endif // defined(OS_CHROMEOS)
[email protected]775caec2011-09-01 17:14:3258
[email protected]6778fed2013-12-24 20:09:3759using base::ASCIIToUTF16;
[email protected]631bb742011-11-02 11:29:3960using content::BrowserThread;
61
[email protected]844a1002011-04-19 11:37:2162namespace {
[email protected]f4e706252012-01-10 17:11:3663
[email protected]844a1002011-04-19 11:37:2164// This global variable is used to check that value returned to different
65// observers is the same.
66Profile* g_created_profile;
67
[email protected]9819fd02013-08-22 10:49:3968class UnittestProfileManager : public ::ProfileManagerWithoutInit {
[email protected]537c1082011-12-02 02:37:1769 public:
[email protected]9819fd02013-08-22 10:49:3970 explicit UnittestProfileManager(const base::FilePath& user_data_dir)
[email protected]537c1082011-12-02 02:37:1771 : ::ProfileManagerWithoutInit(user_data_dir) {}
72
73 protected:
dcheng1fd716382014-10-22 20:14:4174 Profile* CreateProfileHelper(const base::FilePath& file_path) override {
[email protected]7567484142013-07-11 17:36:0775 if (!base::PathExists(file_path)) {
[email protected]426d1c92013-12-03 20:08:5476 if (!base::CreateDirectory(file_path))
[email protected]537c1082011-12-02 02:37:1777 return NULL;
78 }
79 return new TestingProfile(file_path, NULL);
80 }
81
dcheng1fd716382014-10-22 20:14:4182 Profile* CreateProfileAsyncHelper(const base::FilePath& path,
83 Delegate* delegate) override {
[email protected]537c1082011-12-02 02:37:1784 // This is safe while all file operations are done on the FILE thread.
85 BrowserThread::PostTask(
86 BrowserThread::FILE, FROM_HERE,
[email protected]426d1c92013-12-03 20:08:5487 base::Bind(base::IgnoreResult(&base::CreateDirectory), path));
[email protected]537c1082011-12-02 02:37:1788
89 return new TestingProfile(path, this);
90 }
91};
92
[email protected]9819fd02013-08-22 10:49:3993} // namespace
[email protected]537c1082011-12-02 02:37:1794
[email protected]583844c2011-08-27 00:38:3595class ProfileManagerTest : public testing::Test {
[email protected]ee5e3792009-10-13 23:23:4796 protected:
[email protected]f4e706252012-01-10 17:11:3697 class MockObserver {
98 public:
99 MOCK_METHOD2(OnProfileCreated,
100 void(Profile* profile, Profile::CreateStatus status));
101 };
102
[email protected]6cad5bf2011-03-10 21:21:55103 ProfileManagerTest()
[email protected]37ac95b2013-07-23 23:39:35104 : local_state_(TestingBrowserProcess::GetGlobal()) {
[email protected]cb0e4f12009-12-03 00:09:09105 }
106
dchenge1bc7982014-10-30 00:32:40107 void SetUp() override {
[email protected]3a305db2011-04-12 13:40:53108 // Create a new temporary directory, and store the path
109 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
[email protected]c494d082013-01-04 20:41:22110 TestingBrowserProcess::GetGlobal()->SetProfileManager(
[email protected]9819fd02013-08-22 10:49:39111 new UnittestProfileManager(temp_dir_.path()));
[email protected]f89b50f2012-08-16 21:36:50112
[email protected]537c1082011-12-02 02:37:17113#if defined(OS_CHROMEOS)
dzhioev0298d722014-08-26 13:18:52114 CommandLine* cl = CommandLine::ForCurrentProcess();
115 cl->AppendSwitch(switches::kTestType);
[email protected]537c1082011-12-02 02:37:17116#endif
initial.commit09911bf2008-07-26 23:55:29117 }
[email protected]81ad7f4a2011-03-16 01:33:29118
dchenge1bc7982014-10-30 00:32:40119 void TearDown() override {
[email protected]c494d082013-01-04 20:41:22120 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
[email protected]37ac95b2013-07-23 23:39:35121 base::RunLoop().RunUntilIdle();
initial.commit09911bf2008-07-26 23:55:29122 }
[email protected]f0a51fb52009-03-05 12:46:38123
[email protected]1c62b2f2013-06-28 00:15:00124 // Helper function to create a profile with |name| for a profile |manager|.
125 void CreateProfileAsync(ProfileManager* manager,
126 const std::string& name,
[email protected]d20d0432014-06-12 17:14:05127 bool is_supervised,
[email protected]1c62b2f2013-06-28 00:15:00128 MockObserver* mock_observer) {
129 manager->CreateProfileAsync(
130 temp_dir_.path().AppendASCII(name),
131 base::Bind(&MockObserver::OnProfileCreated,
132 base::Unretained(mock_observer)),
[email protected]6778fed2013-12-24 20:09:37133 base::UTF8ToUTF16(name),
[email protected]c3e559772014-04-09 04:02:54134 base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(0)),
[email protected]d20d0432014-06-12 17:14:05135 is_supervised ? "Dummy ID" : std::string());
[email protected]1c62b2f2013-06-28 00:15:00136 }
137
[email protected]3f130532014-02-26 20:39:24138 // Helper function to add a profile with |profile_name| to
139 // |profile_manager|'s ProfileInfoCache, and return the profile created.
140 Profile* AddProfileToCache(ProfileManager* profile_manager,
141 const std::string& path_suffix,
142 const base::string16& profile_name) {
143 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
144 size_t num_profiles = cache.GetNumberOfProfiles();
145 base::FilePath path = temp_dir_.path().AppendASCII(path_suffix);
146 cache.AddProfileToCache(path, profile_name,
147 base::string16(), 0, std::string());
148 EXPECT_EQ(num_profiles + 1, cache.GetNumberOfProfiles());
149 return profile_manager->GetProfile(path);
150 }
151
[email protected]6f96cbcb2011-11-04 02:26:07152#if defined(OS_CHROMEOS)
dzhioev0298d722014-08-26 13:18:52153 // Helper function to register an user with id |user_id| and create profile
154 // with a correct path.
155 void RegisterUser(const std::string& user_id) {
156 chromeos::ProfileHelper* profile_helper = chromeos::ProfileHelper::Get();
157 const std::string user_id_hash =
158 profile_helper->GetUserIdHashByUserIdForTesting(user_id);
159 user_manager::UserManager::Get()->UserLoggedIn(
160 user_id, user_id_hash, false);
161 g_browser_process->profile_manager()->GetProfile(
162 profile_helper->GetProfilePathByUserIdHash(user_id_hash));
163 }
164
[email protected]e4854dc2013-04-24 00:11:51165 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
[email protected]363f5272013-04-23 17:21:42166 chromeos::ScopedTestCrosSettings test_cros_settings_;
[email protected]6f96cbcb2011-11-04 02:26:07167#endif
168
[email protected]3a305db2011-04-12 13:40:53169 // The path to temporary directory used to contain the test operations.
[email protected]ea1a3f62012-11-16 20:34:23170 base::ScopedTempDir temp_dir_;
[email protected]63e26822011-07-16 19:07:35171 ScopedTestingLocalState local_state_;
[email protected]37ac95b2013-07-23 23:39:35172
173 content::TestBrowserThreadBundle thread_bundle_;
[email protected]363f5272013-04-23 17:21:42174
175#if defined(OS_CHROMEOS)
176 chromeos::ScopedTestUserManager test_user_manager_;
177#endif
dzhioev0298d722014-08-26 13:18:52178
179 DISALLOW_COPY_AND_ASSIGN(ProfileManagerTest);
initial.commit09911bf2008-07-26 23:55:29180};
181
[email protected]844a1002011-04-19 11:37:21182TEST_F(ProfileManagerTest, GetProfile) {
[email protected]650b2d52013-02-10 03:41:45183 base::FilePath dest_path = temp_dir_.path();
[email protected]f7011fcb2009-01-28 21:54:32184 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
initial.commit09911bf2008-07-26 23:55:29185
[email protected]881cb0b62011-12-13 20:39:54186 ProfileManager* profile_manager = g_browser_process->profile_manager();
187
initial.commit09911bf2008-07-26 23:55:29188 // Successfully create a profile.
[email protected]f4e706252012-01-10 17:11:36189 Profile* profile = profile_manager->GetProfile(dest_path);
[email protected]844a1002011-04-19 11:37:21190 EXPECT_TRUE(profile);
initial.commit09911bf2008-07-26 23:55:29191
[email protected]844a1002011-04-19 11:37:21192 // The profile already exists when we call GetProfile. Just load it.
[email protected]881cb0b62011-12-13 20:39:54193 EXPECT_EQ(profile, profile_manager->GetProfile(dest_path));
initial.commit09911bf2008-07-26 23:55:29194}
[email protected]55474b572009-04-14 22:05:33195
[email protected]943aed5542010-06-11 15:57:08196TEST_F(ProfileManagerTest, DefaultProfileDir) {
[email protected]650b2d52013-02-10 03:41:45197 base::FilePath expected_default =
198 base::FilePath().AppendASCII(chrome::kInitialProfile);
[email protected]881cb0b62011-12-13 20:39:54199 EXPECT_EQ(
200 expected_default.value(),
201 g_browser_process->profile_manager()->GetInitialProfileDir().value());
[email protected]943aed5542010-06-11 15:57:08202}
203
skuhne24bb24432014-09-08 19:31:47204MATCHER(NotFail, "Profile creation failure status is not reported.") {
205 return arg == Profile::CREATE_STATUS_CREATED ||
206 arg == Profile::CREATE_STATUS_INITIALIZED;
207}
208
209MATCHER(SameNotNull, "The same non-NULL value for all calls.") {
210 if (!g_created_profile)
211 g_created_profile = arg;
212 return arg != NULL && arg == g_created_profile;
213}
214
[email protected]943aed5542010-06-11 15:57:08215#if defined(OS_CHROMEOS)
dzhioev0298d722014-08-26 13:18:52216
[email protected]943aed5542010-06-11 15:57:08217// This functionality only exists on Chrome OS.
218TEST_F(ProfileManagerTest, LoggedInProfileDir) {
[email protected]650b2d52013-02-10 03:41:45219 base::FilePath expected_default =
220 base::FilePath().AppendASCII(chrome::kInitialProfile);
[email protected]881cb0b62011-12-13 20:39:54221 ProfileManager* profile_manager = g_browser_process->profile_manager();
[email protected]943aed5542010-06-11 15:57:08222 EXPECT_EQ(expected_default.value(),
[email protected]881cb0b62011-12-13 20:39:54223 profile_manager->GetInitialProfileDir().value());
[email protected]943aed5542010-06-11 15:57:08224
dzhioev0298d722014-08-26 13:18:52225 const char kTestUserName[] = "[email protected]";
226 chromeos::FakeUserManager* user_manager = new chromeos::FakeUserManager();
227 chromeos::ScopedUserManagerEnabler enabler(user_manager);
228
229 const user_manager::User* active_user = user_manager->AddUser(kTestUserName);
230 user_manager->LoginUser(kTestUserName);
231 user_manager->SwitchActiveUser(kTestUserName);
232
[email protected]2fda9972014-07-23 14:51:59233 profile_manager->Observe(
234 chrome::NOTIFICATION_LOGIN_USER_CHANGED,
235 content::NotificationService::AllSources(),
236 content::Details<const user_manager::User>(active_user));
dzhioev0298d722014-08-26 13:18:52237 base::FilePath expected_logged_in(
238 chromeos::ProfileHelper::GetUserProfileDir(active_user->username_hash()));
[email protected]943aed5542010-06-11 15:57:08239 EXPECT_EQ(expected_logged_in.value(),
[email protected]881cb0b62011-12-13 20:39:54240 profile_manager->GetInitialProfileDir().value());
[email protected]3a305db2011-04-12 13:40:53241 VLOG(1) << temp_dir_.path().Append(
[email protected]881cb0b62011-12-13 20:39:54242 profile_manager->GetInitialProfileDir()).value();
[email protected]943aed5542010-06-11 15:57:08243}
244
245#endif
246
[email protected]52d69b882010-06-17 17:35:51247TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) {
[email protected]650b2d52013-02-10 03:41:45248 base::FilePath dest_path1 = temp_dir_.path();
[email protected]55474b572009-04-14 22:05:33249 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
[email protected]ee5e3792009-10-13 23:23:47250
[email protected]650b2d52013-02-10 03:41:45251 base::FilePath dest_path2 = temp_dir_.path();
[email protected]55474b572009-04-14 22:05:33252 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
253
[email protected]881cb0b62011-12-13 20:39:54254 ProfileManager* profile_manager = g_browser_process->profile_manager();
255
[email protected]55474b572009-04-14 22:05:33256 // Successfully create the profiles.
[email protected]537c1082011-12-02 02:37:17257 TestingProfile* profile1 =
[email protected]881cb0b62011-12-13 20:39:54258 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
[email protected]844a1002011-04-19 11:37:21259 ASSERT_TRUE(profile1);
[email protected]55474b572009-04-14 22:05:33260
[email protected]537c1082011-12-02 02:37:17261 TestingProfile* profile2 =
[email protected]881cb0b62011-12-13 20:39:54262 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
[email protected]844a1002011-04-19 11:37:21263 ASSERT_TRUE(profile2);
[email protected]55474b572009-04-14 22:05:33264
265 // Force lazy-init of some profile services to simulate use.
[email protected]608e7e02013-07-24 12:23:31266 ASSERT_TRUE(profile1->CreateHistoryService(true, false));
[email protected]9718a722012-06-19 20:10:53267 EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile1,
268 Profile::EXPLICIT_ACCESS));
[email protected]537c1082011-12-02 02:37:17269 profile1->CreateBookmarkModel(true);
[email protected]5114d182012-07-30 23:09:49270 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1));
[email protected]537c1082011-12-02 02:37:17271 profile2->CreateBookmarkModel(true);
[email protected]5114d182012-07-30 23:09:49272 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2));
[email protected]608e7e02013-07-24 12:23:31273 ASSERT_TRUE(profile2->CreateHistoryService(true, false));
[email protected]9718a722012-06-19 20:10:53274 EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2,
275 Profile::EXPLICIT_ACCESS));
[email protected]6cad5bf2011-03-10 21:21:55276
277 // Make sure any pending tasks run before we destroy the profiles.
[email protected]37ac95b2013-07-23 23:39:35278 base::RunLoop().RunUntilIdle();
[email protected]6cad5bf2011-03-10 21:21:55279
[email protected]c494d082013-01-04 20:41:22280 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL);
[email protected]6cad5bf2011-03-10 21:21:55281
[email protected]237e6d02010-11-08 21:45:42282 // Make sure history cleans up correctly.
[email protected]37ac95b2013-07-23 23:39:35283 base::RunLoop().RunUntilIdle();
[email protected]55474b572009-04-14 22:05:33284}
[email protected]844a1002011-04-19 11:37:21285
[email protected]844a1002011-04-19 11:37:21286TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) {
[email protected]844a1002011-04-19 11:37:21287 g_created_profile = NULL;
288
289 MockObserver mock_observer1;
[email protected]e547ac82011-07-25 12:34:11290 EXPECT_CALL(mock_observer1, OnProfileCreated(
291 SameNotNull(), NotFail())).Times(testing::AtLeast(1));
[email protected]844a1002011-04-19 11:37:21292 MockObserver mock_observer2;
[email protected]e547ac82011-07-25 12:34:11293 EXPECT_CALL(mock_observer2, OnProfileCreated(
294 SameNotNull(), NotFail())).Times(testing::AtLeast(1));
[email protected]844a1002011-04-19 11:37:21295 MockObserver mock_observer3;
[email protected]e547ac82011-07-25 12:34:11296 EXPECT_CALL(mock_observer3, OnProfileCreated(
297 SameNotNull(), NotFail())).Times(testing::AtLeast(1));
[email protected]844a1002011-04-19 11:37:21298
[email protected]881cb0b62011-12-13 20:39:54299 ProfileManager* profile_manager = g_browser_process->profile_manager();
[email protected]1c62b2f2013-06-28 00:15:00300 const std::string profile_name = "New Profile";
[email protected]5ddfade2014-02-03 10:24:53301 CreateProfileAsync(profile_manager, profile_name, false, &mock_observer1);
302 CreateProfileAsync(profile_manager, profile_name, false, &mock_observer2);
303 CreateProfileAsync(profile_manager, profile_name, false, &mock_observer3);
[email protected]844a1002011-04-19 11:37:21304
[email protected]37ac95b2013-07-23 23:39:35305 base::RunLoop().RunUntilIdle();
[email protected]844a1002011-04-19 11:37:21306}
307
308TEST_F(ProfileManagerTest, CreateProfilesAsync) {
[email protected]1c62b2f2013-06-28 00:15:00309 const std::string profile_name1 = "New Profile 1";
310 const std::string profile_name2 = "New Profile 2";
[email protected]844a1002011-04-19 11:37:21311
312 MockObserver mock_observer;
[email protected]e547ac82011-07-25 12:34:11313 EXPECT_CALL(mock_observer, OnProfileCreated(
314 testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
[email protected]844a1002011-04-19 11:37:21315
[email protected]881cb0b62011-12-13 20:39:54316 ProfileManager* profile_manager = g_browser_process->profile_manager();
317
[email protected]5ddfade2014-02-03 10:24:53318 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
319 CreateProfileAsync(profile_manager, profile_name2, false, &mock_observer);
[email protected]844a1002011-04-19 11:37:21320
[email protected]37ac95b2013-07-23 23:39:35321 base::RunLoop().RunUntilIdle();
[email protected]844a1002011-04-19 11:37:21322}
[email protected]279170832011-10-12 23:38:03323
[email protected]5ddfade2014-02-03 10:24:53324TEST_F(ProfileManagerTest, CreateProfileAsyncCheckOmitted) {
[email protected]d20d0432014-06-12 17:14:05325 std::string name = "0 Supervised Profile";
[email protected]5ddfade2014-02-03 10:24:53326
327 MockObserver mock_observer;
328 EXPECT_CALL(mock_observer, OnProfileCreated(
329 testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
330
331 ProfileManager* profile_manager = g_browser_process->profile_manager();
332 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
333 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
334
335 CreateProfileAsync(profile_manager, name, true, &mock_observer);
336 base::RunLoop().RunUntilIdle();
337
338 EXPECT_EQ(1u, cache.GetNumberOfProfiles());
[email protected]d20d0432014-06-12 17:14:05339 // Supervised profiles should start out omitted from the profile list.
[email protected]5ddfade2014-02-03 10:24:53340 EXPECT_TRUE(cache.IsOmittedProfileAtIndex(0));
341
[email protected]d20d0432014-06-12 17:14:05342 name = "1 Regular Profile";
[email protected]5ddfade2014-02-03 10:24:53343 CreateProfileAsync(profile_manager, name, false, &mock_observer);
344 base::RunLoop().RunUntilIdle();
345
346 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
[email protected]d20d0432014-06-12 17:14:05347 // Non-supervised profiles should be included in the profile list.
[email protected]5ddfade2014-02-03 10:24:53348 EXPECT_FALSE(cache.IsOmittedProfileAtIndex(1));
349}
350
351TEST_F(ProfileManagerTest, AddProfileToCacheCheckOmitted) {
352 ProfileManager* profile_manager = g_browser_process->profile_manager();
353 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
354 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
355
[email protected]d20d0432014-06-12 17:14:05356 const base::FilePath supervised_path =
357 temp_dir_.path().AppendASCII("Supervised");
358 TestingProfile* supervised_profile =
359 new TestingProfile(supervised_path, NULL);
360 supervised_profile->GetPrefs()->SetString(prefs::kSupervisedUserId, "An ID");
[email protected]5ddfade2014-02-03 10:24:53361
362 // RegisterTestingProfile adds the profile to the cache and takes ownership.
[email protected]d20d0432014-06-12 17:14:05363 profile_manager->RegisterTestingProfile(supervised_profile, true, false);
[email protected]5ddfade2014-02-03 10:24:53364 EXPECT_EQ(1u, cache.GetNumberOfProfiles());
365 EXPECT_TRUE(cache.IsOmittedProfileAtIndex(0));
366
[email protected]d20d0432014-06-12 17:14:05367 const base::FilePath nonsupervised_path = temp_dir_.path().AppendASCII(
368 "Non-Supervised");
369 TestingProfile* nonsupervised_profile = new TestingProfile(nonsupervised_path,
370 NULL);
371 profile_manager->RegisterTestingProfile(nonsupervised_profile, true, false);
[email protected]5ddfade2014-02-03 10:24:53372
373 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
[email protected]d20d0432014-06-12 17:14:05374 size_t supervised_index = cache.GetIndexOfProfileWithPath(supervised_path);
375 EXPECT_TRUE(cache.IsOmittedProfileAtIndex(supervised_index));
376 size_t nonsupervised_index =
377 cache.GetIndexOfProfileWithPath(nonsupervised_path);
378 EXPECT_FALSE(cache.IsOmittedProfileAtIndex(nonsupervised_index));
[email protected]5ddfade2014-02-03 10:24:53379}
380
[email protected]4251165a2013-07-17 04:33:40381TEST_F(ProfileManagerTest, GetGuestProfilePath) {
382 base::FilePath guest_path = ProfileManager::GetGuestProfilePath();
383 base::FilePath expected_path = temp_dir_.path();
384 expected_path = expected_path.Append(chrome::kGuestProfileDir);
385 EXPECT_EQ(expected_path, guest_path);
386}
387
[email protected]0ff6198e2014-01-08 22:45:00388class UnittestGuestProfileManager : public UnittestProfileManager {
389 public:
390 explicit UnittestGuestProfileManager(const base::FilePath& user_data_dir)
391 : UnittestProfileManager(user_data_dir) {}
392
393 protected:
dcheng1fd716382014-10-22 20:14:41394 Profile* CreateProfileHelper(const base::FilePath& file_path) override {
[email protected]0ff6198e2014-01-08 22:45:00395 TestingProfile::Builder builder;
[email protected]0ff6198e2014-01-08 22:45:00396 builder.SetGuestSession();
[email protected]d22f7c932014-02-20 22:48:58397 builder.SetPath(file_path);
398 TestingProfile* testing_profile = builder.Build().release();
[email protected]0ff6198e2014-01-08 22:45:00399 return testing_profile;
400 }
401};
402
[email protected]9b6e10c2014-05-20 19:12:28403class ProfileManagerGuestTest : public ProfileManagerTest {
[email protected]0ff6198e2014-01-08 22:45:00404 protected:
dchenge1bc7982014-10-30 00:32:40405 void SetUp() override {
[email protected]0ff6198e2014-01-08 22:45:00406 // Create a new temporary directory, and store the path
407 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
408 TestingBrowserProcess::GetGlobal()->SetProfileManager(
409 new UnittestGuestProfileManager(temp_dir_.path()));
410
[email protected]2a92f2182014-03-25 00:47:59411#if defined(OS_CHROMEOS)
[email protected]0ff6198e2014-01-08 22:45:00412 CommandLine* cl = CommandLine::ForCurrentProcess();
[email protected]9b6e10c2014-05-20 19:12:28413 // This switch is needed to skip non-test specific behavior in
414 // ProfileManager (accessing DBusThreadManager).
[email protected]0ff6198e2014-01-08 22:45:00415 cl->AppendSwitch(switches::kTestType);
[email protected]9b6e10c2014-05-20 19:12:28416
[email protected]0ff6198e2014-01-08 22:45:00417 cl->AppendSwitch(chromeos::switches::kGuestSession);
418 cl->AppendSwitch(::switches::kIncognito);
419
dzhioev0298d722014-08-26 13:18:52420 RegisterUser(chromeos::login::kGuestUserName);
[email protected]2a92f2182014-03-25 00:47:59421#endif
[email protected]0ff6198e2014-01-08 22:45:00422 }
423};
424
[email protected]9b6e10c2014-05-20 19:12:28425TEST_F(ProfileManagerGuestTest, GetLastUsedProfileAllowedByPolicy) {
[email protected]2a92f2182014-03-25 00:47:59426 ProfileManager* profile_manager = g_browser_process->profile_manager();
427 ASSERT_TRUE(profile_manager);
428
429 Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy();
430 ASSERT_TRUE(profile);
431 EXPECT_TRUE(profile->IsOffTheRecord());
432}
433
434#if defined(OS_CHROMEOS)
[email protected]9b6e10c2014-05-20 19:12:28435TEST_F(ProfileManagerGuestTest, GuestProfileIngonito) {
[email protected]0ff6198e2014-01-08 22:45:00436 Profile* primary_profile = ProfileManager::GetPrimaryUserProfile();
437 EXPECT_TRUE(primary_profile->IsOffTheRecord());
438
439 Profile* active_profile = ProfileManager::GetActiveUserProfile();
440 EXPECT_TRUE(active_profile->IsOffTheRecord());
441
442 EXPECT_TRUE(active_profile->IsSameProfile(primary_profile));
[email protected]d22f7c932014-02-20 22:48:58443
444 Profile* last_used_profile = ProfileManager::GetLastUsedProfile();
445 EXPECT_TRUE(last_used_profile->IsOffTheRecord());
446
447 EXPECT_TRUE(last_used_profile->IsSameProfile(active_profile));
[email protected]0ff6198e2014-01-08 22:45:00448}
449#endif
450
[email protected]279170832011-10-12 23:38:03451TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) {
[email protected]881cb0b62011-12-13 20:39:54452 ProfileManager* profile_manager = g_browser_process->profile_manager();
453 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
[email protected]714bf1d2012-11-30 01:35:27454 local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
[email protected]012d1312014-07-17 06:37:40455 new base::FundamentalValue(true));
[email protected]714bf1d2012-11-30 01:35:27456
457 // Setting a pref which is not applicable to a system (i.e., Android in this
458 // case) does not necessarily create it. Don't bother continuing with the
459 // test if this pref doesn't exist because it will not load the profiles if
460 // it cannot verify that the pref for background mode is enabled.
461 if (!local_state_.Get()->HasPrefPath(prefs::kBackgroundModeEnabled))
462 return;
[email protected]279170832011-10-12 23:38:03463
464 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
465 cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
[email protected]a04db822013-12-11 19:14:40466 ASCIIToUTF16("name_1"), base::string16(), 0,
467 std::string());
[email protected]279170832011-10-12 23:38:03468 cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
[email protected]a04db822013-12-11 19:14:40469 ASCIIToUTF16("name_2"), base::string16(), 0,
470 std::string());
[email protected]279170832011-10-12 23:38:03471 cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_3"),
[email protected]a04db822013-12-11 19:14:40472 ASCIIToUTF16("name_3"), base::string16(), 0,
473 std::string());
[email protected]279170832011-10-12 23:38:03474 cache.SetBackgroundStatusOfProfileAtIndex(0, true);
475 cache.SetBackgroundStatusOfProfileAtIndex(2, true);
476 EXPECT_EQ(3u, cache.GetNumberOfProfiles());
477
[email protected]881cb0b62011-12-13 20:39:54478 profile_manager->AutoloadProfiles();
[email protected]279170832011-10-12 23:38:03479
[email protected]881cb0b62011-12-13 20:39:54480 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
481}
482
[email protected]714bf1d2012-11-30 01:35:27483TEST_F(ProfileManagerTest, DoNotAutoloadProfilesIfBackgroundModeOff) {
484 ProfileManager* profile_manager = g_browser_process->profile_manager();
485 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
486 local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled,
[email protected]012d1312014-07-17 06:37:40487 new base::FundamentalValue(false));
[email protected]714bf1d2012-11-30 01:35:27488
489 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
490 cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_1"),
[email protected]a04db822013-12-11 19:14:40491 ASCIIToUTF16("name_1"), base::string16(), 0,
492 std::string());
[email protected]714bf1d2012-11-30 01:35:27493 cache.AddProfileToCache(cache.GetUserDataDir().AppendASCII("path_2"),
[email protected]a04db822013-12-11 19:14:40494 ASCIIToUTF16("name_2"), base::string16(), 0,
495 std::string());
[email protected]714bf1d2012-11-30 01:35:27496 cache.SetBackgroundStatusOfProfileAtIndex(0, false);
497 cache.SetBackgroundStatusOfProfileAtIndex(1, true);
498 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
499
500 profile_manager->AutoloadProfiles();
501
502 EXPECT_EQ(0u, profile_manager->GetLoadedProfiles().size());
503}
504
[email protected]881cb0b62011-12-13 20:39:54505TEST_F(ProfileManagerTest, InitProfileUserPrefs) {
[email protected]650b2d52013-02-10 03:41:45506 base::FilePath dest_path = temp_dir_.path();
[email protected]881cb0b62011-12-13 20:39:54507 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
508
509 ProfileManager* profile_manager = g_browser_process->profile_manager();
510
511 Profile* profile;
512
513 // Successfully create the profile
514 profile = profile_manager->GetProfile(dest_path);
515 ASSERT_TRUE(profile);
516
517 // Check that the profile name is non empty
518 std::string profile_name =
519 profile->GetPrefs()->GetString(prefs::kProfileName);
520 EXPECT_FALSE(profile_name.empty());
521
522 // Check that the profile avatar index is valid
523 size_t avatar_index =
524 profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
[email protected]c3e559772014-04-09 04:02:54525 EXPECT_TRUE(profiles::IsDefaultAvatarIconIndex(
[email protected]881cb0b62011-12-13 20:39:54526 avatar_index));
527}
528
529// Tests that a new profile's entry in the profile info cache is setup with the
530// same values that are in the profile prefs.
531TEST_F(ProfileManagerTest, InitProfileInfoCacheForAProfile) {
[email protected]650b2d52013-02-10 03:41:45532 base::FilePath dest_path = temp_dir_.path();
[email protected]881cb0b62011-12-13 20:39:54533 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile"));
534
535 ProfileManager* profile_manager = g_browser_process->profile_manager();
536 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
537
538 // Successfully create the profile
539 Profile* profile = profile_manager->GetProfile(dest_path);
540 ASSERT_TRUE(profile);
541
542 std::string profile_name =
543 profile->GetPrefs()->GetString(prefs::kProfileName);
544 size_t avatar_index =
545 profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
546
547 size_t profile_index = cache.GetIndexOfProfileWithPath(dest_path);
548
549 // Check if the profile prefs are the same as the cache prefs
550 EXPECT_EQ(profile_name,
[email protected]6778fed2013-12-24 20:09:37551 base::UTF16ToUTF8(cache.GetNameOfProfileAtIndex(profile_index)));
[email protected]881cb0b62011-12-13 20:39:54552 EXPECT_EQ(avatar_index,
553 cache.GetAvatarIconIndexOfProfileAtIndex(profile_index));
[email protected]279170832011-10-12 23:38:03554}
[email protected]52edf812012-01-12 11:48:46555
[email protected]13720532013-05-30 12:30:59556TEST_F(ProfileManagerTest, GetLastUsedProfileAllowedByPolicy) {
557 ProfileManager* profile_manager = g_browser_process->profile_manager();
558 ASSERT_TRUE(profile_manager);
559
dzhioev0298d722014-08-26 13:18:52560#if defined(OS_CHROMEOS)
561 // On CrOS, profile returned by GetLastUsedProfile is a singin profile that
562 // is forced to be incognito. That's why we need to create at least one user
563 // to get a regular profile.
564 RegisterUser("[email protected]");
565#endif
566
[email protected]13720532013-05-30 12:30:59567 Profile* profile = profile_manager->GetLastUsedProfileAllowedByPolicy();
568 ASSERT_TRUE(profile);
569 EXPECT_FALSE(profile->IsOffTheRecord());
570 PrefService* prefs = profile->GetPrefs();
571 EXPECT_EQ(IncognitoModePrefs::ENABLED,
572 IncognitoModePrefs::GetAvailability(prefs));
573
[email protected]13720532013-05-30 12:30:59574 ASSERT_TRUE(profile->GetOffTheRecordProfile());
575
576 IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::DISABLED);
577 EXPECT_FALSE(
578 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
579
580 // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when
581 // incognito mode is forced.
582 IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED);
583 EXPECT_TRUE(
584 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
585}
586
[email protected]c849fab2012-03-29 16:51:41587#if !defined(OS_ANDROID)
588// There's no Browser object on Android.
[email protected]52edf812012-01-12 11:48:46589TEST_F(ProfileManagerTest, LastOpenedProfiles) {
[email protected]650b2d52013-02-10 03:41:45590 base::FilePath dest_path1 = temp_dir_.path();
[email protected]52edf812012-01-12 11:48:46591 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
592
[email protected]650b2d52013-02-10 03:41:45593 base::FilePath dest_path2 = temp_dir_.path();
[email protected]52edf812012-01-12 11:48:46594 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
595
596 ProfileManager* profile_manager = g_browser_process->profile_manager();
597
598 // Successfully create the profiles.
599 TestingProfile* profile1 =
600 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
601 ASSERT_TRUE(profile1);
602
603 TestingProfile* profile2 =
604 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
605 ASSERT_TRUE(profile2);
606
607 std::vector<Profile*> last_opened_profiles =
608 profile_manager->GetLastOpenedProfiles();
609 ASSERT_EQ(0U, last_opened_profiles.size());
610
611 // Create a browser for profile1.
[email protected]ed2fa722013-06-25 20:37:34612 Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29613 scoped_ptr<Browser> browser1a(
[email protected]c5f3e1842013-02-20 17:10:41614 chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
[email protected]52edf812012-01-12 11:48:46615
616 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
617 ASSERT_EQ(1U, last_opened_profiles.size());
618 EXPECT_EQ(profile1, last_opened_profiles[0]);
619
620 // And for profile2.
[email protected]ed2fa722013-06-25 20:37:34621 Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29622 scoped_ptr<Browser> browser2(
[email protected]c5f3e1842013-02-20 17:10:41623 chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
[email protected]52edf812012-01-12 11:48:46624
625 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
626 ASSERT_EQ(2U, last_opened_profiles.size());
627 EXPECT_EQ(profile1, last_opened_profiles[0]);
628 EXPECT_EQ(profile2, last_opened_profiles[1]);
629
630 // Adding more browsers doesn't change anything.
[email protected]a4fe67012012-07-25 20:14:29631 scoped_ptr<Browser> browser1b(
[email protected]c5f3e1842013-02-20 17:10:41632 chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
[email protected]52edf812012-01-12 11:48:46633 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
634 ASSERT_EQ(2U, last_opened_profiles.size());
635 EXPECT_EQ(profile1, last_opened_profiles[0]);
636 EXPECT_EQ(profile2, last_opened_profiles[1]);
637
638 // Close the browsers.
639 browser1a.reset();
640 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
641 ASSERT_EQ(2U, last_opened_profiles.size());
642 EXPECT_EQ(profile1, last_opened_profiles[0]);
643 EXPECT_EQ(profile2, last_opened_profiles[1]);
644
645 browser1b.reset();
646 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
647 ASSERT_EQ(1U, last_opened_profiles.size());
648 EXPECT_EQ(profile2, last_opened_profiles[0]);
649
650 browser2.reset();
651 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
652 ASSERT_EQ(0U, last_opened_profiles.size());
653}
654
655TEST_F(ProfileManagerTest, LastOpenedProfilesAtShutdown) {
[email protected]650b2d52013-02-10 03:41:45656 base::FilePath dest_path1 = temp_dir_.path();
[email protected]52edf812012-01-12 11:48:46657 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
658
[email protected]650b2d52013-02-10 03:41:45659 base::FilePath dest_path2 = temp_dir_.path();
[email protected]52edf812012-01-12 11:48:46660 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
661
662 ProfileManager* profile_manager = g_browser_process->profile_manager();
663
664 // Successfully create the profiles.
665 TestingProfile* profile1 =
666 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
667 ASSERT_TRUE(profile1);
668
669 TestingProfile* profile2 =
670 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
671 ASSERT_TRUE(profile2);
672
673 // Create a browser for profile1.
[email protected]ed2fa722013-06-25 20:37:34674 Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29675 scoped_ptr<Browser> browser1(
[email protected]c5f3e1842013-02-20 17:10:41676 chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
[email protected]52edf812012-01-12 11:48:46677
678 // And for profile2.
[email protected]ed2fa722013-06-25 20:37:34679 Browser::CreateParams profile2_params(profile2, chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29680 scoped_ptr<Browser> browser2(
[email protected]c5f3e1842013-02-20 17:10:41681 chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
[email protected]52edf812012-01-12 11:48:46682
683 std::vector<Profile*> last_opened_profiles =
684 profile_manager->GetLastOpenedProfiles();
685 ASSERT_EQ(2U, last_opened_profiles.size());
686 EXPECT_EQ(profile1, last_opened_profiles[0]);
687 EXPECT_EQ(profile2, last_opened_profiles[1]);
688
689 // Simulate a shutdown.
690 content::NotificationService::current()->Notify(
[email protected]d53a08c2012-07-18 20:35:30691 chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
[email protected]52edf812012-01-12 11:48:46692 content::NotificationService::AllSources(),
693 content::NotificationService::NoDetails());
694
695 // Even if the browsers are destructed during shutdown, the profiles stay
696 // open.
697 browser1.reset();
698 browser2.reset();
699
700 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
701 ASSERT_EQ(2U, last_opened_profiles.size());
702 EXPECT_EQ(profile1, last_opened_profiles[0]);
703 EXPECT_EQ(profile2, last_opened_profiles[1]);
704}
[email protected]41276342012-02-06 10:49:31705
706TEST_F(ProfileManagerTest, LastOpenedProfilesDoesNotContainIncognito) {
[email protected]650b2d52013-02-10 03:41:45707 base::FilePath dest_path1 = temp_dir_.path();
[email protected]41276342012-02-06 10:49:31708 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
[email protected]650b2d52013-02-10 03:41:45709 base::FilePath dest_path2 = temp_dir_.path();
[email protected]41276342012-02-06 10:49:31710 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
711
712 ProfileManager* profile_manager = g_browser_process->profile_manager();
713
714 // Successfully create the profiles.
[email protected]4dffabe2012-05-19 14:37:06715 TestingProfile* profile1 =
716 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
[email protected]41276342012-02-06 10:49:31717 ASSERT_TRUE(profile1);
718
[email protected]41276342012-02-06 10:49:31719 std::vector<Profile*> last_opened_profiles =
720 profile_manager->GetLastOpenedProfiles();
721 ASSERT_EQ(0U, last_opened_profiles.size());
722
723 // Create a browser for profile1.
[email protected]ed2fa722013-06-25 20:37:34724 Browser::CreateParams profile1_params(profile1, chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29725 scoped_ptr<Browser> browser1(
[email protected]c5f3e1842013-02-20 17:10:41726 chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
[email protected]41276342012-02-06 10:49:31727
728 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
729 ASSERT_EQ(1U, last_opened_profiles.size());
730 EXPECT_EQ(profile1, last_opened_profiles[0]);
731
732 // And for profile2.
[email protected]9819fd02013-08-22 10:49:39733 Browser::CreateParams profile2_params(profile1->GetOffTheRecordProfile(),
734 chrome::GetActiveDesktop());
[email protected]a4fe67012012-07-25 20:14:29735 scoped_ptr<Browser> browser2a(
[email protected]c5f3e1842013-02-20 17:10:41736 chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
[email protected]41276342012-02-06 10:49:31737
738 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
739 ASSERT_EQ(1U, last_opened_profiles.size());
740 EXPECT_EQ(profile1, last_opened_profiles[0]);
741
742 // Adding more browsers doesn't change anything.
[email protected]a4fe67012012-07-25 20:14:29743 scoped_ptr<Browser> browser2b(
[email protected]c5f3e1842013-02-20 17:10:41744 chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
[email protected]41276342012-02-06 10:49:31745 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
746 ASSERT_EQ(1U, last_opened_profiles.size());
747 EXPECT_EQ(profile1, last_opened_profiles[0]);
748
749 // Close the browsers.
750 browser2a.reset();
751 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
752 ASSERT_EQ(1U, last_opened_profiles.size());
753 EXPECT_EQ(profile1, last_opened_profiles[0]);
754
755 browser2b.reset();
756 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
757 ASSERT_EQ(1U, last_opened_profiles.size());
758 EXPECT_EQ(profile1, last_opened_profiles[0]);
759
760 browser1.reset();
761 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
762 ASSERT_EQ(0U, last_opened_profiles.size());
763}
[email protected]c849fab2012-03-29 16:51:41764#endif // !defined(OS_ANDROID)
[email protected]1c62b2f2013-06-28 00:15:00765
766#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
767// There's no Browser object on Android and there's no multi-profiles on Chrome.
[email protected]8d9243a2013-10-21 17:11:48768TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastProfile) {
769 base::FilePath dest_path = temp_dir_.path();
770 dest_path = dest_path.Append(FILE_PATH_LITERAL("Ephemeral Profile"));
771
772 ProfileManager* profile_manager = g_browser_process->profile_manager();
773
774 TestingProfile* profile =
775 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path));
776 ASSERT_TRUE(profile);
777 profile->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, true);
778
779 // Here the last used profile is still the "Default" profile.
780 Profile* last_used_profile = profile_manager->GetLastUsedProfile();
781 EXPECT_NE(profile, last_used_profile);
782
[email protected]79fd6b72013-10-22 16:39:27783 // Create a browser for the profile.
[email protected]8d9243a2013-10-21 17:11:48784 Browser::CreateParams profile_params(profile, chrome::GetActiveDesktop());
785 scoped_ptr<Browser> browser(
786 chrome::CreateBrowserWithTestWindowForParams(&profile_params));
787 last_used_profile = profile_manager->GetLastUsedProfile();
788 EXPECT_NE(profile, last_used_profile);
789
790 // Close the browser.
791 browser.reset();
792 last_used_profile = profile_manager->GetLastUsedProfile();
793 EXPECT_NE(profile, last_used_profile);
794}
795
796TEST_F(ProfileManagerTest, EphemeralProfilesDontEndUpAsLastOpenedAtShutdown) {
797 base::FilePath dest_path1 = temp_dir_.path();
798 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("Normal Profile"));
799
800 base::FilePath dest_path2 = temp_dir_.path();
[email protected]79fd6b72013-10-22 16:39:27801 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("Ephemeral Profile 1"));
802
803 base::FilePath dest_path3 = temp_dir_.path();
804 dest_path3 = dest_path3.Append(FILE_PATH_LITERAL("Ephemeral Profile 2"));
[email protected]8d9243a2013-10-21 17:11:48805
806 ProfileManager* profile_manager = g_browser_process->profile_manager();
807
808 // Successfully create the profiles.
809 TestingProfile* normal_profile =
810 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path1));
811 ASSERT_TRUE(normal_profile);
812
813 // Add one ephemeral profile which should not end up in this list.
[email protected]79fd6b72013-10-22 16:39:27814 TestingProfile* ephemeral_profile1 =
[email protected]8d9243a2013-10-21 17:11:48815 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path2));
[email protected]79fd6b72013-10-22 16:39:27816 ASSERT_TRUE(ephemeral_profile1);
817 ephemeral_profile1->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles,
818 true);
819
820 // Add second ephemeral profile but don't mark it as such yet.
821 TestingProfile* ephemeral_profile2 =
822 static_cast<TestingProfile*>(profile_manager->GetProfile(dest_path3));
823 ASSERT_TRUE(ephemeral_profile2);
[email protected]8d9243a2013-10-21 17:11:48824
825 // Create a browser for profile1.
826 Browser::CreateParams profile1_params(normal_profile,
827 chrome::GetActiveDesktop());
828 scoped_ptr<Browser> browser1(
829 chrome::CreateBrowserWithTestWindowForParams(&profile1_params));
830
[email protected]79fd6b72013-10-22 16:39:27831 // Create browsers for the ephemeral profile.
832 Browser::CreateParams profile2_params(ephemeral_profile1,
[email protected]8d9243a2013-10-21 17:11:48833 chrome::GetActiveDesktop());
834 scoped_ptr<Browser> browser2(
835 chrome::CreateBrowserWithTestWindowForParams(&profile2_params));
836
[email protected]79fd6b72013-10-22 16:39:27837 Browser::CreateParams profile3_params(ephemeral_profile2,
838 chrome::GetActiveDesktop());
839 scoped_ptr<Browser> browser3(
840 chrome::CreateBrowserWithTestWindowForParams(&profile3_params));
841
[email protected]8d9243a2013-10-21 17:11:48842 std::vector<Profile*> last_opened_profiles =
843 profile_manager->GetLastOpenedProfiles();
[email protected]79fd6b72013-10-22 16:39:27844 ASSERT_EQ(2U, last_opened_profiles.size());
[email protected]8d9243a2013-10-21 17:11:48845 EXPECT_EQ(normal_profile, last_opened_profiles[0]);
[email protected]79fd6b72013-10-22 16:39:27846 EXPECT_EQ(ephemeral_profile2, last_opened_profiles[1]);
847
848 // Mark the second profile ephemeral.
849 ephemeral_profile2->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles,
850 true);
[email protected]8d9243a2013-10-21 17:11:48851
852 // Simulate a shutdown.
853 content::NotificationService::current()->Notify(
854 chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
855 content::NotificationService::AllSources(),
856 content::NotificationService::NoDetails());
857 browser1.reset();
858 browser2.reset();
[email protected]79fd6b72013-10-22 16:39:27859 browser3.reset();
[email protected]8d9243a2013-10-21 17:11:48860
861 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
862 ASSERT_EQ(1U, last_opened_profiles.size());
863 EXPECT_EQ(normal_profile, last_opened_profiles[0]);
864}
865
[email protected]1c62b2f2013-06-28 00:15:00866TEST_F(ProfileManagerTest, ActiveProfileDeleted) {
867 ProfileManager* profile_manager = g_browser_process->profile_manager();
868 ASSERT_TRUE(profile_manager);
869
870 // Create and load two profiles.
871 const std::string profile_name1 = "New Profile 1";
872 const std::string profile_name2 = "New Profile 2";
[email protected]3f130532014-02-26 20:39:24873 base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
874 base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
[email protected]1c62b2f2013-06-28 00:15:00875
876 MockObserver mock_observer;
877 EXPECT_CALL(mock_observer, OnProfileCreated(
878 testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
879
[email protected]5ddfade2014-02-03 10:24:53880 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
881 CreateProfileAsync(profile_manager, profile_name2, false, &mock_observer);
[email protected]37ac95b2013-07-23 23:39:35882 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:00883
884 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
885 EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
886
887 // Set the active profile.
888 PrefService* local_state = g_browser_process->local_state();
889 local_state->SetString(prefs::kProfileLastUsed, profile_name1);
890
891 // Delete the active profile.
892 profile_manager->ScheduleProfileForDeletion(dest_path1,
893 ProfileManager::CreateCallback());
894 // Spin the message loop so that all the callbacks can finish running.
[email protected]37ac95b2013-07-23 23:39:35895 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:00896
897 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
898 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
899}
[email protected]3f130532014-02-26 20:39:24900
[email protected]602b5a29f2014-07-18 15:39:33901TEST_F(ProfileManagerTest, LastProfileDeleted) {
902 ProfileManager* profile_manager = g_browser_process->profile_manager();
903 ASSERT_TRUE(profile_manager);
904
905 // Create and load a profile.
906 const std::string profile_name1 = "New Profile 1";
907 base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
908
909 MockObserver mock_observer;
910 EXPECT_CALL(mock_observer, OnProfileCreated(
911 testing::NotNull(), NotFail())).Times(testing::AtLeast(1));
912
913 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
914 base::RunLoop().RunUntilIdle();
915
916 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
917 EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
918
919 // Set it as the active profile.
920 PrefService* local_state = g_browser_process->local_state();
921 local_state->SetString(prefs::kProfileLastUsed, profile_name1);
922
923 // Delete the active profile.
924 profile_manager->ScheduleProfileForDeletion(dest_path1,
925 ProfileManager::CreateCallback());
926 // Spin the message loop so that all the callbacks can finish running.
927 base::RunLoop().RunUntilIdle();
928
929 // A new profile should have been created
930 const std::string profile_name2 = "Profile 1";
931 base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
932
933 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
934 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
935 EXPECT_EQ(dest_path2,
936 profile_manager->GetProfileInfoCache().GetPathOfProfileAtIndex(0));
937}
938
939TEST_F(ProfileManagerTest, LastProfileDeletedWithGuestActiveProfile) {
940 ProfileManager* profile_manager = g_browser_process->profile_manager();
941 ASSERT_TRUE(profile_manager);
942
943 // Create and load a profile.
944 const std::string profile_name1 = "New Profile 1";
945 base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
946
947 MockObserver mock_observer;
948 EXPECT_CALL(mock_observer, OnProfileCreated(
949 testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
950
951 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
952 base::RunLoop().RunUntilIdle();
953
954 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
955 EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
956
957 // Create the profile and register it.
958 const std::string guest_profile_name =
959 ProfileManager::GetGuestProfilePath().BaseName().MaybeAsASCII();
960
961 TestingProfile::Builder builder;
962 builder.SetGuestSession();
963 builder.SetPath(ProfileManager::GetGuestProfilePath());
964 TestingProfile* guest_profile = builder.Build().release();
965 guest_profile->set_profile_name(guest_profile_name);
966 // Registering the profile passes ownership to the ProfileManager.
967 profile_manager->RegisterTestingProfile(guest_profile, false, false);
968
969 // The Guest profile does not get added to the ProfileInfoCache.
970 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
971 EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
972
973 // Set the Guest profile as the active profile.
974 PrefService* local_state = g_browser_process->local_state();
975 local_state->SetString(prefs::kProfileLastUsed, guest_profile_name);
976
977 // Delete the other profile.
978 profile_manager->ScheduleProfileForDeletion(dest_path1,
979 ProfileManager::CreateCallback());
980 // Spin the message loop so that all the callbacks can finish running.
981 base::RunLoop().RunUntilIdle();
982
983 // A new profile should have been created.
984 const std::string profile_name2 = "Profile 1";
985 base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
986
987 EXPECT_EQ(3u, profile_manager->GetLoadedProfiles().size());
988 EXPECT_EQ(1u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles());
989 EXPECT_EQ(dest_path2,
990 profile_manager->GetProfileInfoCache().GetPathOfProfileAtIndex(0));
991}
992
[email protected]3f130532014-02-26 20:39:24993TEST_F(ProfileManagerTest, ProfileDisplayNameResetsDefaultName) {
994 if (!profiles::IsMultipleProfilesEnabled())
995 return;
996
997 // The command line is reset at the end of every test by the test suite.
[email protected]c9335412014-07-28 17:47:25998 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
[email protected]3f130532014-02-26 20:39:24999
1000 ProfileManager* profile_manager = g_browser_process->profile_manager();
1001 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1002 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
1003
1004 // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
1005 const base::string16 default_profile_name =
1006 l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
1007 const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
1008 Profile* profile1 = AddProfileToCache(profile_manager,
1009 "path_1", profile_name1);
[email protected]119809d2014-06-27 22:12:441010 EXPECT_EQ(default_profile_name,
1011 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241012
1013 // Multiple profiles means displaying the actual profile names.
1014 const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
1015 Profile* profile2 = AddProfileToCache(profile_manager,
1016 "path_2", profile_name2);
[email protected]119809d2014-06-27 22:12:441017 EXPECT_EQ(profile_name1,
1018 profiles::GetAvatarNameForProfile(profile1->GetPath()));
1019 EXPECT_EQ(profile_name2,
1020 profiles::GetAvatarNameForProfile(profile2->GetPath()));
[email protected]3f130532014-02-26 20:39:241021
1022 // Deleting a profile means returning to the default name.
1023 profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
1024 ProfileManager::CreateCallback());
1025 // Spin the message loop so that all the callbacks can finish running.
1026 base::RunLoop().RunUntilIdle();
[email protected]119809d2014-06-27 22:12:441027 EXPECT_EQ(default_profile_name,
1028 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241029}
1030
1031TEST_F(ProfileManagerTest, ProfileDisplayNamePreservesCustomName) {
1032 if (!profiles::IsMultipleProfilesEnabled())
1033 return;
1034
1035 // The command line is reset at the end of every test by the test suite.
[email protected]c9335412014-07-28 17:47:251036 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
[email protected]3f130532014-02-26 20:39:241037
1038 ProfileManager* profile_manager = g_browser_process->profile_manager();
1039 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1040 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
1041
1042 // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
1043 const base::string16 default_profile_name =
1044 l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
1045 const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
1046 Profile* profile1 = AddProfileToCache(profile_manager,
1047 "path_1", profile_name1);
[email protected]119809d2014-06-27 22:12:441048 EXPECT_EQ(default_profile_name,
1049 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241050
1051 // We should display custom names for local profiles.
1052 const base::string16 custom_profile_name = ASCIIToUTF16("Batman");
1053 cache.SetNameOfProfileAtIndex(0, custom_profile_name);
[email protected]1cdf0932014-08-16 06:00:491054 cache.SetProfileIsUsingDefaultNameAtIndex(0, false);
[email protected]3f130532014-02-26 20:39:241055 EXPECT_EQ(custom_profile_name, cache.GetNameOfProfileAtIndex(0));
[email protected]119809d2014-06-27 22:12:441056 EXPECT_EQ(custom_profile_name,
1057 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241058
1059 // Multiple profiles means displaying the actual profile names.
1060 const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
1061 Profile* profile2 = AddProfileToCache(profile_manager,
1062 "path_2", profile_name2);
[email protected]119809d2014-06-27 22:12:441063 EXPECT_EQ(custom_profile_name,
1064 profiles::GetAvatarNameForProfile(profile1->GetPath()));
1065 EXPECT_EQ(profile_name2,
1066 profiles::GetAvatarNameForProfile(profile2->GetPath()));
[email protected]3f130532014-02-26 20:39:241067
1068 // Deleting a profile means returning to the original, custom name.
1069 profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
1070 ProfileManager::CreateCallback());
1071 // Spin the message loop so that all the callbacks can finish running.
1072 base::RunLoop().RunUntilIdle();
[email protected]119809d2014-06-27 22:12:441073 EXPECT_EQ(custom_profile_name,
1074 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241075}
1076
1077TEST_F(ProfileManagerTest, ProfileDisplayNamePreservesSignedInName) {
1078 if (!profiles::IsMultipleProfilesEnabled())
1079 return;
1080
[email protected]29896ee2014-06-17 17:20:531081 // The command line is reset at the end of every test by the test suite.
[email protected]c9335412014-07-28 17:47:251082 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
[email protected]3f130532014-02-26 20:39:241083
1084 ProfileManager* profile_manager = g_browser_process->profile_manager();
1085 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1086 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
1087
1088 // Only one local profile means we display IDS_SINGLE_PROFILE_DISPLAY_NAME.
1089 const base::string16 default_profile_name =
1090 l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
1091 const base::string16 profile_name1 = cache.ChooseNameForNewProfile(0);
1092 Profile* profile1 = AddProfileToCache(profile_manager,
1093 "path_1", profile_name1);
[email protected]119809d2014-06-27 22:12:441094 EXPECT_EQ(default_profile_name,
1095 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241096
[email protected]78186a42014-08-22 22:07:301097 // For a signed in profile with a default name we still display
1098 // IDS_SINGLE_PROFILE_DISPLAY_NAME.
[email protected]3f130532014-02-26 20:39:241099 cache.SetUserNameOfProfileAtIndex(0, ASCIIToUTF16("[email protected]"));
1100 EXPECT_EQ(profile_name1, cache.GetNameOfProfileAtIndex(0));
[email protected]78186a42014-08-22 22:07:301101 EXPECT_EQ(default_profile_name,
[email protected]119809d2014-06-27 22:12:441102 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241103
[email protected]78186a42014-08-22 22:07:301104 // For a signed in profile with a non-default Gaia given name we display the
1105 // Gaia given name.
1106 cache.SetUserNameOfProfileAtIndex(0, ASCIIToUTF16("[email protected]"));
1107 const base::string16 gaia_given_name(ASCIIToUTF16("given name"));
1108 cache.SetGAIAGivenNameOfProfileAtIndex(0, gaia_given_name);
1109 EXPECT_EQ(gaia_given_name, cache.GetNameOfProfileAtIndex(0));
1110 EXPECT_EQ(gaia_given_name,
1111 profiles::GetAvatarNameForProfile(profile1->GetPath()));
1112
[email protected]3f130532014-02-26 20:39:241113 // Multiple profiles means displaying the actual profile names.
1114 const base::string16 profile_name2 = cache.ChooseNameForNewProfile(1);
1115 Profile* profile2 = AddProfileToCache(profile_manager,
1116 "path_2", profile_name2);
[email protected]78186a42014-08-22 22:07:301117 EXPECT_EQ(gaia_given_name,
[email protected]119809d2014-06-27 22:12:441118 profiles::GetAvatarNameForProfile(profile1->GetPath()));
1119 EXPECT_EQ(profile_name2,
1120 profiles::GetAvatarNameForProfile(profile2->GetPath()));
[email protected]3f130532014-02-26 20:39:241121
1122 // Deleting a profile means returning to the original, actual profile name.
1123 profile_manager->ScheduleProfileForDeletion(profile2->GetPath(),
1124 ProfileManager::CreateCallback());
1125 // Spin the message loop so that all the callbacks can finish running.
1126 base::RunLoop().RunUntilIdle();
[email protected]78186a42014-08-22 22:07:301127 EXPECT_EQ(gaia_given_name,
[email protected]119809d2014-06-27 22:12:441128 profiles::GetAvatarNameForProfile(profile1->GetPath()));
[email protected]3f130532014-02-26 20:39:241129}
nomsc9299462014-09-16 22:55:281130
1131TEST_F(ProfileManagerTest, ProfileDisplayNameIsEmailIfDefaultName) {
1132 if (!profiles::IsMultipleProfilesEnabled())
1133 return;
1134
1135 // The command line is reset at the end of every test by the test suite.
1136 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess());
1137
1138 ProfileManager* profile_manager = g_browser_process->profile_manager();
1139 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1140 EXPECT_EQ(0u, cache.GetNumberOfProfiles());
1141
1142 // Create two signed in profiles, with both new and legacy default names, and
1143 // a profile with a custom name.
1144 Profile* profile1 = AddProfileToCache(
1145 profile_manager, "path_1", ASCIIToUTF16("Person 1"));
1146 Profile* profile2 = AddProfileToCache(
1147 profile_manager, "path_2", ASCIIToUTF16("Default Profile"));
1148 const base::string16 profile_name3(ASCIIToUTF16("Batman"));
1149 Profile* profile3 = AddProfileToCache(
1150 profile_manager, "path_3", profile_name3);
1151 EXPECT_EQ(3u, cache.GetNumberOfProfiles());
1152
1153 // Sign in all profiles, and make sure they do not have a Gaia name set.
1154 const base::string16 email1(ASCIIToUTF16("[email protected]"));
1155 const base::string16 email2(ASCIIToUTF16("[email protected]"));
1156 const base::string16 email3(ASCIIToUTF16("[email protected]"));
1157
1158 int index = cache.GetIndexOfProfileWithPath(profile1->GetPath());
1159 cache.SetUserNameOfProfileAtIndex(index, email1);
1160 cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
1161 cache.SetGAIANameOfProfileAtIndex(index, base::string16());
1162
1163 // This may resort the cache, so be extra cautious to use the right profile.
1164 index = cache.GetIndexOfProfileWithPath(profile2->GetPath());
1165 cache.SetUserNameOfProfileAtIndex(index, email2);
1166 cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
1167 cache.SetGAIANameOfProfileAtIndex(index, base::string16());
1168
1169 index = cache.GetIndexOfProfileWithPath(profile3->GetPath());
1170 cache.SetUserNameOfProfileAtIndex(index, email3);
1171 cache.SetGAIAGivenNameOfProfileAtIndex(index, base::string16());
1172 cache.SetGAIANameOfProfileAtIndex(index, base::string16());
1173
1174 // The profiles with default names should display the email address.
1175 EXPECT_EQ(email1, profiles::GetAvatarNameForProfile(profile1->GetPath()));
1176 EXPECT_EQ(email2, profiles::GetAvatarNameForProfile(profile2->GetPath()));
1177
1178 // The profile with the custom name should display that.
1179 EXPECT_EQ(profile_name3,
1180 profiles::GetAvatarNameForProfile(profile3->GetPath()));
1181
1182 // Adding a Gaia name to a profile that previously had a default name should
1183 // start displaying it.
1184 const base::string16 gaia_given_name(ASCIIToUTF16("Robin"));
1185 cache.SetGAIAGivenNameOfProfileAtIndex(
1186 cache.GetIndexOfProfileWithPath(profile1->GetPath()), gaia_given_name);
1187 EXPECT_EQ(gaia_given_name,
1188 profiles::GetAvatarNameForProfile(profile1->GetPath()));
1189}
[email protected]1c62b2f2013-06-28 00:15:001190#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
1191
1192#if defined(OS_MACOSX)
1193// These tests are for a Mac-only code path that assumes the browser
1194// process isn't killed when all browser windows are closed.
1195TEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) {
1196 ProfileManager* profile_manager = g_browser_process->profile_manager();
1197 ASSERT_TRUE(profile_manager);
1198
1199 // Create and load one profile, and just create a second profile.
1200 const std::string profile_name1 = "New Profile 1";
1201 const std::string profile_name2 = "New Profile 2";
[email protected]3f130532014-02-26 20:39:241202 base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
1203 base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
[email protected]1c62b2f2013-06-28 00:15:001204
1205 MockObserver mock_observer;
1206 EXPECT_CALL(mock_observer, OnProfileCreated(
1207 testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
[email protected]5ddfade2014-02-03 10:24:531208 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
[email protected]37ac95b2013-07-23 23:39:351209 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001210
1211 // Track the profile, but don't load it.
1212 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1213 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2),
[email protected]a04db822013-12-11 19:14:401214 base::string16(), 0, std::string());
[email protected]37ac95b2013-07-23 23:39:351215 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001216
1217 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
1218 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
1219
1220 // Set the active profile.
1221 PrefService* local_state = g_browser_process->local_state();
1222 local_state->SetString(prefs::kProfileLastUsed,
1223 dest_path1.BaseName().MaybeAsASCII());
1224
1225 // Delete the active profile. This should switch and load the unloaded
1226 // profile.
1227 profile_manager->ScheduleProfileForDeletion(dest_path1,
1228 ProfileManager::CreateCallback());
1229
1230 // Spin the message loop so that all the callbacks can finish running.
[email protected]37ac95b2013-07-23 23:39:351231 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001232
1233 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath());
1234 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
1235}
1236
1237// This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded
1238// by simulating a scenario in which the profile that is being loaded as
1239// the next active profile has also been marked for deletion, so the
1240// ProfileManager needs to recursively select a different next profile.
1241TEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) {
1242 ProfileManager* profile_manager = g_browser_process->profile_manager();
1243 ASSERT_TRUE(profile_manager);
1244
1245 // Create and load one profile, and create two more profiles.
1246 const std::string profile_name1 = "New Profile 1";
1247 const std::string profile_name2 = "New Profile 2";
1248 const std::string profile_name3 = "New Profile 3";
[email protected]3f130532014-02-26 20:39:241249 base::FilePath dest_path1 = temp_dir_.path().AppendASCII(profile_name1);
1250 base::FilePath dest_path2 = temp_dir_.path().AppendASCII(profile_name2);
1251 base::FilePath dest_path3 = temp_dir_.path().AppendASCII(profile_name3);
[email protected]1c62b2f2013-06-28 00:15:001252
1253 MockObserver mock_observer;
1254 EXPECT_CALL(mock_observer, OnProfileCreated(
1255 testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
[email protected]5ddfade2014-02-03 10:24:531256 CreateProfileAsync(profile_manager, profile_name1, false, &mock_observer);
[email protected]37ac95b2013-07-23 23:39:351257 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001258
1259 // Create the other profiles, but don't load them. Assign a fake avatar icon
1260 // to ensure that profiles in the info cache are sorted by the profile name,
1261 // and not randomly by the avatar name.
1262 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
1263 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2),
[email protected]a6e01b42013-08-05 14:13:131264 ASCIIToUTF16(profile_name2), 1, std::string());
[email protected]1c62b2f2013-06-28 00:15:001265 cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3),
[email protected]a6e01b42013-08-05 14:13:131266 ASCIIToUTF16(profile_name3), 2, std::string());
[email protected]1c62b2f2013-06-28 00:15:001267
[email protected]37ac95b2013-07-23 23:39:351268 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001269
1270 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
1271 EXPECT_EQ(3u, cache.GetNumberOfProfiles());
1272
1273 // Set the active profile.
1274 PrefService* local_state = g_browser_process->local_state();
1275 local_state->SetString(prefs::kProfileLastUsed,
1276 dest_path1.BaseName().MaybeAsASCII());
1277
1278 // Delete the active profile, Profile1.
1279 // This will post a CreateProfileAsync message, that tries to load Profile2,
1280 // which checks that the profile is not being deleted, and then calls back
1281 // FinishDeletingProfile for Profile1.
1282 // Try to break this flow by setting the active profile to Profile2 in the
1283 // middle (so after the first posted message), and trying to delete Profile2,
1284 // so that the ProfileManager has to look for a different profile to load.
1285 profile_manager->ScheduleProfileForDeletion(dest_path1,
1286 ProfileManager::CreateCallback());
1287 local_state->SetString(prefs::kProfileLastUsed,
1288 dest_path2.BaseName().MaybeAsASCII());
1289 profile_manager->ScheduleProfileForDeletion(dest_path2,
1290 ProfileManager::CreateCallback());
1291 // Spin the message loop so that all the callbacks can finish running.
[email protected]37ac95b2013-07-23 23:39:351292 base::RunLoop().RunUntilIdle();
[email protected]1c62b2f2013-06-28 00:15:001293
1294 EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath());
1295 EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed));
1296}
1297#endif // !defined(OS_MACOSX)