new_avatar_menu_button_browsertest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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 "ui/views/controls/button/label_button.h"
26
27class NewAvatarMenuButtonTest : public InProcessBrowserTest {
28 public:
29  NewAvatarMenuButtonTest();
30  virtual ~NewAvatarMenuButtonTest();
31
32 protected:
33  virtual void SetUp() OVERRIDE;
34  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
35  void CreateTestingProfile();
36  void StartAvatarMenu();
37
38 private:
39  DISALLOW_COPY_AND_ASSIGN(NewAvatarMenuButtonTest);
40};
41
42NewAvatarMenuButtonTest::NewAvatarMenuButtonTest() {
43}
44
45NewAvatarMenuButtonTest::~NewAvatarMenuButtonTest() {
46}
47
48void NewAvatarMenuButtonTest::SetUp() {
49  InProcessBrowserTest::SetUp();
50  DCHECK(switches::IsNewAvatarMenu());
51}
52
53void NewAvatarMenuButtonTest::SetUpCommandLine(CommandLine* command_line) {
54  switches::EnableNewAvatarMenuForTesting(command_line);
55}
56
57void NewAvatarMenuButtonTest::CreateTestingProfile() {
58  ProfileManager* profile_manager = g_browser_process->profile_manager();
59  EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
60
61  // Sign in the default profile
62  ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
63  cache.SetUserNameOfProfileAtIndex(0, base::UTF8ToUTF16("user_name"));
64
65  base::FilePath path;
66  PathService::Get(chrome::DIR_USER_DATA, &path);
67  path = path.AppendASCII("test_profile");
68  if (!base::PathExists(path))
69    ASSERT_TRUE(base::CreateDirectory(path));
70  Profile* profile =
71      Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
72  profile_manager->RegisterTestingProfile(profile, true, false);
73  EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles());
74}
75
76void NewAvatarMenuButtonTest::StartAvatarMenu() {
77  BrowserView* browser_view = reinterpret_cast<BrowserView*>(
78      browser()->window());
79
80  // Ensure that the avatar icon button is not also showing.
81  NewAvatarButton* button = browser_view->frame()->GetNewAvatarMenuButton();
82  ASSERT_TRUE(button);
83  ASSERT_FALSE(browser_view->frame()->GetAvatarMenuButton());
84
85  ProfileChooserView::clear_close_on_deactivate_for_testing();
86  ui::MouseEvent mouse_ev(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0,
87                          0);
88  button->NotifyClick(mouse_ev);
89  base::MessageLoop::current()->RunUntilIdle();
90  EXPECT_TRUE(ProfileChooserView::IsShowing());
91}
92
93#if defined(OS_CHROMEOS) || defined (OS_LINUX) || defined (OS_WIN)
94// This test doesn't make sense for ChromeOS since it has a different
95// multi-profiles menu in the system tray instead.
96//
97// Test fails flakily on Linux and Windows http://crbug.com/352710
98#define MAYBE_SignOut DISABLED_SignOut
99#else
100#define MAYBE_SignOut SignOut
101#endif
102
103IN_PROC_BROWSER_TEST_F(NewAvatarMenuButtonTest, MAYBE_SignOut) {
104  // If multiprofile mode is not enabled, you can't switch between profiles.
105  if (!profiles::IsMultipleProfilesEnabled())
106    return;
107
108  CreateTestingProfile();
109  ASSERT_NO_FATAL_FAILURE(StartAvatarMenu());
110
111  BrowserList* browser_list =
112      BrowserList::GetInstance(chrome::GetActiveDesktop());
113  EXPECT_EQ(1U, browser_list->size());
114  content::WindowedNotificationObserver window_close_observer(
115      chrome::NOTIFICATION_BROWSER_CLOSED,
116      content::Source<Browser>(browser()));
117
118  AvatarMenu* menu =
119      ProfileChooserView::profile_bubble_->avatar_menu_.get();
120  const AvatarMenu::Item& menu_item_before =
121      menu->GetItemAt(menu->GetActiveProfileIndex());
122  EXPECT_FALSE(menu_item_before.signin_required);
123
124  ui::MouseEvent mouse_ev(
125      ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0, 0);
126  ProfileChooserView::profile_bubble_->ButtonPressed(
127      ProfileChooserView::profile_bubble_->lock_button_, mouse_ev);
128
129  EXPECT_TRUE(menu->GetItemAt(menu->GetActiveProfileIndex()).signin_required);
130
131  window_close_observer.Wait();  // Rely on test timeout for failure indication.
132  EXPECT_TRUE(browser_list->empty());
133
134  // If the User Manager hasn't shown yet, wait for it to show up.
135  if (!UserManagerView::IsShowing())
136    base::MessageLoop::current()->RunUntilIdle();
137
138  // We need to hide the User Manager or else the process can't die.
139  chrome::HideUserManager();
140}
141