| // Copyright (c) 2013 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 "base/command_line.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/profiles/avatar_menu.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/profiles/profile_window.h" |
| #include "chrome/browser/profiles/profiles_state.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_list.h" |
| #include "chrome/browser/ui/user_manager.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/test_switches.h" |
| #include "chrome/test/base/testing_browser_process.h" |
| #include "content/public/test/test_utils.h" |
| |
| namespace { |
| |
| // An observer that returns back to test code after a new profile is |
| // initialized. |
| void OnUnblockOnProfileCreation(Profile* profile, |
| Profile::CreateStatus status) { |
| if (status == Profile::CREATE_STATUS_INITIALIZED) |
| base::MessageLoop::current()->Quit(); |
| } |
| |
| } // namespace |
| |
| class ProfileListDesktopBrowserTest : public InProcessBrowserTest { |
| public: |
| ProfileListDesktopBrowserTest() {} |
| |
| scoped_ptr<AvatarMenu> CreateAvatarMenu(ProfileInfoCache* cache) { |
| return scoped_ptr<AvatarMenu>(new AvatarMenu(cache, NULL, browser())); |
| } |
| |
| private: |
| scoped_ptr<AvatarMenu> avatar_menu_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ProfileListDesktopBrowserTest); |
| }; |
| |
| #if defined(OS_WIN) |
| // SignOut is flaky. So far only observed on Windows. crbug.com/357329. |
| #define MAYBE_SignOut DISABLED_SignOut |
| #elif defined(OS_CHROMEOS) |
| // This test doesn't make sense for Chrome OS since it has a different |
| // multi-profiles menu in the system tray instead. |
| #define MAYBE_SignOut DISABLED_SignOut |
| #else |
| #define MAYBE_SignOut SignOut |
| #endif |
| IN_PROC_BROWSER_TEST_F(ProfileListDesktopBrowserTest, MAYBE_SignOut) { |
| if (!profiles::IsMultipleProfilesEnabled()) |
| return; |
| |
| ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| Profile* current_profile = browser()->profile(); |
| ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| size_t index = cache.GetIndexOfProfileWithPath(current_profile->GetPath()); |
| |
| scoped_ptr<AvatarMenu> menu = CreateAvatarMenu(&cache); |
| menu->RebuildMenu(); |
| |
| BrowserList* browser_list = |
| BrowserList::GetInstance(chrome::GetActiveDesktop()); |
| EXPECT_EQ(1U, browser_list->size()); |
| content::WindowedNotificationObserver window_close_observer( |
| chrome::NOTIFICATION_BROWSER_CLOSED, |
| content::Source<Browser>(browser())); |
| |
| EXPECT_FALSE(cache.ProfileIsSigninRequiredAtIndex(index)); |
| profiles::LockProfile(current_profile); |
| window_close_observer.Wait(); // rely on test time-out for failure indication |
| |
| EXPECT_TRUE(cache.ProfileIsSigninRequiredAtIndex(index)); |
| EXPECT_EQ(0U, browser_list->size()); |
| |
| // Signing out brings up the User Manager which we should close before exit. |
| UserManager::Hide(); |
| } |
| |
| #if defined(OS_CHROMEOS) |
| // This test doesn't make sense for Chrome OS since it has a different |
| // multi-profiles menu in the system tray instead. |
| #define MAYBE_SwitchToProfile DISABLED_SwitchToProfile |
| #else |
| #define MAYBE_SwitchToProfile SwitchToProfile |
| #endif |
| IN_PROC_BROWSER_TEST_F(ProfileListDesktopBrowserTest, MAYBE_SwitchToProfile) { |
| #if defined(OS_WIN) && defined(USE_ASH) |
| // Disable this test in Metro+Ash for now (http://crbug.com/262796). |
| if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) |
| return; |
| #endif |
| |
| if (!profiles::IsMultipleProfilesEnabled()) |
| return; |
| |
| ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| Profile* current_profile = browser()->profile(); |
| ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); |
| base::FilePath path_profile1 = current_profile->GetPath(); |
| base::FilePath user_dir = cache.GetUserDataDir(); |
| |
| // Create an additional profile. |
| base::FilePath path_profile2 = user_dir.Append( |
| FILE_PATH_LITERAL("New Profile 2")); |
| profile_manager->CreateProfileAsync(path_profile2, |
| base::Bind(&OnUnblockOnProfileCreation), |
| base::string16(), base::string16(), |
| std::string()); |
| |
| // Spin to allow profile creation to take place, loop is terminated |
| // by OnUnblockOnProfileCreation when the profile is created. |
| content::RunMessageLoop(); |
| ASSERT_EQ(cache.GetNumberOfProfiles(), 2U); |
| |
| scoped_ptr<AvatarMenu> menu = CreateAvatarMenu(&cache); |
| menu->RebuildMenu(); |
| BrowserList* browser_list = |
| BrowserList::GetInstance(chrome::GetActiveDesktop()); |
| EXPECT_EQ(1U, browser_list->size()); |
| EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath()); |
| |
| // Open a browser window for the first profile. |
| menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1), |
| false, ProfileMetrics::SWITCH_PROFILE_ICON); |
| EXPECT_EQ(1U, browser_list->size()); |
| EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath()); |
| |
| // Open a browser window for the second profile. |
| menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile2), |
| false, ProfileMetrics::SWITCH_PROFILE_ICON); |
| EXPECT_EQ(2U, browser_list->size()); |
| |
| // Switch to the first profile without opening a new window. |
| menu->SwitchToProfile(cache.GetIndexOfProfileWithPath(path_profile1), |
| false, ProfileMetrics::SWITCH_PROFILE_ICON); |
| EXPECT_EQ(2U, browser_list->size()); |
| EXPECT_EQ(path_profile1, browser_list->get(0)->profile()->GetPath()); |
| EXPECT_EQ(path_profile2, browser_list->get(1)->profile()->GetPath()); |
| } |