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