| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <string> |
| |
| #include "base/command_line.h" |
| #include "base/memory/scoped_temp_dir.h" |
| #include "base/message_loop.h" |
| #include "base/path_service.h" |
| #include "chrome/browser/prefs/browser_prefs.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/common/chrome_constants.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/testing_browser_process.h" |
| #include "chrome/test/testing_pref_service.h" |
| #include "content/browser/browser_thread.h" |
| #include "content/common/notification_service.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/base/system_monitor/system_monitor.h" |
| |
| namespace { |
| // This global variable is used to check that value returned to different |
| // observers is the same. |
| Profile* g_created_profile; |
| |
| } // namespace |
| |
| class ProfileManagerTest : public testing::Test { |
| protected: |
| ProfileManagerTest() |
| : ui_thread_(BrowserThread::UI, &message_loop_), |
| file_thread_(BrowserThread::FILE, &message_loop_), |
| profile_manager_(new ProfileManagerWithoutInit) { |
| } |
| |
| virtual void SetUp() { |
| // Create a new temporary directory, and store the path |
| ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| |
| // Create a local_state PrefService. |
| browser::RegisterLocalState(&test_local_state_); |
| TestingBrowserProcess* testing_browser_process = |
| static_cast<TestingBrowserProcess*>(g_browser_process); |
| testing_browser_process->SetPrefService(&test_local_state_); |
| } |
| |
| virtual void TearDown() { |
| profile_manager_.reset(); |
| |
| TestingBrowserProcess* testing_browser_process = |
| static_cast<TestingBrowserProcess*>(g_browser_process); |
| testing_browser_process->SetPrefService(NULL); |
| } |
| |
| class MockObserver : public ProfileManager::Observer { |
| public: |
| MOCK_METHOD1(OnProfileCreated, void(Profile* profile)); |
| }; |
| |
| // The path to temporary directory used to contain the test operations. |
| ScopedTempDir temp_dir_; |
| |
| MessageLoopForUI message_loop_; |
| BrowserThread ui_thread_; |
| BrowserThread file_thread_; |
| |
| ui::SystemMonitor system_monitor_dummy_; |
| |
| // Also will test profile deletion. |
| scoped_ptr<ProfileManager> profile_manager_; |
| |
| TestingPrefService test_local_state_; |
| }; |
| |
| TEST_F(ProfileManagerTest, GetProfile) { |
| FilePath dest_path = temp_dir_.path(); |
| dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile")); |
| |
| Profile* profile; |
| |
| // Successfully create a profile. |
| profile = profile_manager_->GetProfile(dest_path); |
| EXPECT_TRUE(profile); |
| |
| // The profile already exists when we call GetProfile. Just load it. |
| EXPECT_EQ(profile, profile_manager_->GetProfile(dest_path)); |
| } |
| |
| TEST_F(ProfileManagerTest, DefaultProfileDir) { |
| CommandLine *cl = CommandLine::ForCurrentProcess(); |
| std::string profile_dir("my_user"); |
| |
| cl->AppendSwitch(switches::kTestType); |
| |
| FilePath expected_default = |
| FilePath().AppendASCII(chrome::kNotSignedInProfile); |
| EXPECT_EQ(expected_default.value(), |
| profile_manager_->GetCurrentProfileDir().value()); |
| } |
| |
| #if defined(OS_CHROMEOS) |
| // This functionality only exists on Chrome OS. |
| TEST_F(ProfileManagerTest, LoggedInProfileDir) { |
| CommandLine *cl = CommandLine::ForCurrentProcess(); |
| std::string profile_dir("my_user"); |
| |
| cl->AppendSwitchASCII(switches::kLoginProfile, profile_dir); |
| cl->AppendSwitch(switches::kTestType); |
| |
| FilePath expected_default = |
| FilePath().AppendASCII(chrome::kNotSignedInProfile); |
| EXPECT_EQ(expected_default.value(), |
| profile_manager_->GetCurrentProfileDir().value()); |
| |
| profile_manager_->Observe(NotificationType::LOGIN_USER_CHANGED, |
| NotificationService::AllSources(), |
| NotificationService::NoDetails()); |
| FilePath expected_logged_in(profile_dir); |
| EXPECT_EQ(expected_logged_in.value(), |
| profile_manager_->GetCurrentProfileDir().value()); |
| VLOG(1) << temp_dir_.path().Append( |
| profile_manager_->GetCurrentProfileDir()).value(); |
| } |
| |
| #endif |
| |
| TEST_F(ProfileManagerTest, CreateAndUseTwoProfiles) { |
| FilePath dest_path1 = temp_dir_.path(); |
| dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); |
| |
| FilePath dest_path2 = temp_dir_.path(); |
| dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); |
| |
| Profile* profile1; |
| Profile* profile2; |
| |
| // Successfully create the profiles. |
| profile1 = profile_manager_->GetProfile(dest_path1); |
| ASSERT_TRUE(profile1); |
| |
| profile2 = profile_manager_->GetProfile(dest_path2); |
| ASSERT_TRUE(profile2); |
| |
| // Force lazy-init of some profile services to simulate use. |
| EXPECT_TRUE(profile1->GetHistoryService(Profile::EXPLICIT_ACCESS)); |
| EXPECT_TRUE(profile1->GetBookmarkModel()); |
| EXPECT_TRUE(profile2->GetBookmarkModel()); |
| EXPECT_TRUE(profile2->GetHistoryService(Profile::EXPLICIT_ACCESS)); |
| |
| // Make sure any pending tasks run before we destroy the profiles. |
| message_loop_.RunAllPending(); |
| |
| profile_manager_.reset(); |
| |
| // Make sure history cleans up correctly. |
| message_loop_.RunAllPending(); |
| } |
| |
| // Tests asynchronous profile creation mechanism. |
| TEST_F(ProfileManagerTest, CreateProfileAsync) { |
| FilePath dest_path = |
| temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile")); |
| |
| MockObserver mock_observer; |
| EXPECT_CALL(mock_observer, OnProfileCreated(testing::NotNull())).Times(1); |
| |
| profile_manager_->CreateProfileAsync(dest_path, &mock_observer); |
| |
| message_loop_.RunAllPending(); |
| } |
| |
| MATCHER(SameNotNull, "The same non-NULL value for all cals.") { |
| if (!g_created_profile) |
| g_created_profile = arg; |
| return g_created_profile == arg; |
| } |
| |
| TEST_F(ProfileManagerTest, CreateProfileAsyncMultipleRequests) { |
| FilePath dest_path = |
| temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile")); |
| |
| g_created_profile = NULL; |
| |
| MockObserver mock_observer1; |
| EXPECT_CALL(mock_observer1, OnProfileCreated(SameNotNull())).Times(1); |
| MockObserver mock_observer2; |
| EXPECT_CALL(mock_observer2, OnProfileCreated(SameNotNull())).Times(1); |
| MockObserver mock_observer3; |
| EXPECT_CALL(mock_observer3, OnProfileCreated(SameNotNull())).Times(1); |
| |
| profile_manager_->CreateProfileAsync(dest_path, &mock_observer1); |
| profile_manager_->CreateProfileAsync(dest_path, &mock_observer2); |
| profile_manager_->CreateProfileAsync(dest_path, &mock_observer3); |
| |
| message_loop_.RunAllPending(); |
| } |
| |
| TEST_F(ProfileManagerTest, CreateProfilesAsync) { |
| FilePath dest_path1 = |
| temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 1")); |
| FilePath dest_path2 = |
| temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 2")); |
| |
| MockObserver mock_observer; |
| EXPECT_CALL(mock_observer, OnProfileCreated(testing::NotNull())).Times(2); |
| |
| profile_manager_->CreateProfileAsync(dest_path1, &mock_observer); |
| profile_manager_->CreateProfileAsync(dest_path2, &mock_observer); |
| |
| message_loop_.RunAllPending(); |
| } |