Make hitting "Enter" submit the add/change profile dialog.
[chromium-blink-merge.git] / chrome / test / base / in_process_browser_test.h
blob33667bae2770e436d8ce31ce32eecdc0abdf4bca
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 #ifndef CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_
6 #define CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_
8 #include "base/compiler_specific.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "content/public/common/page_transition_types.h"
13 #include "content/public/test/browser_test.h"
14 #include "content/public/test/browser_test_base.h"
15 #include "testing/gtest/include/gtest/gtest.h"
17 #if defined(OS_CHROMEOS)
18 #include "chrome/browser/chromeos/cros/cros_library.h"
19 #endif // defined(OS_CHROMEOS)
21 #if defined(OS_MACOSX)
22 namespace base {
23 namespace mac {
24 class ScopedNSAutoreleasePool;
25 } // namespace mac
26 } // namespace base
27 #endif // OS_MACOSX
29 class Browser;
30 class CommandLine;
31 class Profile;
33 namespace content {
34 class ContentRendererClient;
37 namespace net {
38 class RuleBasedHostResolverProc;
41 // Base class for tests wanting to bring up a browser in the unit test process.
42 // Writing tests with InProcessBrowserTest is slightly different than that of
43 // other tests. This is necessitated by InProcessBrowserTest running a message
44 // loop. To use InProcessBrowserTest do the following:
45 // . Use the macro IN_PROC_BROWSER_TEST_F to define your test.
46 // . Your test method is invoked on the ui thread. If you need to block until
47 // state changes you'll need to run the message loop from your test method.
48 // For example, if you need to wait till a find bar has completely been shown
49 // you'll need to invoke content::RunMessageLoop. When the message bar is
50 // shown, invoke MessageLoop::current()->Quit() to return control back to your
51 // test method.
52 // . If you subclass and override SetUp, be sure and invoke
53 // InProcessBrowserTest::SetUp. (But see also SetUpOnMainThread,
54 // SetUpInProcessBrowserTestFixture and other related hook methods for a
55 // cleaner alternative).
57 // Following three hook methods are called in sequence before calling
58 // BrowserMain(), thus no browser has been created yet. They are mainly for
59 // setting up the environment for running the browser.
60 // . SetUpUserDataDirectory()
61 // . SetUpCommandLine()
62 // . SetUpInProcessBrowserTestFixture()
64 // SetUpOnMainThread() is called just after creating the default browser object
65 // and before executing the real test code. It's mainly for setting up things
66 // related to the browser object and associated window, like opening a new Tab
67 // with a testing page loaded.
69 // CleanUpOnMainThread() is called just after executing the real test code to
70 // do necessary cleanup before the browser is torn down.
72 // TearDownInProcessBrowserTestFixture() is called after BrowserMain() exits to
73 // cleanup things setup for running the browser.
75 // By default InProcessBrowserTest creates a single Browser (as returned from
76 // the CreateBrowser method). You can obviously create more as needed.
78 // InProcessBrowserTest disables the sandbox when running.
80 // See ui_test_utils for a handful of methods designed for use with this class.
82 // It's possible to write browser tests that span a restart by splitting each
83 // run of the browser process into a separate test. Example:
85 // IN_PROC_BROWSER_TEST_F(Foo, PRE_Bar) {
86 // do something
87 // }
89 // IN_PROC_BROWSER_TEST_F(Foo, Bar) {
90 // verify something persisted from before
91 // }
93 // This is recursive, so PRE_PRE_Bar would run before PRE_BAR.
94 class InProcessBrowserTest : public content::BrowserTestBase {
95 public:
96 InProcessBrowserTest();
97 virtual ~InProcessBrowserTest();
99 // Configures everything for an in process browser test, then invokes
100 // BrowserMain. BrowserMain ends up invoking RunTestOnMainThreadLoop.
101 virtual void SetUp() OVERRIDE;
103 // Restores state configured in SetUp.
104 virtual void TearDown() OVERRIDE;
106 protected:
107 // Returns the browser created by CreateBrowser.
108 Browser* browser() const { return browser_; }
110 // Convenience methods for adding tabs to a Browser.
111 void AddTabAtIndexToBrowser(Browser* browser,
112 int index,
113 const GURL& url,
114 content::PageTransition transition);
115 void AddTabAtIndex(int index, const GURL& url,
116 content::PageTransition transition);
118 // Initializes the contents of the user data directory. Called by SetUp()
119 // after creating the user data directory, but before any browser is launched.
120 // If a test wishes to set up some initial non-empty state in the user data
121 // directory before the browser starts up, it can do so here. Returns true if
122 // successful.
123 virtual bool SetUpUserDataDirectory() WARN_UNUSED_RESULT;
125 // Override this to add any custom cleanup code that needs to be done on the
126 // main thread before the browser is torn down.
127 virtual void CleanUpOnMainThread() {}
129 // BrowserTestBase:
130 virtual void RunTestOnMainThreadLoop() OVERRIDE;
132 // Creates a browser with a single tab (about:blank), waits for the tab to
133 // finish loading and shows the browser.
135 // This is invoked from Setup.
136 Browser* CreateBrowser(Profile* profile);
138 // Similar to |CreateBrowser|, but creates an incognito browser.
139 Browser* CreateIncognitoBrowser();
141 // Creates a browser for a popup window with a single tab (about:blank), waits
142 // for the tab to finish loading, and shows the browser.
143 Browser* CreateBrowserForPopup(Profile* profile);
145 // Creates a browser for an application and waits for it to load and shows
146 // the browser.
147 Browser* CreateBrowserForApp(const std::string& app_name, Profile* profile);
149 // Called from the various CreateBrowser methods to add a blank tab, wait for
150 // the navigation to complete, and show the browser's window.
151 void AddBlankTabAndShow(Browser* browser);
153 #if !defined OS_MACOSX
154 // Return a CommandLine object that is used to relaunch the browser_test
155 // binary as a browser process. This function is deliberately not defined on
156 // the Mac because re-using an existing browser process when launching from
157 // the command line isn't a concept that we support on the Mac; AppleEvents
158 // are the Mac solution for the same need. Any test based on these functions
159 // doesn't apply to the Mac.
160 CommandLine GetCommandLineForRelaunch();
161 #endif
163 // Returns the host resolver being used for the tests. Subclasses might want
164 // to configure it inside tests.
165 net::RuleBasedHostResolverProc* host_resolver() {
166 return host_resolver_.get();
169 #if defined(OS_MACOSX)
170 // Returns the autorelease pool in use inside RunTestOnMainThreadLoop().
171 base::mac::ScopedNSAutoreleasePool* AutoreleasePool() const {
172 return autorelease_pool_;
174 #endif // OS_MACOSX
176 private:
177 // Creates a user data directory for the test if one is needed. Returns true
178 // if successful.
179 virtual bool CreateUserDataDirectory() WARN_UNUSED_RESULT;
181 // Quits all open browsers and waits until there are no more browsers.
182 void QuitBrowsers();
184 // Prepare command line that will be used to launch the child browser process
185 // with an in-process test.
186 void PrepareTestCommandLine(CommandLine* command_line);
188 // Browser created from CreateBrowser.
189 Browser* browser_;
191 // Host resolver to use during the test.
192 scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_;
194 // Temporary user data directory. Used only when a user data directory is not
195 // specified in the command line.
196 base::ScopedTempDir temp_user_data_dir_;
198 #if defined(OS_CHROMEOS)
199 chromeos::ScopedStubCrosEnabler stub_cros_enabler_;
200 #endif // defined(OS_CHROMEOS)
202 #if defined(OS_MACOSX)
203 base::mac::ScopedNSAutoreleasePool* autorelease_pool_;
204 #endif // OS_MACOSX
207 #endif // CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_