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.
5 #include "build/build_config.h"
6 #include "chrome/browser/ui/browser.h"
7 #include "chrome/browser/ui/browser_tabstrip.h"
8 #include "chrome/browser/ui/browser_window.h"
9 #include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
10 #include "chrome/browser/ui/fullscreen/fullscreen_controller_state_test.h"
11 #include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
12 #include "chrome/test/base/in_process_browser_test.h"
13 #include "content/public/browser/web_contents.h"
14 #include "content/public/common/url_constants.h"
15 #include "content/public/test/test_utils.h"
16 #include "testing/gtest/include/gtest/gtest.h"
18 using chrome::kAboutBlankURL
;
19 using content::PAGE_TRANSITION_TYPED
;
21 // Interactive test fixture testing Fullscreen Controller through its states. --
22 // See documentation at the top of fullscreen_controller_state_unittest.cc.
23 class FullscreenControllerStateInteractiveTest
24 : public InProcessBrowserTest
,
25 public FullscreenControllerStateTest
{
27 // FullscreenControllerStateTest:
28 virtual void ChangeWindowFullscreenState() OVERRIDE
;
29 virtual bool InvokeEvent(Event event
) OVERRIDE
;
32 // FullscreenControllerStateTest:
33 virtual bool ShouldSkipTest(State state
,
35 bool reentrant
) OVERRIDE
;
36 virtual Browser
* GetBrowser() OVERRIDE
;
38 scoped_ptr
<FullscreenNotificationObserver
> fullscreen_observer_
;
41 void FullscreenControllerStateInteractiveTest::ChangeWindowFullscreenState() {
42 if (fullscreen_observer_
) {
43 // If tests are stuck here, use the following log command to see progress.
44 // LOG(INFO) << GetAndClearDebugLog();
45 fullscreen_observer_
->Wait();
46 fullscreen_observer_
.reset(NULL
);
50 bool FullscreenControllerStateInteractiveTest::InvokeEvent(Event event
) {
52 case TOGGLE_FULLSCREEN
:
53 case TAB_FULLSCREEN_TRUE
:
54 case TAB_FULLSCREEN_FALSE
:
57 case METRO_SNAP_FALSE
:
59 fullscreen_observer_
.reset(new FullscreenNotificationObserver());
62 // ChangeWindowFullscreenState() will be called and then wait on
63 // fullscreen_observer_ if needed.
66 NOTREACHED() << "InvokeEvent needs a handler for event "
67 << GetEventString(event
) << GetAndClearDebugLog();
71 return FullscreenControllerStateTest::InvokeEvent(event
);
74 bool FullscreenControllerStateInteractiveTest::ShouldSkipTest(State state
,
77 // Interactive tests run reentrant or not based on the platform
78 // implementation, so limit our test runs to match.
81 debugging_log_
<< "\nSkipping non-reentrant test on Windows.\n";
86 debugging_log_
<< "\nSkipping reentrant test on non-Windows.\n";
91 return FullscreenControllerStateTest::ShouldSkipTest(state
,
96 Browser
* FullscreenControllerStateInteractiveTest::GetBrowser() {
97 return InProcessBrowserTest::browser();
100 // Tests -----------------------------------------------------------------------
102 #define TEST_EVENT_INNER(state, event, reentrant, reentrant_id) \
103 IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest, \
104 DISABLED_##state##__##event##reentrant_id) { \
105 AddTabAtIndex(0, GURL(kAboutBlankURL), PAGE_TRANSITION_TYPED); \
106 ASSERT_NO_FATAL_FAILURE(TestStateAndEvent(state, event, reentrant)) \
107 << GetAndClearDebugLog(); \
109 // Progress of tests can be examined by inserting the following line:
110 // LOG(INFO) << GetAndClearDebugLog(); }
112 #define TEST_EVENT(state, event) \
113 TEST_EVENT_INNER(state, event, false, ); \
114 TEST_EVENT_INNER(state, event, true, _Reentrant);
116 // Individual tests for each pair of state and event:
118 TEST_EVENT(STATE_NORMAL
, TOGGLE_FULLSCREEN
);
119 TEST_EVENT(STATE_NORMAL
, TAB_FULLSCREEN_TRUE
);
120 TEST_EVENT(STATE_NORMAL
, TAB_FULLSCREEN_FALSE
);
122 TEST_EVENT(STATE_NORMAL
, METRO_SNAP_TRUE
);
123 TEST_EVENT(STATE_NORMAL
, METRO_SNAP_FALSE
);
125 TEST_EVENT(STATE_NORMAL
, BUBBLE_EXIT_LINK
);
126 TEST_EVENT(STATE_NORMAL
, BUBBLE_ALLOW
);
127 TEST_EVENT(STATE_NORMAL
, BUBBLE_DENY
);
128 TEST_EVENT(STATE_NORMAL
, WINDOW_CHANGE
);
130 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, TOGGLE_FULLSCREEN
);
131 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, TAB_FULLSCREEN_TRUE
);
132 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, TAB_FULLSCREEN_FALSE
);
134 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, METRO_SNAP_TRUE
);
135 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, METRO_SNAP_FALSE
);
137 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_EXIT_LINK
);
138 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_ALLOW
);
139 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_DENY
);
140 TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME
, WINDOW_CHANGE
);
143 TEST_EVENT(STATE_METRO_SNAP
, TOGGLE_FULLSCREEN
);
144 TEST_EVENT(STATE_METRO_SNAP
, TAB_FULLSCREEN_TRUE
);
145 TEST_EVENT(STATE_METRO_SNAP
, TAB_FULLSCREEN_FALSE
);
146 TEST_EVENT(STATE_METRO_SNAP
, METRO_SNAP_TRUE
);
147 TEST_EVENT(STATE_METRO_SNAP
, METRO_SNAP_FALSE
);
148 TEST_EVENT(STATE_METRO_SNAP
, BUBBLE_EXIT_LINK
);
149 TEST_EVENT(STATE_METRO_SNAP
, BUBBLE_ALLOW
);
150 TEST_EVENT(STATE_METRO_SNAP
, BUBBLE_DENY
);
151 TEST_EVENT(STATE_METRO_SNAP
, WINDOW_CHANGE
);
154 TEST_EVENT(STATE_TAB_FULLSCREEN
, TOGGLE_FULLSCREEN
);
155 TEST_EVENT(STATE_TAB_FULLSCREEN
, TAB_FULLSCREEN_TRUE
);
156 TEST_EVENT(STATE_TAB_FULLSCREEN
, TAB_FULLSCREEN_FALSE
);
158 TEST_EVENT(STATE_TAB_FULLSCREEN
, METRO_SNAP_TRUE
);
159 TEST_EVENT(STATE_TAB_FULLSCREEN
, METRO_SNAP_FALSE
);
161 TEST_EVENT(STATE_TAB_FULLSCREEN
, BUBBLE_EXIT_LINK
);
162 TEST_EVENT(STATE_TAB_FULLSCREEN
, BUBBLE_ALLOW
);
163 TEST_EVENT(STATE_TAB_FULLSCREEN
, BUBBLE_DENY
);
164 TEST_EVENT(STATE_TAB_FULLSCREEN
, WINDOW_CHANGE
);
166 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, TOGGLE_FULLSCREEN
);
167 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, TAB_FULLSCREEN_TRUE
);
168 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, TAB_FULLSCREEN_FALSE
);
170 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, METRO_SNAP_TRUE
);
171 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, METRO_SNAP_FALSE
);
173 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, BUBBLE_EXIT_LINK
);
174 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, BUBBLE_ALLOW
);
175 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, BUBBLE_DENY
);
176 TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN
, WINDOW_CHANGE
);
178 TEST_EVENT(STATE_TO_NORMAL
, TOGGLE_FULLSCREEN
);
179 TEST_EVENT(STATE_TO_NORMAL
, TAB_FULLSCREEN_TRUE
);
180 TEST_EVENT(STATE_TO_NORMAL
, TAB_FULLSCREEN_FALSE
);
182 TEST_EVENT(STATE_TO_NORMAL
, METRO_SNAP_TRUE
);
183 TEST_EVENT(STATE_TO_NORMAL
, METRO_SNAP_FALSE
);
185 TEST_EVENT(STATE_TO_NORMAL
, BUBBLE_EXIT_LINK
);
186 TEST_EVENT(STATE_TO_NORMAL
, BUBBLE_ALLOW
);
187 TEST_EVENT(STATE_TO_NORMAL
, BUBBLE_DENY
);
188 TEST_EVENT(STATE_TO_NORMAL
, WINDOW_CHANGE
);
190 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, TOGGLE_FULLSCREEN
);
191 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, TAB_FULLSCREEN_TRUE
);
192 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, TAB_FULLSCREEN_FALSE
);
194 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, METRO_SNAP_TRUE
);
195 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, METRO_SNAP_FALSE
);
197 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_EXIT_LINK
);
198 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_ALLOW
);
199 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, BUBBLE_DENY
);
200 TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME
, WINDOW_CHANGE
);
202 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, TOGGLE_FULLSCREEN
);
203 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, TAB_FULLSCREEN_TRUE
);
204 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, TAB_FULLSCREEN_FALSE
);
206 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, METRO_SNAP_TRUE
);
207 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, METRO_SNAP_FALSE
);
209 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, BUBBLE_EXIT_LINK
);
210 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, BUBBLE_ALLOW
);
211 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, BUBBLE_DENY
);
212 TEST_EVENT(STATE_TO_TAB_FULLSCREEN
, WINDOW_CHANGE
);
214 // Specific one-off tests for known issues:
216 // Used manually to determine what happens on a platform.
217 IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest
,
218 DISABLED_ManualTest
) {
219 // A tab is needed for tab fullscreen.
220 AddTabAtIndex(0, GURL(kAboutBlankURL
), PAGE_TRANSITION_TYPED
);
221 ASSERT_TRUE(InvokeEvent(TOGGLE_FULLSCREEN
)) << GetAndClearDebugLog();
222 ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE
)) << GetAndClearDebugLog();
223 ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE
)) << GetAndClearDebugLog();
224 ASSERT_TRUE(InvokeEvent(TOGGLE_FULLSCREEN
)) << GetAndClearDebugLog();
225 ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE
)) << GetAndClearDebugLog();
227 // Wait, allowing human operator to observe the result.
228 scoped_refptr
<content::MessageLoopRunner
> message_loop
;
229 message_loop
= new content::MessageLoopRunner();
235 // Tests all states with all permutations of multiple events to detect lingering
236 // state issues that would bleed over to other states.
237 // I.E. for each state test all combinations of events E1, E2, E3.
239 // This produces coverage for event sequences that may happen normally but
240 // would not be exposed by traversing to each state via TransitionToState().
241 // TransitionToState() always takes the same path even when multiple paths
243 IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest
,
244 DISABLED_TransitionsForEachState
) {
245 // A tab is needed for tab fullscreen.
246 AddTabAtIndex(0, GURL(kAboutBlankURL
), PAGE_TRANSITION_TYPED
);
247 TestTransitionsForEachState();
248 // Progress of test can be examined via LOG(INFO) << GetAndClearDebugLog();