Index: chrome/test/interactive_ui/view_event_test_base.h |
=================================================================== |
--- chrome/test/interactive_ui/view_event_test_base.h (revision 95314) |
+++ chrome/test/interactive_ui/view_event_test_base.h (working copy) |
@@ -1,152 +0,0 @@ |
-// Copyright (c) 2006-2008 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. |
- |
-#ifndef CHROME_TEST_INTERACTIVE_UI_VIEW_EVENT_TEST_BASE_H_ |
-#define CHROME_TEST_INTERACTIVE_UI_VIEW_EVENT_TEST_BASE_H_ |
-#pragma once |
- |
-// We only want to use ViewEventTestBase in test targets which properly |
-// isolate each test case by running each test in a separate process. |
-// This way if a test hangs the test launcher can reliably terminate it. |
-#if defined(HAS_OUT_OF_PROC_TEST_RUNNER) |
- |
-#include "base/message_loop.h" |
-#include "base/task.h" |
-#include "base/threading/thread.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "views/widget/widget_delegate.h" |
- |
-class Task; |
- |
-namespace gfx { |
-class Size; |
-} |
- |
-// Base class for Views based tests that dispatch events. |
-// |
-// As views based event test involves waiting for events to be processed, |
-// writing a views based test is slightly different than that of writing |
-// other unit tests. In particular when the test fails or is done you need |
-// to stop the message loop. This can be done by way of invoking the Done |
-// method. |
-// |
-// Any delayed callbacks should be done by way of CreateEventTask. |
-// CreateEventTask checks to see if ASSERT_XXX has been invoked after invoking |
-// the task. If there was a failure Done is invoked and the test stops. |
-// |
-// ViewEventTestBase creates a Window with the View returned from |
-// CreateContentsView. The preferred size for the view can be customized by |
-// overriding GetPreferredSize. If you do not override GetPreferredSize the |
-// preferred size of the view returned from CreateContentsView is used. |
-// |
-// Subclasses of ViewEventTestBase must implement two methods: |
-// . DoTestOnMessageLoop: invoked when the message loop is running. Run your |
-// test here, invoke Done when done. |
-// . CreateContentsView: returns the view to place in the window. |
-// |
-// Once you have created a ViewEventTestBase use the macro VIEW_TEST to define |
-// the fixture. |
-// |
-// I encountered weird timing problems in initiating dragging and drop that |
-// necessitated ugly hacks. In particular when the hook installed by |
-// ui_controls received the mouse event and posted a task that task was not |
-// processed. To work around this use the following pattern when initiating |
-// dnd: |
-// // Schedule the mouse move at a location slightly different from where |
-// // you really want to move to. |
-// ui_controls::SendMouseMoveNotifyWhenDone(loc.x + 10, loc.y, |
-// NewRunnableMethod(this, YYY)); |
-// // Then use this to schedule another mouse move. |
-// ScheduleMouseMoveInBackground(loc.x, loc.y); |
- |
-class ViewEventTestBase : public views::WidgetDelegate, |
- public testing::Test { |
- public: |
- ViewEventTestBase(); |
- |
- // Invoke when done either because of failure or success. Quits the message |
- // loop. |
- void Done(); |
- |
- // Creates a window. |
- virtual void SetUp(); |
- |
- // Destroys the window. |
- virtual void TearDown(); |
- |
- // Overridden from views::WidgetDelegate: |
- virtual bool CanResize() const OVERRIDE; |
- virtual views::View* GetContentsView() OVERRIDE; |
- virtual const views::Widget* GetWidget() const OVERRIDE; |
- virtual views::Widget* GetWidget() OVERRIDE; |
- |
- // Overriden to do nothing so that this class can be used in runnable tasks. |
- void AddRef() {} |
- void Release() {} |
- static bool ImplementsThreadSafeReferenceCounting() { return false; } |
- |
- protected: |
- virtual ~ViewEventTestBase(); |
- |
- // Returns the view that is added to the window. |
- virtual views::View* CreateContentsView() = 0; |
- |
- // Called once the message loop is running. |
- virtual void DoTestOnMessageLoop() = 0; |
- |
- // Invoke from test main. Shows the window, starts the message loop and |
- // schedules a task that invokes DoTestOnMessageLoop. |
- void StartMessageLoopAndRunTest(); |
- |
- // Returns an empty Size. Subclasses that want a preferred size other than |
- // that of the View returned by CreateContentsView should override this |
- // appropriately. |
- virtual gfx::Size GetPreferredSize(); |
- |
- // Creates a task that calls the specified method back. The specified |
- // method is called in such a way that if there are any test failures |
- // Done is invoked. |
- template <class T, class Method> |
- Task* CreateEventTask(T* target, Method method) { |
- return NewRunnableMethod(this, &ViewEventTestBase::RunTestMethod, |
- NewRunnableMethod(target, method)); |
- } |
- |
- // Spawns a new thread posts a MouseMove in the background. |
- void ScheduleMouseMoveInBackground(int x, int y); |
- |
- views::Widget* window_; |
- |
- private: |
- // Stops the thread started by ScheduleMouseMoveInBackground. |
- void StopBackgroundThread(); |
- |
- // Callback from CreateEventTask. Stops the background thread, runs the |
- // supplied task and if there are failures invokes Done. |
- void RunTestMethod(Task* task); |
- |
- // The content of the Window. |
- views::View* content_view_; |
- |
- // Thread for posting background MouseMoves. |
- scoped_ptr<base::Thread> dnd_thread_; |
- |
- MessageLoopForUI message_loop_; |
- |
- // Method factory used for time-outs. |
- ScopedRunnableMethodFactory<ViewEventTestBase> method_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ViewEventTestBase); |
-}; |
- |
-// Convenience macro for defining a ViewEventTestBase. See class description |
-// of ViewEventTestBase for details. |
-#define VIEW_TEST(test_class, name) \ |
- TEST_F(test_class, name) {\ |
- StartMessageLoopAndRunTest();\ |
- } |
- |
-#endif // defined(HAS_OUT_OF_PROC_TEST_RUNNER) |
- |
-#endif // CHROME_TEST_INTERACTIVE_UI_VIEW_EVENT_TEST_BASE_H_ |