Home | History | Annotate | Download | only in profiles
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/command_line.h"
      6 #include "base/path_service.h"
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/chrome_notification_types.h"
      9 #include "chrome/browser/profiles/profile_manager.h"
     10 #include "chrome/browser/profiles/profiles_state.h"
     11 #include "chrome/browser/ui/browser_dialogs.h"
     12 #include "chrome/browser/ui/browser_list.h"
     13 #include "chrome/browser/ui/views/frame/browser_view.h"
     14 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h"
     15 #include "chrome/browser/ui/views/profiles/new_avatar_button.h"
     16 #include "chrome/browser/ui/views/profiles/profile_chooser_view.h"
     17 #include "chrome/browser/ui/views/profiles/user_manager_view.h"
     18 #include "chrome/common/chrome_paths.h"
     19 #include "chrome/common/chrome_switches.h"
     20 #include "chrome/test/base/in_process_browser_test.h"
     21 #include "chrome/test/base/test_switches.h"
     22 #include "chrome/test/base/testing_browser_process.h"
     23 #include "components/signin/core/common/profile_management_switches.h"
     24 #include "content/public/test/test_utils.h"
     25 #include "grit/generated_resources.h"
     26 #include "ui/views/controls/button/label_button.h"
     27 
     28 class NewAvatarMenuButtonTest : public InProcessBrowserTest {
     29  public:
     30   NewAvatarMenuButtonTest();
     31   virtual ~NewAvatarMenuButtonTest();
     32 
     33  protected:
     34   virtual void SetUp() OVERRIDE;
     35   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
     36   void CreateTestingProfile();
     37   void StartAvatarMenu();
     38 
     39  private:
     40   DISALLOW_COPY_AND_ASSIGN(NewAvatarMenuButtonTest);
     41 };
     42 
     43 NewAvatarMenuButtonTest::NewAvatarMenuButtonTest() {
     44 }
     45 
     46 NewAvatarMenuButtonTest::~NewAvatarMenuButtonTest() {
     47 }
     48 
     49 void NewAvatarMenuButtonTest::SetUp() {
     50   InProcessBrowserTest::SetUp();
     51   DCHECK(switches::IsNewProfileManagement());
     52 }
     53 
     54 void NewAvatarMenuButtonTest::SetUpCommandLine(CommandLine* command_line) {
     55   switches::EnableNewProfileManagementForTesting(command_line);
     56 }
     57 
     58 void NewAvatarMenuButtonTest::CreateTestingProfile() {
     59   ProfileManager* profile_manager = g_browser_process->profile_manager();
     60   EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
     61 
     62   // Sign in the default profile
     63   ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
     64   cache.SetUserNameOfProfileAtIndex(0, base::UTF8ToUTF16("user_name"));
     65 
     66   base::FilePath path;
     67   PathService::Get(chrome::DIR_USER_DATA, &path);
     68   path = path.AppendASCII("test_profile");
     69   if (!base::PathExists(path))
     70     ASSERT_TRUE(base::CreateDirectory(path));
     71   Profile* profile =
     72       Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
     73   profile_manager->RegisterTestingProfile(profile, true, false);
     74   EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles());
     75 }
     76 
     77 void NewAvatarMenuButtonTest::StartAvatarMenu() {
     78   BrowserView* browser_view = reinterpret_cast<BrowserView*>(
     79       browser()->window());
     80 
     81   // Ensure that the avatar icon button is not also showing.
     82   NewAvatarButton* button = browser_view->frame()->GetNewAvatarMenuButton();
     83   ASSERT_TRUE(button);
     84   ASSERT_FALSE(browser_view->frame()->GetAvatarMenuButton());
     85 
     86   ProfileChooserView::clear_close_on_deactivate_for_testing();
     87   ui::MouseEvent mouse_ev(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0,
     88                           0);
     89   button->NotifyClick(mouse_ev);
     90   base::MessageLoop::current()->RunUntilIdle();
     91   EXPECT_TRUE(ProfileChooserView::IsShowing());
     92 }
     93 
     94 #if defined(OS_CHROMEOS) || defined (OS_LINUX) || defined (OS_WIN)
     95 // This test doesn't make sense for ChromeOS since it has a different
     96 // multi-profiles menu in the system tray instead.
     97 //
     98 // Test fails flakily on Linux and Windows http://crbug.com/352710
     99 #define MAYBE_SignOut DISABLED_SignOut
    100 #else
    101 #define MAYBE_SignOut SignOut
    102 #endif
    103 
    104 IN_PROC_BROWSER_TEST_F(NewAvatarMenuButtonTest, MAYBE_SignOut) {
    105   // If multiprofile mode is not enabled, you can't switch between profiles.
    106   if (!profiles::IsMultipleProfilesEnabled())
    107     return;
    108 
    109   CreateTestingProfile();
    110   ASSERT_NO_FATAL_FAILURE(StartAvatarMenu());
    111 
    112   BrowserList* browser_list =
    113       BrowserList::GetInstance(chrome::GetActiveDesktop());
    114   EXPECT_EQ(1U, browser_list->size());
    115   content::WindowedNotificationObserver window_close_observer(
    116       chrome::NOTIFICATION_BROWSER_CLOSED,
    117       content::Source<Browser>(browser()));
    118 
    119   AvatarMenu* menu =
    120       ProfileChooserView::profile_bubble_->avatar_menu_.get();
    121   const AvatarMenu::Item& menu_item_before =
    122       menu->GetItemAt(menu->GetActiveProfileIndex());
    123   EXPECT_FALSE(menu_item_before.signin_required);
    124 
    125   ui::MouseEvent mouse_ev(
    126       ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0, 0);
    127   ProfileChooserView::profile_bubble_->ButtonPressed(
    128       ProfileChooserView::profile_bubble_->lock_button_, mouse_ev);
    129 
    130   EXPECT_TRUE(menu->GetItemAt(menu->GetActiveProfileIndex()).signin_required);
    131 
    132   window_close_observer.Wait();  // Rely on test timeout for failure indication.
    133   EXPECT_TRUE(browser_list->empty());
    134 
    135   // If the User Manager hasn't shown yet, wait for it to show up.
    136   if (!UserManagerView::IsShowing())
    137     base::MessageLoop::current()->RunUntilIdle();
    138 
    139   // We need to hide the User Manager or else the process can't die.
    140   chrome::HideUserManager();
    141 }
    142