// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_ #define CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_ #include <map> #include <memory> #include <string> #include "base/callback_list.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/feature_engagement/test/scoped_iph_feature_list.h" #include "content/public/test/browser_test_base.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/page_transition_types.h" #if BUILDFLAG(IS_MAC) #include <optional> #include "base/apple/scoped_nsautorelease_pool.h" #include "base/memory/stack_allocated.h" #include "ui/base/test/scoped_fake_full_keyboard_access.h" #endif namespace base { class CommandLine; #if BUILDFLAG(IS_WIN) namespace win { class ScopedCOMInitializer; } #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_CHROMEOS_LACROS) class Process; class Version; #endif // BUILDFLAG(IS_CHROMEOS_LACROS) } // namespace base namespace content { class BrowserContext; class WebContents; } // namespace content #if defined(TOOLKIT_VIEWS) namespace views { class ViewsDelegate; } #endif // defined(TOOLKIT_VIEWS) namespace display { class Screen; } #if BUILDFLAG(IS_CHROMEOS_ASH) namespace ash::full_restore { class ScopedLaunchBrowserForTesting; } // namespace ash::full_restore #endif // BUILDFLAG(IS_CHROMEOS_ASH) class Browser; #if BUILDFLAG(IS_CHROMEOS_LACROS) class FakeAccountManagerUI; #endif // BUILDFLAG(IS_CHROMEOS_LACROS) class PrefService; class Profile; #if BUILDFLAG(IS_MAC) class ScopedBundleSwizzlerMac; #endif // BUILDFLAG(IS_MAC) // Base class for tests that bring up Browser instances. // 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 create a base::RunLoop and call it's Run() method. When the // message bar is shown, invoke loop.QuitWhenIdle()/loop.QuitWhenIdleClosure() // to return control back to your test method. // . If you subclass and override SetUp(), be sure and invoke // InProcessBrowserTest::SetUp(). (But see also BrowserTestBase's // SetUpOnMainThread(), SetUpInProcessBrowserTestFixture(), and other related // methods for a cleaner alternative). // // To include the default implementation of RunTestOnMainThread() and TestBody() // for Gtests, it's also necessary to include the file // "content/public/test/browser_test.h" // // The following hook methods are called in sequence before BrowserMain(), so // no browser has been created yet. They are mainly for setting up the // environment for running the browser. // . SetUpCommandLine() // . SetUpDefaultCommandLine() // . SetUpUserDataDirectory() // // Default command line switches are added in the default implementation of // SetUpDefaultCommandLine(). Additional command line switches can be simply // appended in SetUpCommandLine() without the need to invoke // InProcessBrowserTest::SetUpCommandLine(). If a test needs to change the // default command line, it can override SetUpDefaultCommandLine(), where it // should invoke InProcessBrowserTest::SetUpDefaultCommandLine() to get the // default switches, and modify them as needed. // // SetUpOnMainThread() is called just after creating the default browser object // and before executing the real test code. It's mainly for setting up things // related to the browser object and associated window, like opening a new Tab // with a testing page loaded. // // TearDownOnMainThread() is called just after executing the real test code to // do necessary clean-up before the browser is torn down. // // TearDownInProcessBrowserTestFixture() is called after BrowserMain() exits to // clean up things set up for running the browser. // // By default a single Browser is created in BrowserMain(). You can obviously // create more as needed. // See ui_test_utils for a handful of methods designed for use with this class. // // It's possible to write browser tests that span a restart by splitting each // run of the browser process into a separate test. Example: // // IN_PROC_BROWSER_TEST_F(Foo, PRE_Bar) { // do something // } // // IN_PROC_BROWSER_TEST_F(Foo, Bar) { // verify something persisted from before // } // // This is recursive, so PRE_PRE_Bar would run before PRE_BAR. class InProcessBrowserTest : public content::BrowserTestBase { … }; #endif // CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_