blob: 64bf1ea3fd4056404cc1b7c6cbacbe6f303ac6b1 [file] [log] [blame]
// 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_IN_PROCESS_BROWSER_TEST_H_
#define CHROME_TEST_IN_PROCESS_BROWSER_TEST_H_
#include "net/url_request/url_request_unittest.h"
#include "testing/gtest/include/gtest/gtest.h"
class Browser;
class Profile;
namespace net {
class RuleBasedHostMapper;
}
// Base class for tests wanting to bring up a browser in the unit test process.
// Writing tests with InProcessBrowserTest is slightly different than that of
// other tests. This is necessitated by InProcessBrowserTest running a message
// loop. To use InProcessBrowserTest do the following:
// . Use the macro IN_PROC_BROWSER_TEST_F to define your test.
// . Your test method is invoked on the ui thread. If you need to block until
// state changes you'll need to run the message loop from your test method.
// For example, if you need to wait till a find bar has completely been shown
// you'll need to invoke ui_test_utils::RunMessageLoop. When the message bar
// is shown, invoke MessageLoop::current()->Quit() to return control back to
// your test method.
// . If you subclass and override SetUp, be sure and invoke
// InProcessBrowserTest::SetUp.
//
// By default InProcessBrowserTest creates a single Browser (as returned from
// the CreateBrowser method). You can obviously create more as needed.
// Browsers created while InProcessBrowserTest is running are shown hidden. Use
// the command line switch --show-windows to make them visible when debugging.
//
// InProcessBrowserTest disables the sandbox when running.
//
// See ui_test_utils for a handful of methods designed for use with this class.
class InProcessBrowserTest : public testing::Test {
public:
InProcessBrowserTest();
// We do this so we can be used in a Task.
void AddRef() {}
void Release() {}
// Configures everything for an in process browser test, then invokes
// BrowserMain. BrowserMain ends up invoking RunTestOnMainThreadLoop.
virtual void SetUp();
// Restores state configured in SetUp.
virtual void TearDown();
protected:
// Returns the browser created by CreateBrowser.
Browser* browser() const { return browser_; }
// Override this rather than TestBody.
virtual void RunTestOnMainThread() = 0;
// Override this to add command line flags specific to your test.
virtual void SetUpCommandLine(CommandLine* command_line) {}
// Override this to add any custom cleanup code that needs to be done on the
// main thread before the browser is torn down.
virtual void CleanUpOnMainThread() {}
// Allows subclasses to configure the host mapper. By default this blocks
// requests to google.com as Chrome pings that on startup and we don't want to
// do that during testing.
virtual void ConfigureHostMapper(net::RuleBasedHostMapper* host_mapper);
// Invoked when a test is not finishing in a timely manner.
void TimedOut();
// Starts an HTTP server.
HTTPTestServer* StartHTTPServer();
// Creates a browser with a single tab (about:blank), waits for the tab to
// finish loading and shows the browser.
//
// This is invoked from Setup.
virtual Browser* CreateBrowser(Profile* profile);
// Sets some test states (see below for comments). Call this in your test
// constructor.
void set_show_window(bool show) { show_window_ = show; }
void EnableDOMAutomation() { dom_automation_enabled_ = true; }
void EnableSingleProcess() { single_process_ = true; }
private:
// Invokes CreateBrowser to create a browser, then RunTestOnMainThread, and
// destroys the browser.
void RunTestOnMainThreadLoop();
// Browser created from CreateBrowser.
Browser* browser_;
// HTTPServer, created when StartHTTPServer is invoked.
scoped_refptr<HTTPTestServer> http_server_;
// Whether this test requires the browser windows to be shown (interactive
// tests for example need the windows shown).
bool show_window_;
// Whether the JavaScript can access the DOMAutomationController (a JS object
// that can send messages back to the browser).
bool dom_automation_enabled_;
// Whether to run the test in single-process mode.
bool single_process_;
// We muck with the global command line for this process. Keep the original
// so we can reset it when we're done.
scoped_ptr<CommandLine> original_command_line_;
// Saved to restore the value of RenderProcessHost::run_renderer_in_process.
bool original_single_process_;
DISALLOW_COPY_AND_ASSIGN(InProcessBrowserTest);
};
#define IN_PROC_BROWSER_TEST_(test_case_name, test_name, parent_class,\
parent_id)\
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
public:\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
protected:\
virtual void RunTestOnMainThread();\
private:\
virtual void TestBody() {}\
static ::testing::TestInfo* const test_info_;\
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
};\
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
::test_info_ =\
::testing::internal::MakeAndRegisterTestInfo(\
#test_case_name, #test_name, "", "", \
(parent_id), \
parent_class::SetUpTestCase, \
parent_class::TearDownTestCase, \
new ::testing::internal::TestFactoryImpl<\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::RunTestOnMainThread()
#define IN_PROC_BROWSER_TEST_F(test_fixture, test_name)\
IN_PROC_BROWSER_TEST_(test_fixture, test_name, test_fixture,\
::testing::internal::GetTypeId<test_fixture>())
#endif // CHROME_TEST_IN_PROCESS_BROWSER_TEST_H_