ash_test_base.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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#ifndef ASH_TEST_ASH_TEST_BASE_H_
6#define ASH_TEST_ASH_TEST_BASE_H_
7
8#include <string>
9
10#include "base/compiler_specific.h"
11#include "base/message_loop/message_loop.h"
12#include "base/threading/thread.h"
13#include "content/public/test/test_browser_thread_bundle.h"
14#include "testing/gtest/include/gtest/gtest.h"
15#include "third_party/skia/include/core/SkColor.h"
16#include "ui/views/test/test_views_delegate.h"
17#include "ui/wm/public/window_types.h"
18
19#if defined(OS_WIN)
20#include "ui/base/win/scoped_ole_initializer.h"
21#endif
22
23namespace aura {
24class RootWindow;
25class Window;
26class WindowDelegate;
27
28namespace test {
29class EventGenerator;
30}  // namespace test
31}  // namespace aura
32
33namespace ash {
34namespace internal {
35class DisplayManager;
36}  // namespace internal
37
38namespace test {
39
40class AshTestHelper;
41class TestScreenshotDelegate;
42class TestSystemTrayDelegate;
43#if defined(OS_WIN)
44class TestMetroViewerProcessHost;
45#endif
46
47class AshTestViewsDelegate : public views::TestViewsDelegate {
48 public:
49  // Overriden from TestViewsDelegate.
50  virtual content::WebContents* CreateWebContents(
51      content::BrowserContext* browser_context,
52      content::SiteInstance* site_instance) OVERRIDE;
53};
54
55class AshTestBase : public testing::Test {
56 public:
57  AshTestBase();
58  virtual ~AshTestBase();
59
60  // testing::Test:
61  virtual void SetUp() OVERRIDE;
62  virtual void TearDown() OVERRIDE;
63
64  // Update the display configuration as given in |display_specs|.
65  // See ash::test::DisplayManagerTestApi::UpdateDisplay for more details.
66  void UpdateDisplay(const std::string& display_specs);
67
68  // Returns a root Window. Usually this is the active root Window, but that
69  // method can return NULL sometimes, and in those cases, we fall back on the
70  // primary root Window.
71  aura::Window* CurrentContext();
72
73  // Versions of the functions in aura::test:: that go through our shell
74  // StackingController instead of taking a parent.
75  aura::Window* CreateTestWindowInShellWithId(int id);
76  aura::Window* CreateTestWindowInShellWithBounds(const gfx::Rect& bounds);
77  aura::Window* CreateTestWindowInShell(SkColor color,
78                                        int id,
79                                        const gfx::Rect& bounds);
80  aura::Window* CreateTestWindowInShellWithDelegate(
81      aura::WindowDelegate* delegate,
82      int id,
83      const gfx::Rect& bounds);
84  aura::Window* CreateTestWindowInShellWithDelegateAndType(
85      aura::WindowDelegate* delegate,
86      ui::wm::WindowType type,
87      int id,
88      const gfx::Rect& bounds);
89
90  // Attach |window| to the current shell's root window.
91  void ParentWindowInPrimaryRootWindow(aura::Window* window);
92
93  // Returns the EventGenerator that uses screen coordinates and works
94  // across multiple displays. It createse a new generator if it
95  // hasn't been created yet.
96  aura::test::EventGenerator& GetEventGenerator();
97
98 protected:
99  enum UserSessionBlockReason {
100    FIRST_BLOCK_REASON,
101    BLOCKED_BY_LOCK_SCREEN = FIRST_BLOCK_REASON,
102    BLOCKED_BY_LOGIN_SCREEN,
103    BLOCKED_BY_USER_ADDING_SCREEN,
104    NUMBER_OF_BLOCK_REASONS
105  };
106
107  // True if the running environment supports multiple displays,
108  // or false otherwise (e.g. win8 bot).
109  static bool SupportsMultipleDisplays();
110
111  // True if the running environment supports host window resize,
112  // or false otherwise (e.g. win8 bot).
113  static bool SupportsHostWindowResize();
114
115  void set_start_session(bool start_session) { start_session_ = start_session; }
116
117  void RunAllPendingInMessageLoop();
118
119  TestScreenshotDelegate* GetScreenshotDelegate();
120  TestSystemTrayDelegate* GetSystemTrayDelegate();
121
122  // Utility methods to emulate user logged in or not, session started or not
123  // and user able to lock screen or not cases.
124  void SetSessionStarted(bool session_started);
125  void SetUserLoggedIn(bool user_logged_in);
126  void SetCanLockScreen(bool can_lock_screen);
127  void SetShouldLockScreenBeforeSuspending(bool should_lock);
128  void SetUserAddingScreenRunning(bool user_adding_screen_running);
129
130  // Methods to emulate blocking and unblocking user session with given
131  // |block_reason|.
132  void BlockUserSession(UserSessionBlockReason block_reason);
133  void UnblockUserSession();
134
135 private:
136  bool setup_called_;
137  bool teardown_called_;
138  // |SetUp()| doesn't activate session if this is set to false.
139  bool start_session_;
140  content::TestBrowserThreadBundle thread_bundle_;
141  scoped_ptr<AshTestHelper> ash_test_helper_;
142  scoped_ptr<aura::test::EventGenerator> event_generator_;
143#if defined(OS_WIN)
144  // Note that the order is important here as ipc_thread_ should be destroyed
145  // after metro_viewer_host_->channel_.
146  scoped_ptr<base::Thread> ipc_thread_;
147  scoped_ptr<TestMetroViewerProcessHost> metro_viewer_host_;
148  ui::ScopedOleInitializer ole_initializer_;
149#endif
150
151  DISALLOW_COPY_AND_ASSIGN(AshTestBase);
152};
153
154class NoSessionAshTestBase : public AshTestBase {
155 public:
156  NoSessionAshTestBase() {
157    set_start_session(false);
158  }
159  virtual ~NoSessionAshTestBase() {}
160
161 private:
162  DISALLOW_COPY_AND_ASSIGN(NoSessionAshTestBase);
163};
164
165}  // namespace test
166}  // namespace ash
167
168#endif  // ASH_TEST_ASH_TEST_BASE_H_
169