summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc')
-rw-r--r--chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc226
1 files changed, 226 insertions, 0 deletions
diff --git a/chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc b/chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc
new file mode 100644
index 0000000..1cc5739
--- /dev/null
+++ b/chrome/browser/ui/fullscreen/fullscreen_controller_state_interactive_browsertest.cc
@@ -0,0 +1,226 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "build/build_config.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
+#include "chrome/browser/ui/fullscreen/fullscreen_controller_state_test.h"
+#include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/url_constants.h"
+#include "content/public/test/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using chrome::kAboutBlankURL;
+using content::PAGE_TRANSITION_TYPED;
+
+// Interactive test fixture testing Fullscreen Controller through its states. --
+// See documentation at the top of fullscreen_controller_state_unittest.cc.
+class FullscreenControllerStateInteractiveTest
+ : public InProcessBrowserTest,
+ public FullscreenControllerStateTest {
+ public:
+ // FullscreenControllerStateTest:
+ virtual void ChangeWindowFullscreenState() OVERRIDE;
+ virtual bool InvokeEvent(Event event) OVERRIDE;
+
+ protected:
+ // FullscreenControllerStateTest:
+ virtual bool ShouldSkipTest(State state,
+ Event event,
+ bool reentrant) OVERRIDE;
+ virtual Browser* GetBrowser() OVERRIDE;
+
+ scoped_ptr<FullscreenNotificationObserver> fullscreen_observer_;
+};
+
+void FullscreenControllerStateInteractiveTest::ChangeWindowFullscreenState() {
+ if (fullscreen_observer_) {
+ // If tests are stuck here, use the following log command to see progress.
+ // LOG(INFO) << GetAndClearDebugLog();
+ fullscreen_observer_->Wait();
+ fullscreen_observer_.reset(NULL);
+ }
+}
+
+bool FullscreenControllerStateInteractiveTest::InvokeEvent(Event event) {
+ switch (event) {
+ case TOGGLE_FULLSCREEN:
+ case TAB_FULLSCREEN_TRUE:
+ case TAB_FULLSCREEN_FALSE:
+#if defined(OS_WIN)
+ case METRO_SNAP_TRUE:
+ case METRO_SNAP_FALSE:
+#endif
+ fullscreen_observer_.reset(new FullscreenNotificationObserver());
+ break;
+ case WINDOW_CHANGE:
+ // ChangeWindowFullscreenState() will be called and then wait on
+ // fullscreen_observer_ if needed.
+ break;
+ default:
+ NOTREACHED() << "InvokeEvent needs a handler for event "
+ << GetEventString(event) << GetAndClearDebugLog();
+ return false;
+ }
+
+ return FullscreenControllerStateTest::InvokeEvent(event);
+}
+
+bool FullscreenControllerStateInteractiveTest::ShouldSkipTest(State state,
+ Event event,
+ bool reentrant) {
+ // Interactive tests run reentrant or not based on the platform
+ // implementation, so limit our test runs to match.
+#if defined(OS_WIN)
+ if (!reentrant) {
+ debugging_log_ << "\nSkipping non-reentrant test on Windows.\n";
+ return true;
+ }
+#else
+ if (reentrant) {
+ debugging_log_ << "\nSkipping reentrant test on non-Windows.\n";
+ return true;
+ }
+#endif
+
+ return FullscreenControllerStateTest::ShouldSkipTest(state,
+ event,
+ reentrant);
+}
+
+Browser* FullscreenControllerStateInteractiveTest::GetBrowser() {
+ return InProcessBrowserTest::browser();
+}
+
+// Tests -----------------------------------------------------------------------
+
+#define TEST_EVENT_INNER(state, event, reentrant, reentrant_id) \
+ IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest, \
+ DISABLED_##state##__##event##reentrant_id) { \
+ AddTabAtIndex(0, GURL(kAboutBlankURL), PAGE_TRANSITION_TYPED); \
+ ASSERT_NO_FATAL_FAILURE(TestStateAndEvent(state, event, reentrant)) \
+ << GetAndClearDebugLog(); \
+ }
+ // Progress of tests can be examined by inserting the following line:
+ // LOG(INFO) << GetAndClearDebugLog(); }
+
+#define TEST_EVENT(state, event) \
+ TEST_EVENT_INNER(state, event, false, ); \
+ TEST_EVENT_INNER(state, event, true, _Reentrant);
+
+// Individual tests for each pair of state and event:
+
+TEST_EVENT(STATE_NORMAL, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_NORMAL, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_NORMAL, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_NORMAL, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_NORMAL, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_NORMAL, WINDOW_CHANGE);
+
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_BROWSER_FULLSCREEN_NO_CHROME, WINDOW_CHANGE);
+
+#if defined(OS_WIN)
+TEST_EVENT(STATE_METRO_SNAP, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_METRO_SNAP, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_METRO_SNAP, TAB_FULLSCREEN_FALSE);
+TEST_EVENT(STATE_METRO_SNAP, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_METRO_SNAP, METRO_SNAP_FALSE);
+TEST_EVENT(STATE_METRO_SNAP, WINDOW_CHANGE);
+#endif
+
+TEST_EVENT(STATE_TAB_FULLSCREEN, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_TAB_FULLSCREEN, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_TAB_FULLSCREEN, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_TAB_FULLSCREEN, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_TAB_FULLSCREEN, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_TAB_FULLSCREEN, WINDOW_CHANGE);
+
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_TAB_BROWSER_FULLSCREEN, WINDOW_CHANGE);
+
+TEST_EVENT(STATE_TO_NORMAL, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_TO_NORMAL, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_TO_NORMAL, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_TO_NORMAL, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_TO_NORMAL, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_TO_NORMAL, WINDOW_CHANGE);
+
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME, WINDOW_CHANGE);
+
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, TOGGLE_FULLSCREEN);
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, TAB_FULLSCREEN_TRUE);
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, TAB_FULLSCREEN_FALSE);
+#if defined(OS_WIN)
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, METRO_SNAP_TRUE);
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, METRO_SNAP_FALSE);
+#endif
+TEST_EVENT(STATE_TO_TAB_FULLSCREEN, WINDOW_CHANGE);
+
+// Specific one-off tests for known issues:
+
+// Used manually to determine what happens on a platform.
+IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest,
+ DISABLED_ManualTest) {
+ // A tab is needed for tab fullscreen.
+ AddTabAtIndex(0, GURL(kAboutBlankURL), PAGE_TRANSITION_TYPED);
+ ASSERT_TRUE(InvokeEvent(TOGGLE_FULLSCREEN)) << GetAndClearDebugLog();
+ ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE)) << GetAndClearDebugLog();
+ ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE)) << GetAndClearDebugLog();
+ ASSERT_TRUE(InvokeEvent(TOGGLE_FULLSCREEN)) << GetAndClearDebugLog();
+ ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE)) << GetAndClearDebugLog();
+
+ // Wait, allowing human operator to observe the result.
+ scoped_refptr<content::MessageLoopRunner> message_loop;
+ message_loop = new content::MessageLoopRunner();
+ message_loop->Run();
+}
+
+// Soak tests:
+
+// Tests all states with all permutations of multiple events to detect lingering
+// state issues that would bleed over to other states.
+// I.E. for each state test all combinations of events E1, E2, E3.
+//
+// This produces coverage for event sequences that may happen normally but
+// would not be exposed by traversing to each state via TransitionToState().
+// TransitionToState() always takes the same path even when multiple paths
+// exist.
+IN_PROC_BROWSER_TEST_F(FullscreenControllerStateInteractiveTest,
+ DISABLED_TransitionsForEachState) {
+ // A tab is needed for tab fullscreen.
+ AddTabAtIndex(0, GURL(kAboutBlankURL), PAGE_TRANSITION_TYPED);
+ TestTransitionsForEachState();
+ // Progress of test can be examined via LOG(INFO) << GetAndClearDebugLog();
+}
+