blob: 6ae7e3451e301205bba278bc9305ab92a0fa56f5 [file] [log] [blame]
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CHROME_TEST_UI_VIEW_EVENT_TEST_BASE_H_
#define CHROME_TEST_UI_VIEW_EVENT_TEST_BASE_H_
#include "base/thread.h"
#include "chrome/views/window_delegate.h"
#include "testing/gtest/include/gtest/gtest.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 ChromeViews::WindowDelegate,
public testing::Test {
public:
// Invoke when done either because of failure or success. Quits the message
// loop.
static void Done();
ViewEventTestBase();
// Creates a window.
virtual void SetUp();
// Destroys the window.
virtual void TearDown();
virtual bool CanResize() const {
return true;
}
// WindowDelegate method. Calls into CreateContentsView to get the actual
// view.
virtual ChromeViews::View* GetContentsView();
// Overriden to do nothing so that this class can be used in runnable tasks.
void AddRef() {}
void Release() {}
protected:
// Returns the view that is added to the window.
virtual ChromeViews::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);
ChromeViews::Window* 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.
ChromeViews::View* content_view_;
// Thread for posting background MouseMoves.
scoped_ptr<Thread> dnd_thread_;
DISALLOW_COPY_AND_ASSIGN(ViewEventTestBase);
};
// Convenience macro for defining a ViewEventTestBase. See class description
// of ViewEventTestBase for details.
//
// NOTE: These tests are disabled until we get a buildbot that is always logged
// in and can run them.
#define VIEW_TEST(test_class, name) \
TEST_F(test_class, DISABLED_name) {\
StartMessageLoopAndRunTest();\
}
#endif // CHROME_TEST_UI_VIEW_EVENT_TEST_BASE_H_