Index: chrome/test/in_process_browser_test.cc |
=================================================================== |
--- chrome/test/in_process_browser_test.cc (revision 94694) |
+++ chrome/test/in_process_browser_test.cc (working copy) |
@@ -1,354 +0,0 @@ |
-// Copyright (c) 2011 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. |
- |
-#include "chrome/test/in_process_browser_test.h" |
- |
-#include "base/command_line.h" |
-#include "base/file_path.h" |
-#include "base/file_util.h" |
-#include "base/mac/scoped_nsautorelease_pool.h" |
-#include "base/path_service.h" |
-#include "base/string_number_conversions.h" |
-#include "base/test/test_file_util.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browser_shutdown.h" |
-#include "chrome/browser/intranet_redirect_detector.h" |
-#include "chrome/browser/io_thread.h" |
-#include "chrome/browser/net/url_request_mock_util.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/tabs/tab_strip_model.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_navigator.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/common/chrome_constants.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/logging_chrome.h" |
-#include "chrome/common/url_constants.h" |
-#include "chrome/test/test_launcher_utils.h" |
-#include "chrome/test/testing_browser_process.h" |
-#include "chrome/test/ui_test_utils.h" |
-#include "content/browser/browser_thread.h" |
-#include "content/browser/renderer_host/render_process_host.h" |
-#include "content/browser/tab_contents/tab_contents.h" |
-#include "content/common/content_notification_types.h" |
-#include "content/common/main_function_params.h" |
-#include "content/renderer/mock_content_renderer_client.h" |
-#include "net/base/mock_host_resolver.h" |
-#include "net/test/test_server.h" |
-#include "sandbox/src/dep.h" |
- |
-#if defined(OS_MACOSX) |
-#include "base/mac/mac_util.h" |
-#include "base/system_monitor/system_monitor.h" |
-#endif |
- |
-#if defined(OS_WIN) |
-#include "chrome/browser/ui/views/frame/browser_frame_win.h" |
-#endif |
- |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/audio_handler.h" |
-#endif |
- |
-extern int BrowserMain(const MainFunctionParams&); |
- |
-const char kUnitTestShowWindows[] = "show-windows"; |
- |
-// Passed as value of kTestType. |
-static const char kBrowserTestType[] = "browser"; |
- |
-InProcessBrowserTest::InProcessBrowserTest() |
- : browser_(NULL), |
- show_window_(false), |
- dom_automation_enabled_(false), |
- tab_closeable_state_watcher_enabled_(false) { |
-#if defined(OS_MACOSX) |
- base::mac::SetOverrideAmIBundled(true); |
- base::SystemMonitor::AllocateSystemIOPorts(); |
-#endif |
- |
- // Before we run the browser, we have to hack the path to the exe to match |
- // what it would be if Chrome was running, because it is used to fork renderer |
- // processes, on Linux at least (failure to do so will cause a browser_test to |
- // be run instead of a renderer). |
- FilePath chrome_path; |
- CHECK(PathService::Get(base::FILE_EXE, &chrome_path)); |
- chrome_path = chrome_path.DirName(); |
- chrome_path = chrome_path.Append(chrome::kBrowserProcessExecutablePath); |
- CHECK(PathService::Override(base::FILE_EXE, chrome_path)); |
- |
- test_server_.reset(new net::TestServer( |
- net::TestServer::TYPE_HTTP, |
- FilePath(FILE_PATH_LITERAL("chrome/test/data")))); |
-} |
- |
-InProcessBrowserTest::~InProcessBrowserTest() { |
-} |
- |
-void InProcessBrowserTest::SetUp() { |
- // Create a temporary user data directory if required. |
- ASSERT_TRUE(CreateUserDataDirectory()) |
- << "Could not create user data directory."; |
- |
- // The unit test suite creates a testingbrowser, but we want the real thing. |
- // Delete the current one. We'll install the testing one in TearDown. |
- delete g_browser_process; |
- g_browser_process = NULL; |
- |
- // Allow subclasses the opportunity to make changes to the default user data |
- // dir before running any tests. |
- ASSERT_TRUE(SetUpUserDataDirectory()) |
- << "Could not set up user data directory."; |
- |
- // Don't delete the resources when BrowserMain returns. Many ui classes |
- // cache SkBitmaps in a static field so that if we delete the resource |
- // bundle we'll crash. |
- browser_shutdown::delete_resources_on_shutdown = false; |
- |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- // Allow subclasses to change the command line before running any tests. |
- SetUpCommandLine(command_line); |
- // Add command line arguments that are used by all InProcessBrowserTests. |
- PrepareTestCommandLine(command_line); |
- |
- // Single-process mode is not set in BrowserMain, so process it explicitly, |
- // and set up renderer. |
- if (command_line->HasSwitch(switches::kSingleProcess)) { |
- RenderProcessHost::set_run_renderer_in_process(true); |
- single_process_renderer_client_.reset( |
- new content::MockContentRendererClient); |
- content::GetContentClient()->set_renderer( |
- single_process_renderer_client_.get()); |
- } |
- |
-#if defined(OS_CHROMEOS) |
- // Make sure that the log directory exists. |
- FilePath log_dir = logging::GetSessionLogFile(*command_line).DirName(); |
- file_util::CreateDirectory(log_dir); |
-#endif // defined(OS_CHROMEOS) |
- |
- SandboxInitWrapper sandbox_wrapper; |
- MainFunctionParams params(*command_line, sandbox_wrapper, NULL); |
- params.ui_task = |
- NewRunnableMethod(this, &InProcessBrowserTest::RunTestOnMainThreadLoop); |
- |
- host_resolver_ = new net::RuleBasedHostResolverProc( |
- new IntranetRedirectHostResolverProc(NULL)); |
- |
- // Something inside the browser does this lookup implicitly. Make it fail |
- // to avoid external dependency. It won't break the tests. |
- host_resolver_->AddSimulatedFailure("*.google.com"); |
- |
- // See http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol |
- // We don't want the test code to use it. |
- host_resolver_->AddSimulatedFailure("wpad"); |
- |
- net::ScopedDefaultHostResolverProc scoped_host_resolver_proc( |
- host_resolver_.get()); |
- |
- SetUpInProcessBrowserTestFixture(); |
- |
- BrowserMain(params); |
- TearDownInProcessBrowserTestFixture(); |
-} |
- |
-void InProcessBrowserTest::PrepareTestCommandLine(CommandLine* command_line) { |
- // Propagate commandline settings from test_launcher_utils. |
- test_launcher_utils::PrepareBrowserCommandLineForTests(command_line); |
- |
-#if defined(OS_WIN) |
- // Hide windows on show. |
- if (!command_line->HasSwitch(kUnitTestShowWindows) && !show_window_) |
- BrowserFrameWin::SetShowState(SW_HIDE); |
-#endif |
- |
- if (dom_automation_enabled_) |
- command_line->AppendSwitch(switches::kDomAutomationController); |
- |
- // This is a Browser test. |
- command_line->AppendSwitchASCII(switches::kTestType, kBrowserTestType); |
- |
-#if defined(OS_WIN) |
- // The Windows sandbox requires that the browser and child processes are the |
- // same binary. So we launch browser_process.exe which loads chrome.dll |
- command_line->AppendSwitchPath(switches::kBrowserSubprocessPath, |
- command_line->GetProgram()); |
-#else |
- // Explicitly set the path of the binary used for child processes, otherwise |
- // they'll try to use browser_tests which doesn't contain ChromeMain. |
- FilePath subprocess_path; |
- PathService::Get(base::FILE_EXE, &subprocess_path); |
-#if defined(OS_MACOSX) |
- // Recreate the real environment, run the helper within the app bundle. |
- subprocess_path = subprocess_path.DirName().DirName(); |
- DCHECK_EQ(subprocess_path.BaseName().value(), "Contents"); |
- subprocess_path = |
- subprocess_path.Append("Versions").Append(chrome::kChromeVersion); |
- subprocess_path = |
- subprocess_path.Append(chrome::kHelperProcessExecutablePath); |
-#endif |
- command_line->AppendSwitchPath(switches::kBrowserSubprocessPath, |
- subprocess_path); |
-#endif |
- |
- // If neccessary, disable TabCloseableStateWatcher. |
- if (!tab_closeable_state_watcher_enabled_) |
- command_line->AppendSwitch(switches::kDisableTabCloseableStateWatcher); |
-} |
- |
-bool InProcessBrowserTest::CreateUserDataDirectory() { |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- FilePath user_data_dir = |
- command_line->GetSwitchValuePath(switches::kUserDataDir); |
- if (user_data_dir.empty()) { |
- if (temp_user_data_dir_.CreateUniqueTempDir() && |
- temp_user_data_dir_.IsValid()) { |
- user_data_dir = temp_user_data_dir_.path(); |
- } else { |
- LOG(ERROR) << "Could not create temporary user data directory \"" |
- << temp_user_data_dir_.path().value() << "\"."; |
- return false; |
- } |
- } |
- return test_launcher_utils::OverrideUserDataDir(user_data_dir); |
-} |
- |
-void InProcessBrowserTest::TearDown() { |
- // Reinstall testing browser process. |
- delete g_browser_process; |
- g_browser_process = new TestingBrowserProcess(); |
- |
- browser_shutdown::delete_resources_on_shutdown = true; |
- |
-#if defined(OS_WIN) |
- BrowserFrameWin::SetShowState(-1); |
-#endif |
-} |
- |
-void InProcessBrowserTest::AddTabAtIndexToBrowser( |
- Browser* browser, |
- int index, |
- const GURL& url, |
- PageTransition::Type transition) { |
- browser::NavigateParams params(browser, url, transition); |
- params.tabstrip_index = index; |
- params.disposition = NEW_FOREGROUND_TAB; |
- browser::Navigate(¶ms); |
-} |
- |
-void InProcessBrowserTest::AddTabAtIndex( |
- int index, |
- const GURL& url, |
- PageTransition::Type transition) { |
- AddTabAtIndexToBrowser(browser(), index, url, transition); |
-} |
- |
-bool InProcessBrowserTest::SetUpUserDataDirectory() { |
- return true; |
-} |
- |
-// Creates a browser with a single tab (about:blank), waits for the tab to |
-// finish loading and shows the browser. |
-Browser* InProcessBrowserTest::CreateBrowser(Profile* profile) { |
- Browser* browser = Browser::Create(profile); |
- AddBlankTabAndShow(browser); |
- return browser; |
-} |
- |
-Browser* InProcessBrowserTest::CreateIncognitoBrowser() { |
- // Create a new browser with using the incognito profile. |
- Browser* incognito = |
- Browser::Create(browser()->profile()->GetOffTheRecordProfile()); |
- AddBlankTabAndShow(incognito); |
- return incognito; |
-} |
- |
-Browser* InProcessBrowserTest::CreateBrowserForPopup(Profile* profile) { |
- Browser* browser = Browser::CreateForType(Browser::TYPE_POPUP, profile); |
- AddBlankTabAndShow(browser); |
- return browser; |
-} |
- |
-void InProcessBrowserTest::AddBlankTabAndShow(Browser* browser) { |
- browser->AddSelectedTabWithURL( |
- GURL(chrome::kAboutBlankURL), PageTransition::START_PAGE); |
- |
- // Wait for the page to finish loading. |
- ui_test_utils::WaitForNavigation( |
- &browser->GetSelectedTabContents()->controller()); |
- |
- browser->window()->Show(); |
-} |
- |
-void InProcessBrowserTest::RunTestOnMainThreadLoop() { |
-#if defined(OS_POSIX) |
- // Restore default signal handler for SIGTERM, so when the out-of-process |
- // test runner tries to terminate us, we don't catch it and possibly make it |
- // look like a success (http://crbug.com/57578). |
- signal(SIGTERM, SIG_DFL); |
-#endif // defined(OS_POSIX) |
- |
- // On Mac, without the following autorelease pool, code which is directly |
- // executed (as opposed to executed inside a message loop) would autorelease |
- // objects into a higher-level pool. This pool is not recycled in-sync with |
- // the message loops' pools and causes problems with code relying on |
- // deallocation via an autorelease pool (such as browser window closure and |
- // browser shutdown). To avoid this, the following pool is recycled after each |
- // time code is directly executed. |
- base::mac::ScopedNSAutoreleasePool pool; |
- |
- // Pump startup related events. |
- MessageLoopForUI::current()->RunAllPending(); |
- |
- // In the long term it would be great if we could use a TestingProfile |
- // here and only enable services you want tested, but that requires all |
- // consumers of Profile to handle NULL services. |
- Profile* profile = ProfileManager::GetDefaultProfile(); |
- if (!profile) { |
- // We should only be able to get here if the profile already exists and |
- // has been created. |
- NOTREACHED(); |
- return; |
- } |
- pool.Recycle(); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableFunction(chrome_browser_net::SetUrlRequestMocksEnabled, true)); |
- |
- browser_ = CreateBrowser(profile); |
- pool.Recycle(); |
- |
- // Pump any pending events that were created as a result of creating a |
- // browser. |
- MessageLoopForUI::current()->RunAllPending(); |
- |
- SetUpOnMainThread(); |
- pool.Recycle(); |
- |
- RunTestOnMainThread(); |
- pool.Recycle(); |
- |
- CleanUpOnMainThread(); |
- pool.Recycle(); |
- |
- QuitBrowsers(); |
- pool.Recycle(); |
-} |
- |
-void InProcessBrowserTest::QuitBrowsers() { |
- if (BrowserList::size() == 0) |
- return; |
- |
- // Invoke CloseAllBrowsersAndMayExit on a running message loop. |
- // CloseAllBrowsersAndMayExit exits the message loop after everything has been |
- // shut down properly. |
- MessageLoopForUI::current()->PostTask( |
- FROM_HERE, |
- NewRunnableFunction(&BrowserList::AttemptExit)); |
- ui_test_utils::RunMessageLoop(); |
-} |