| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/message_loop.h" | |
| 11 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| 11 #include "base/run_loop.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 15 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 16 #include "chrome/browser/browser_process.h" | 16 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/chromeos/settings/cros_settings.h" | 17 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 18 #include "chrome/browser/history/history_service.h" | 18 #include "chrome/browser/history/history_service.h" |
| 19 #include "chrome/browser/history/history_service_factory.h" | 19 #include "chrome/browser/history/history_service_factory.h" |
| 20 #include "chrome/browser/io_thread.h" | 20 #include "chrome/browser/io_thread.h" |
| 21 #include "chrome/browser/prefs/browser_prefs.h" | 21 #include "chrome/browser/prefs/browser_prefs.h" |
| 22 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 22 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/profiles/profile_info_cache.h" | 24 #include "chrome/browser/profiles/profile_info_cache.h" |
| 25 #include "chrome/browser/profiles/profile_manager.h" | 25 #include "chrome/browser/profiles/profile_manager.h" |
| 26 #include "chrome/browser/ui/browser.h" | 26 #include "chrome/browser/ui/browser.h" |
| 27 #include "chrome/common/chrome_constants.h" | 27 #include "chrome/common/chrome_constants.h" |
| 28 #include "chrome/common/chrome_notification_types.h" | 28 #include "chrome/common/chrome_notification_types.h" |
| 29 #include "chrome/common/chrome_paths.h" | 29 #include "chrome/common/chrome_paths.h" |
| 30 #include "chrome/common/chrome_switches.h" | 30 #include "chrome/common/chrome_switches.h" |
| 31 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
| 32 #include "chrome/test/base/scoped_testing_local_state.h" | 32 #include "chrome/test/base/scoped_testing_local_state.h" |
| 33 #include "chrome/test/base/test_browser_window.h" | 33 #include "chrome/test/base/test_browser_window.h" |
| 34 #include "chrome/test/base/testing_browser_process.h" | 34 #include "chrome/test/base/testing_browser_process.h" |
| 35 #include "chrome/test/base/testing_profile.h" | 35 #include "chrome/test/base/testing_profile.h" |
| 36 #include "content/public/browser/notification_service.h" | 36 #include "content/public/browser/notification_service.h" |
| 37 #include "content/public/test/test_browser_thread.h" | 37 #include "content/public/test/test_browser_thread_bundle.h" |
| 38 #include "testing/gmock/include/gmock/gmock.h" | 38 #include "testing/gmock/include/gmock/gmock.h" |
| 39 #include "testing/gtest/include/gtest/gtest.h" | 39 #include "testing/gtest/include/gtest/gtest.h" |
| 40 | 40 |
| 41 #if defined(OS_CHROMEOS) | 41 #if defined(OS_CHROMEOS) |
| 42 #include "chrome/browser/chromeos/login/mock_user_manager.h" | 42 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
| 43 #include "chrome/browser/chromeos/login/user_manager.h" | 43 #include "chrome/browser/chromeos/login/user_manager.h" |
| 44 #include "chrome/browser/chromeos/settings/cros_settings.h" | 44 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 45 #include "chrome/browser/chromeos/settings/device_settings_service.h" | 45 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
| 46 #include "chromeos/chromeos_switches.h" | 46 #include "chromeos/chromeos_switches.h" |
| 47 #endif | 47 #endif |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 | 88 |
| 89 class ProfileManagerTest : public testing::Test { | 89 class ProfileManagerTest : public testing::Test { |
| 90 protected: | 90 protected: |
| 91 class MockObserver { | 91 class MockObserver { |
| 92 public: | 92 public: |
| 93 MOCK_METHOD2(OnProfileCreated, | 93 MOCK_METHOD2(OnProfileCreated, |
| 94 void(Profile* profile, Profile::CreateStatus status)); | 94 void(Profile* profile, Profile::CreateStatus status)); |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 ProfileManagerTest() | 97 ProfileManagerTest() |
| 98 : local_state_(TestingBrowserProcess::GetGlobal()), | 98 : local_state_(TestingBrowserProcess::GetGlobal()) { |
| 99 ui_thread_(BrowserThread::UI, &message_loop_), | |
| 100 db_thread_(BrowserThread::DB, &message_loop_), | |
| 101 file_thread_(BrowserThread::FILE, &message_loop_) { | |
| 102 } | 99 } |
| 103 | 100 |
| 104 virtual void SetUp() { | 101 virtual void SetUp() { |
| 105 // Create a new temporary directory, and store the path | 102 // Create a new temporary directory, and store the path |
| 106 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 103 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 107 TestingBrowserProcess::GetGlobal()->SetProfileManager( | 104 TestingBrowserProcess::GetGlobal()->SetProfileManager( |
| 108 new testing::ProfileManager(temp_dir_.path())); | 105 new testing::ProfileManager(temp_dir_.path())); |
| 109 | 106 |
| 110 #if defined(OS_CHROMEOS) | 107 #if defined(OS_CHROMEOS) |
| 111 CommandLine* cl = CommandLine::ForCurrentProcess(); | 108 CommandLine* cl = CommandLine::ForCurrentProcess(); |
| 112 cl->AppendSwitch(switches::kTestType); | 109 cl->AppendSwitch(switches::kTestType); |
| 113 #endif | 110 #endif |
| 114 } | 111 } |
| 115 | 112 |
| 116 virtual void TearDown() { | 113 virtual void TearDown() { |
| 117 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); | 114 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); |
| 118 message_loop_.RunUntilIdle(); | 115 base::RunLoop().RunUntilIdle(); |
| 119 } | 116 } |
| 120 | 117 |
| 121 // Helper function to create a profile with |name| for a profile |manager|. | 118 // Helper function to create a profile with |name| for a profile |manager|. |
| 122 void CreateProfileAsync(ProfileManager* manager, | 119 void CreateProfileAsync(ProfileManager* manager, |
| 123 const std::string& name, | 120 const std::string& name, |
| 124 MockObserver* mock_observer) { | 121 MockObserver* mock_observer) { |
| 125 manager->CreateProfileAsync( | 122 manager->CreateProfileAsync( |
| 126 temp_dir_.path().AppendASCII(name), | 123 temp_dir_.path().AppendASCII(name), |
| 127 base::Bind(&MockObserver::OnProfileCreated, | 124 base::Bind(&MockObserver::OnProfileCreated, |
| 128 base::Unretained(mock_observer)), | 125 base::Unretained(mock_observer)), |
| 129 UTF8ToUTF16(name), | 126 UTF8ToUTF16(name), |
| 130 string16(), | 127 string16(), |
| 131 false); | 128 false); |
| 132 } | 129 } |
| 133 | 130 |
| 134 #if defined(OS_CHROMEOS) | 131 #if defined(OS_CHROMEOS) |
| 135 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; | 132 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; |
| 136 chromeos::ScopedTestCrosSettings test_cros_settings_; | 133 chromeos::ScopedTestCrosSettings test_cros_settings_; |
| 137 #endif | 134 #endif |
| 138 | 135 |
| 139 // The path to temporary directory used to contain the test operations. | 136 // The path to temporary directory used to contain the test operations. |
| 140 base::ScopedTempDir temp_dir_; | 137 base::ScopedTempDir temp_dir_; |
| 141 ScopedTestingLocalState local_state_; | 138 ScopedTestingLocalState local_state_; |
| 142 base::MessageLoopForUI message_loop_; | 139 |
| 143 content::TestBrowserThread ui_thread_; | 140 content::TestBrowserThreadBundle thread_bundle_; |
| 144 content::TestBrowserThread db_thread_; | |
| 145 content::TestBrowserThread file_thread_; | |
| 146 | 141 |
| 147 #if defined(OS_CHROMEOS) | 142 #if defined(OS_CHROMEOS) |
| 148 chromeos::ScopedTestUserManager test_user_manager_; | 143 chromeos::ScopedTestUserManager test_user_manager_; |
| 149 #endif | 144 #endif |
| 150 }; | 145 }; |
| 151 | 146 |
| 152 TEST_F(ProfileManagerTest, GetProfile) { | 147 TEST_F(ProfileManagerTest, GetProfile) { |
| 153 base::FilePath dest_path = temp_dir_.path(); | 148 base::FilePath dest_path = temp_dir_.path(); |
| 154 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); | 149 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); |
| 155 | 150 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 Profile::EXPLICIT_ACCESS)); | 220 Profile::EXPLICIT_ACCESS)); |
| 226 profile1->CreateBookmarkModel(true); | 221 profile1->CreateBookmarkModel(true); |
| 227 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1)); | 222 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile1)); |
| 228 profile2->CreateBookmarkModel(true); | 223 profile2->CreateBookmarkModel(true); |
| 229 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2)); | 224 EXPECT_TRUE(BookmarkModelFactory::GetForProfile(profile2)); |
| 230 profile2->CreateHistoryService(true, false); | 225 profile2->CreateHistoryService(true, false); |
| 231 EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2, | 226 EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile2, |
| 232 Profile::EXPLICIT_ACCESS)); | 227 Profile::EXPLICIT_ACCESS)); |
| 233 | 228 |
| 234 // Make sure any pending tasks run before we destroy the profiles. | 229 // Make sure any pending tasks run before we destroy the profiles. |
| 235 message_loop_.RunUntilIdle(); | 230 base::RunLoop().RunUntilIdle(); |
| 236 | 231 |
| 237 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); | 232 TestingBrowserProcess::GetGlobal()->SetProfileManager(NULL); |
| 238 | 233 |
| 239 // Make sure history cleans up correctly. | 234 // Make sure history cleans up correctly. |
| 240 message_loop_.RunUntilIdle(); | 235 base::RunLoop().RunUntilIdle(); |
| 241 } | 236 } |
| 242 | 237 |
| 243 MATCHER(NotFail, "Profile creation failure status is not reported.") { | 238 MATCHER(NotFail, "Profile creation failure status is not reported.") { |
| 244 return arg == Profile::CREATE_STATUS_CREATED || | 239 return arg == Profile::CREATE_STATUS_CREATED || |
| 245 arg == Profile::CREATE_STATUS_INITIALIZED; | 240 arg == Profile::CREATE_STATUS_INITIALIZED; |
| 246 } | 241 } |
| 247 | 242 |
| 248 // Tests asynchronous profile creation mechanism. | 243 // Tests asynchronous profile creation mechanism. |
| 249 // Crashes: http://crbug.com/89421 | 244 // Crashes: http://crbug.com/89421 |
| 250 TEST_F(ProfileManagerTest, DISABLED_CreateProfileAsync) { | 245 TEST_F(ProfileManagerTest, DISABLED_CreateProfileAsync) { |
| 251 MockObserver mock_observer; | 246 MockObserver mock_observer; |
| 252 EXPECT_CALL(mock_observer, OnProfileCreated( | 247 EXPECT_CALL(mock_observer, OnProfileCreated( |
| 253 testing::NotNull(), NotFail())).Times(testing::AtLeast(1)); | 248 testing::NotNull(), NotFail())).Times(testing::AtLeast(1)); |
| 254 | 249 |
| 255 CreateProfileAsync(g_browser_process->profile_manager(), | 250 CreateProfileAsync(g_browser_process->profile_manager(), |
| 256 "New Profile", &mock_observer); | 251 "New Profile", &mock_observer); |
| 257 | 252 |
| 258 message_loop_.RunUntilIdle(); | 253 base::RunLoop().RunUntilIdle(); |
| 259 } | 254 } |
| 260 | 255 |
| 261 MATCHER(SameNotNull, "The same non-NULL value for all calls.") { | 256 MATCHER(SameNotNull, "The same non-NULL value for all calls.") { |
| 262 if (!g_created_profile) | 257 if (!g_created_profile) |
| 263 g_created_profile = arg; | 258 g_created_profile = arg; |
| 264 return arg != NULL && arg == g_created_profile; | 259 return arg != NULL && arg == g_created_profile; |
| 265 } | 260 } |
| 266 | 261 |
| 267 TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) { | 262 TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) { |
| 268 g_created_profile = NULL; | 263 g_created_profile = NULL; |
| 269 | 264 |
| 270 MockObserver mock_observer1; | 265 MockObserver mock_observer1; |
| 271 EXPECT_CALL(mock_observer1, OnProfileCreated( | 266 EXPECT_CALL(mock_observer1, OnProfileCreated( |
| 272 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); | 267 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); |
| 273 MockObserver mock_observer2; | 268 MockObserver mock_observer2; |
| 274 EXPECT_CALL(mock_observer2, OnProfileCreated( | 269 EXPECT_CALL(mock_observer2, OnProfileCreated( |
| 275 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); | 270 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); |
| 276 MockObserver mock_observer3; | 271 MockObserver mock_observer3; |
| 277 EXPECT_CALL(mock_observer3, OnProfileCreated( | 272 EXPECT_CALL(mock_observer3, OnProfileCreated( |
| 278 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); | 273 SameNotNull(), NotFail())).Times(testing::AtLeast(1)); |
| 279 | 274 |
| 280 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 275 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 281 const std::string profile_name = "New Profile"; | 276 const std::string profile_name = "New Profile"; |
| 282 CreateProfileAsync(profile_manager, profile_name, &mock_observer1); | 277 CreateProfileAsync(profile_manager, profile_name, &mock_observer1); |
| 283 CreateProfileAsync(profile_manager, profile_name, &mock_observer2); | 278 CreateProfileAsync(profile_manager, profile_name, &mock_observer2); |
| 284 CreateProfileAsync(profile_manager, profile_name, &mock_observer3); | 279 CreateProfileAsync(profile_manager, profile_name, &mock_observer3); |
| 285 | 280 |
| 286 message_loop_.RunUntilIdle(); | 281 base::RunLoop().RunUntilIdle(); |
| 287 } | 282 } |
| 288 | 283 |
| 289 TEST_F(ProfileManagerTest, CreateProfilesAsync) { | 284 TEST_F(ProfileManagerTest, CreateProfilesAsync) { |
| 290 const std::string profile_name1 = "New Profile 1"; | 285 const std::string profile_name1 = "New Profile 1"; |
| 291 const std::string profile_name2 = "New Profile 2"; | 286 const std::string profile_name2 = "New Profile 2"; |
| 292 | 287 |
| 293 MockObserver mock_observer; | 288 MockObserver mock_observer; |
| 294 EXPECT_CALL(mock_observer, OnProfileCreated( | 289 EXPECT_CALL(mock_observer, OnProfileCreated( |
| 295 testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); | 290 testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); |
| 296 | 291 |
| 297 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 292 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 298 | 293 |
| 299 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); | 294 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); |
| 300 CreateProfileAsync(profile_manager, profile_name2, &mock_observer); | 295 CreateProfileAsync(profile_manager, profile_name2, &mock_observer); |
| 301 | 296 |
| 302 message_loop_.RunUntilIdle(); | 297 base::RunLoop().RunUntilIdle(); |
| 303 } | 298 } |
| 304 | 299 |
| 305 TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) { | 300 TEST_F(ProfileManagerTest, AutoloadProfilesWithBackgroundApps) { |
| 306 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 301 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 307 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 302 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 308 local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, | 303 local_state_.Get()->SetUserPref(prefs::kBackgroundModeEnabled, |
| 309 Value::CreateBooleanValue(true)); | 304 Value::CreateBooleanValue(true)); |
| 310 | 305 |
| 311 // Setting a pref which is not applicable to a system (i.e., Android in this | 306 // Setting a pref which is not applicable to a system (i.e., Android in this |
| 312 // case) does not necessarily create it. Don't bother continuing with the | 307 // case) does not necessarily create it. Don't bother continuing with the |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 temp_dir_.path().AppendASCII(profile_name1); | 626 temp_dir_.path().AppendASCII(profile_name1); |
| 632 base::FilePath dest_path2 = | 627 base::FilePath dest_path2 = |
| 633 temp_dir_.path().AppendASCII(profile_name2); | 628 temp_dir_.path().AppendASCII(profile_name2); |
| 634 | 629 |
| 635 MockObserver mock_observer; | 630 MockObserver mock_observer; |
| 636 EXPECT_CALL(mock_observer, OnProfileCreated( | 631 EXPECT_CALL(mock_observer, OnProfileCreated( |
| 637 testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); | 632 testing::NotNull(), NotFail())).Times(testing::AtLeast(3)); |
| 638 | 633 |
| 639 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); | 634 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); |
| 640 CreateProfileAsync(profile_manager, profile_name2, &mock_observer); | 635 CreateProfileAsync(profile_manager, profile_name2, &mock_observer); |
| 641 message_loop_.RunUntilIdle(); | 636 base::RunLoop().RunUntilIdle(); |
| 642 | 637 |
| 643 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); | 638 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size()); |
| 644 EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles()); | 639 EXPECT_EQ(2u, profile_manager->GetProfileInfoCache().GetNumberOfProfiles()); |
| 645 | 640 |
| 646 // Set the active profile. | 641 // Set the active profile. |
| 647 PrefService* local_state = g_browser_process->local_state(); | 642 PrefService* local_state = g_browser_process->local_state(); |
| 648 local_state->SetString(prefs::kProfileLastUsed, profile_name1); | 643 local_state->SetString(prefs::kProfileLastUsed, profile_name1); |
| 649 | 644 |
| 650 // Delete the active profile. | 645 // Delete the active profile. |
| 651 profile_manager->ScheduleProfileForDeletion(dest_path1, | 646 profile_manager->ScheduleProfileForDeletion(dest_path1, |
| 652 ProfileManager::CreateCallback()); | 647 ProfileManager::CreateCallback()); |
| 653 // Spin the message loop so that all the callbacks can finish running. | 648 // Spin the message loop so that all the callbacks can finish running. |
| 654 message_loop_.RunUntilIdle(); | 649 base::RunLoop().RunUntilIdle(); |
| 655 | 650 |
| 656 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); | 651 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); |
| 657 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); | 652 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); |
| 658 } | 653 } |
| 659 #endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) | 654 #endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
| 660 | 655 |
| 661 #if defined(OS_MACOSX) | 656 #if defined(OS_MACOSX) |
| 662 // These tests are for a Mac-only code path that assumes the browser | 657 // These tests are for a Mac-only code path that assumes the browser |
| 663 // process isn't killed when all browser windows are closed. | 658 // process isn't killed when all browser windows are closed. |
| 664 TEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) { | 659 TEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) { |
| 665 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 660 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 666 ASSERT_TRUE(profile_manager); | 661 ASSERT_TRUE(profile_manager); |
| 667 | 662 |
| 668 // Create and load one profile, and just create a second profile. | 663 // Create and load one profile, and just create a second profile. |
| 669 const std::string profile_name1 = "New Profile 1"; | 664 const std::string profile_name1 = "New Profile 1"; |
| 670 const std::string profile_name2 = "New Profile 2"; | 665 const std::string profile_name2 = "New Profile 2"; |
| 671 base::FilePath dest_path1 = | 666 base::FilePath dest_path1 = |
| 672 temp_dir_.path().AppendASCII(profile_name1); | 667 temp_dir_.path().AppendASCII(profile_name1); |
| 673 base::FilePath dest_path2 = | 668 base::FilePath dest_path2 = |
| 674 temp_dir_.path().AppendASCII(profile_name2); | 669 temp_dir_.path().AppendASCII(profile_name2); |
| 675 | 670 |
| 676 MockObserver mock_observer; | 671 MockObserver mock_observer; |
| 677 EXPECT_CALL(mock_observer, OnProfileCreated( | 672 EXPECT_CALL(mock_observer, OnProfileCreated( |
| 678 testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); | 673 testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); |
| 679 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); | 674 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); |
| 680 message_loop_.RunUntilIdle(); | 675 base::RunLoop().RunUntilIdle(); |
| 681 | 676 |
| 682 // Track the profile, but don't load it. | 677 // Track the profile, but don't load it. |
| 683 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 678 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 684 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), | 679 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), |
| 685 string16(), 0, false); | 680 string16(), 0, false); |
| 686 message_loop_.RunUntilIdle(); | 681 base::RunLoop().RunUntilIdle(); |
| 687 | 682 |
| 688 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); | 683 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); |
| 689 EXPECT_EQ(2u, cache.GetNumberOfProfiles()); | 684 EXPECT_EQ(2u, cache.GetNumberOfProfiles()); |
| 690 | 685 |
| 691 // Set the active profile. | 686 // Set the active profile. |
| 692 PrefService* local_state = g_browser_process->local_state(); | 687 PrefService* local_state = g_browser_process->local_state(); |
| 693 local_state->SetString(prefs::kProfileLastUsed, | 688 local_state->SetString(prefs::kProfileLastUsed, |
| 694 dest_path1.BaseName().MaybeAsASCII()); | 689 dest_path1.BaseName().MaybeAsASCII()); |
| 695 | 690 |
| 696 // Delete the active profile. This should switch and load the unloaded | 691 // Delete the active profile. This should switch and load the unloaded |
| 697 // profile. | 692 // profile. |
| 698 profile_manager->ScheduleProfileForDeletion(dest_path1, | 693 profile_manager->ScheduleProfileForDeletion(dest_path1, |
| 699 ProfileManager::CreateCallback()); | 694 ProfileManager::CreateCallback()); |
| 700 | 695 |
| 701 // Spin the message loop so that all the callbacks can finish running. | 696 // Spin the message loop so that all the callbacks can finish running. |
| 702 message_loop_.RunUntilIdle(); | 697 base::RunLoop().RunUntilIdle(); |
| 703 | 698 |
| 704 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); | 699 EXPECT_EQ(dest_path2, profile_manager->GetLastUsedProfile()->GetPath()); |
| 705 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); | 700 EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed)); |
| 706 } | 701 } |
| 707 | 702 |
| 708 // This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded | 703 // This tests the recursive call in ProfileManager::OnNewActiveProfileLoaded |
| 709 // by simulating a scenario in which the profile that is being loaded as | 704 // by simulating a scenario in which the profile that is being loaded as |
| 710 // the next active profile has also been marked for deletion, so the | 705 // the next active profile has also been marked for deletion, so the |
| 711 // ProfileManager needs to recursively select a different next profile. | 706 // ProfileManager needs to recursively select a different next profile. |
| 712 TEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) { | 707 TEST_F(ProfileManagerTest, ActiveProfileDeletedNextProfileDeletedToo) { |
| 713 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 708 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 714 ASSERT_TRUE(profile_manager); | 709 ASSERT_TRUE(profile_manager); |
| 715 | 710 |
| 716 // Create and load one profile, and create two more profiles. | 711 // Create and load one profile, and create two more profiles. |
| 717 const std::string profile_name1 = "New Profile 1"; | 712 const std::string profile_name1 = "New Profile 1"; |
| 718 const std::string profile_name2 = "New Profile 2"; | 713 const std::string profile_name2 = "New Profile 2"; |
| 719 const std::string profile_name3 = "New Profile 3"; | 714 const std::string profile_name3 = "New Profile 3"; |
| 720 base::FilePath dest_path1 = | 715 base::FilePath dest_path1 = |
| 721 temp_dir_.path().AppendASCII(profile_name1); | 716 temp_dir_.path().AppendASCII(profile_name1); |
| 722 base::FilePath dest_path2 = | 717 base::FilePath dest_path2 = |
| 723 temp_dir_.path().AppendASCII(profile_name2); | 718 temp_dir_.path().AppendASCII(profile_name2); |
| 724 base::FilePath dest_path3 = | 719 base::FilePath dest_path3 = |
| 725 temp_dir_.path().AppendASCII(profile_name3); | 720 temp_dir_.path().AppendASCII(profile_name3); |
| 726 | 721 |
| 727 MockObserver mock_observer; | 722 MockObserver mock_observer; |
| 728 EXPECT_CALL(mock_observer, OnProfileCreated( | 723 EXPECT_CALL(mock_observer, OnProfileCreated( |
| 729 testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); | 724 testing::NotNull(), NotFail())).Times(testing::AtLeast(2)); |
| 730 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); | 725 CreateProfileAsync(profile_manager, profile_name1, &mock_observer); |
| 731 message_loop_.RunUntilIdle(); | 726 base::RunLoop().RunUntilIdle(); |
| 732 | 727 |
| 733 // Create the other profiles, but don't load them. Assign a fake avatar icon | 728 // Create the other profiles, but don't load them. Assign a fake avatar icon |
| 734 // to ensure that profiles in the info cache are sorted by the profile name, | 729 // to ensure that profiles in the info cache are sorted by the profile name, |
| 735 // and not randomly by the avatar name. | 730 // and not randomly by the avatar name. |
| 736 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); | 731 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| 737 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), | 732 cache.AddProfileToCache(dest_path2, ASCIIToUTF16(profile_name2), |
| 738 ASCIIToUTF16(profile_name2), 1, false); | 733 ASCIIToUTF16(profile_name2), 1, false); |
| 739 cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3), | 734 cache.AddProfileToCache(dest_path3, ASCIIToUTF16(profile_name3), |
| 740 ASCIIToUTF16(profile_name3), 2, false); | 735 ASCIIToUTF16(profile_name3), 2, false); |
| 741 | 736 |
| 742 message_loop_.RunUntilIdle(); | 737 base::RunLoop().RunUntilIdle(); |
| 743 | 738 |
| 744 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); | 739 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size()); |
| 745 EXPECT_EQ(3u, cache.GetNumberOfProfiles()); | 740 EXPECT_EQ(3u, cache.GetNumberOfProfiles()); |
| 746 | 741 |
| 747 // Set the active profile. | 742 // Set the active profile. |
| 748 PrefService* local_state = g_browser_process->local_state(); | 743 PrefService* local_state = g_browser_process->local_state(); |
| 749 local_state->SetString(prefs::kProfileLastUsed, | 744 local_state->SetString(prefs::kProfileLastUsed, |
| 750 dest_path1.BaseName().MaybeAsASCII()); | 745 dest_path1.BaseName().MaybeAsASCII()); |
| 751 | 746 |
| 752 // Delete the active profile, Profile1. | 747 // Delete the active profile, Profile1. |
| 753 // This will post a CreateProfileAsync message, that tries to load Profile2, | 748 // This will post a CreateProfileAsync message, that tries to load Profile2, |
| 754 // which checks that the profile is not being deleted, and then calls back | 749 // which checks that the profile is not being deleted, and then calls back |
| 755 // FinishDeletingProfile for Profile1. | 750 // FinishDeletingProfile for Profile1. |
| 756 // Try to break this flow by setting the active profile to Profile2 in the | 751 // Try to break this flow by setting the active profile to Profile2 in the |
| 757 // middle (so after the first posted message), and trying to delete Profile2, | 752 // middle (so after the first posted message), and trying to delete Profile2, |
| 758 // so that the ProfileManager has to look for a different profile to load. | 753 // so that the ProfileManager has to look for a different profile to load. |
| 759 profile_manager->ScheduleProfileForDeletion(dest_path1, | 754 profile_manager->ScheduleProfileForDeletion(dest_path1, |
| 760 ProfileManager::CreateCallback()); | 755 ProfileManager::CreateCallback()); |
| 761 local_state->SetString(prefs::kProfileLastUsed, | 756 local_state->SetString(prefs::kProfileLastUsed, |
| 762 dest_path2.BaseName().MaybeAsASCII()); | 757 dest_path2.BaseName().MaybeAsASCII()); |
| 763 profile_manager->ScheduleProfileForDeletion(dest_path2, | 758 profile_manager->ScheduleProfileForDeletion(dest_path2, |
| 764 ProfileManager::CreateCallback()); | 759 ProfileManager::CreateCallback()); |
| 765 // Spin the message loop so that all the callbacks can finish running. | 760 // Spin the message loop so that all the callbacks can finish running. |
| 766 message_loop_.RunUntilIdle(); | 761 base::RunLoop().RunUntilIdle(); |
| 767 | 762 |
| 768 EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath()); | 763 EXPECT_EQ(dest_path3, profile_manager->GetLastUsedProfile()->GetPath()); |
| 769 EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed)); | 764 EXPECT_EQ(profile_name3, local_state->GetString(prefs::kProfileLastUsed)); |
| 770 } | 765 } |
| 771 #endif // !defined(OS_MACOSX) | 766 #endif // !defined(OS_MACOSX) |
| OLD | NEW |