new_avatar_menu_button_browsertest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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
28class 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
43NewAvatarMenuButtonTest::NewAvatarMenuButtonTest() {
44}
45
46NewAvatarMenuButtonTest::~NewAvatarMenuButtonTest() {
47}
48
49void NewAvatarMenuButtonTest::SetUp() {
50  InProcessBrowserTest::SetUp();
51  DCHECK(switches::IsNewProfileManagement());
52}
53
54void NewAvatarMenuButtonTest::SetUpCommandLine(CommandLine* command_line) {
55  switches::EnableNewProfileManagementForTesting(command_line);
56}
57
58void 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
77void 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
104IN_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