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 "chrome/browser/ui/views/profiles/avatar_menu_button.h"
6
7#include "base/command_line.h"
8#include "base/path_service.h"
9#include "base/strings/utf_string_conversions.h"
10#include "chrome/browser/profiles/profile_manager.h"
11#include "chrome/browser/profiles/profiles_state.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_bubble_view.h"
15#include "chrome/common/chrome_paths.h"
16#include "chrome/common/chrome_switches.h"
17#include "chrome/test/base/in_process_browser_test.h"
18#include "chrome/test/base/test_switches.h"
19#include "chrome/test/base/testing_browser_process.h"
20
21class AvatarMenuButtonTest : public InProcessBrowserTest {
22 public:
23  AvatarMenuButtonTest();
24  virtual ~AvatarMenuButtonTest();
25
26 protected:
27  void CreateTestingProfile();
28  AvatarMenuButton* GetAvatarMenuButton();
29  void StartAvatarMenu();
30
31 private:
32  DISALLOW_COPY_AND_ASSIGN(AvatarMenuButtonTest);
33};
34
35AvatarMenuButtonTest::AvatarMenuButtonTest() {
36}
37
38AvatarMenuButtonTest::~AvatarMenuButtonTest() {
39}
40
41void AvatarMenuButtonTest::CreateTestingProfile() {
42  ProfileManager* profile_manager = g_browser_process->profile_manager();
43  EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
44
45  base::FilePath path;
46  PathService::Get(chrome::DIR_USER_DATA, &path);
47  path = path.AppendASCII("test_profile");
48  if (!base::PathExists(path))
49    ASSERT_TRUE(base::CreateDirectory(path));
50  Profile* profile =
51      Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
52  profile_manager->RegisterTestingProfile(profile, true, false);
53  EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles());
54}
55
56AvatarMenuButton* AvatarMenuButtonTest::GetAvatarMenuButton() {
57  BrowserView* browser_view = reinterpret_cast<BrowserView*>(
58      browser()->window());
59  return browser_view->frame()->GetAvatarMenuButton();
60}
61
62void AvatarMenuButtonTest::StartAvatarMenu() {
63  AvatarMenuButton* button = GetAvatarMenuButton();
64  ASSERT_TRUE(button);
65
66  AvatarMenuBubbleView::clear_close_on_deactivate_for_testing();
67  static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
68      NULL, gfx::Point());
69  base::MessageLoop::current()->RunUntilIdle();
70  EXPECT_TRUE(AvatarMenuBubbleView::IsShowing());
71}
72
73// See http://crbug.com/315732
74#if defined(OS_WIN)
75#define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
76#elif defined(OS_CHROMEOS)
77// This test doesn't make sense for ChromeOS since it has a different
78// multi-profiles menu in the system tray instead.
79#define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
80#else
81#define MAYBE_HideOnSecondClick HideOnSecondClick
82#endif
83
84IN_PROC_BROWSER_TEST_F(AvatarMenuButtonTest, MAYBE_HideOnSecondClick) {
85#if defined(OS_WIN) && defined(USE_ASH)
86  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
87  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
88    return;
89#endif
90
91  // If multiprofile mode is not enabled, you can't switch between profiles.
92  if (!profiles::IsMultipleProfilesEnabled())
93    return;
94
95  CreateTestingProfile();
96  ASSERT_NO_FATAL_FAILURE(StartAvatarMenu());
97
98  // Verify that clicking again doesn't reshow it.
99  AvatarMenuButton* button = GetAvatarMenuButton();
100  static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
101      NULL, gfx::Point());
102  // Hide the bubble manually. In the browser this would normally happen during
103  // the event processing.
104  AvatarMenuBubbleView::Hide();
105  base::MessageLoop::current()->RunUntilIdle();
106  EXPECT_FALSE(AvatarMenuBubbleView::IsShowing());
107}
108