15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_base.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/stack_trace.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/i18n/icu_util.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_loop.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/test/test_timeouts.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/app/content_main.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/tracing/tracing_controller_impl.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/main_function_params.h"
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/test/test_launcher.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/base/net_errors.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/dns/mock_host_resolver.h"
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
26c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "ui/compositor/compositor_switches.h"
27c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "ui/gl/gl_implementation.h"
28c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "ui/gl/gl_switches.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#if defined(OS_POSIX)
3158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_handle.h"
3258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#endif
3358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_restrictions.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_main_runner.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(USE_AURA)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/image_transport_factory.h"
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/test/event_generator_delegate_aura.h"
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(USE_X11)
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/window_tree_host_x11.h"
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On SIGTERM (sent by the runner on timeouts), dump a stack trace (to make
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// debugging easier) and also exit with a known error code (so that the test
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// framework considers this a failure -- http://crbug.com/57578).
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: We only want to do this in the browser process, and not forked
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// processes. That might lead to hangs because of locks inside tcmalloc or the
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OS. See http://crbug.com/141302.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int g_browser_process_pid;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void DumpStackTraceSignalHandler(int signal) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (g_browser_process_pid == base::GetCurrentProcId()) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logging::RawLog(logging::LOG_ERROR,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "BrowserTestBase signal handler received SIGTERM. "
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "Backtrace:\n");
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::debug::StackTrace().Print();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _exit(128 + signal);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RunTaskOnRendererThread(const base::Closure& task,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const base::Closure& quit_task) {
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  task.Run();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_task);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// In many cases it may be not obvious that a test makes a real DNS lookup.
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// We generally don't want to rely on external DNS servers for our tests,
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// so this host resolver procedure catches external queries and returns a failed
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// lookup result.
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class LocalHostResolverProc : public net::HostResolverProc {
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  LocalHostResolverProc() : HostResolverProc(NULL) {}
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual int Resolve(const std::string& host,
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      net::AddressFamily address_family,
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      net::HostResolverFlags host_resolver_flags,
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      net::AddressList* addrlist,
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      int* os_error) OVERRIDE {
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const char* kLocalHostNames[] = {"localhost", "127.0.0.1", "::1"};
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bool local = false;
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host == net::GetHostName()) {
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      local = true;
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    } else {
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      for (size_t i = 0; i < arraysize(kLocalHostNames); i++)
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        if (host == kLocalHostNames[i]) {
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          local = true;
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          break;
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        }
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // To avoid depending on external resources and to reduce (if not preclude)
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // network interactions from tests, we simulate failure for non-local DNS
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // queries, rather than perform them.
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // If you really need to make an external DNS query, use
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // net::RuleBasedHostResolverProc and its AllowDirectLookup method.
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!local) {
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      DVLOG(1) << "To avoid external dependencies, simulating failure for "
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          "external DNS lookup of " << host;
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return net::ERR_NOT_IMPLEMENTED;
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return ResolveUsingPrevious(host, address_family, host_resolver_flags,
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                addrlist, os_error);
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~LocalHostResolverProc() {}
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TraceDisableRecordingComplete(const base::Closure& quit,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   const base::FilePath& file_path) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  LOG(ERROR) << "Tracing written to: " << file_path.value();
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  quit.Run();
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern int BrowserMain(const MainFunctionParams&);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserTestBase::BrowserTestBase()
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : expected_exit_code_(0),
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      enable_pixel_output_(false),
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      use_software_compositing_(false) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::SetOverrideAmIBundled(true);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(USE_AURA)
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(USE_X11)
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  aura::test::SetUseOverrideRedirectWindowByDefault(true);
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  aura::test::InitializeAuraEventGeneratorDelegate();
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle_sigterm_ = true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // This is called through base::TestSuite initially. It'll also be called
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // inside BrowserMain, so tell the code to ignore the check that it's being
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // called more than once
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::i18n::AllowMultipleInitializeCallsForTesting();
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  embedded_test_server_.reset(new net::test_server::EmbeddedTestServer);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserTestBase::~BrowserTestBase() {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RemoteTestServer can cause wait on the UI thread.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadRestrictions::ScopedAllowWait allow_wait;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_server_.reset(NULL);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserTestBase::SetUp() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Override the child process connection timeout since tests can exceed that
1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // when sharded.
1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  command_line->AppendSwitchASCII(
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      switches::kIPCConnectionTimeout,
1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::IntToString(TestTimeouts::action_max_timeout().InSeconds()));
1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tests assume that file:// URIs can freely access other file:// URIs.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendSwitch(switches::kAllowFileAccessFromFiles);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendSwitch(switches::kDomAutomationController);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // It is sometimes useful when looking at browser test failures to know which
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // GPU blacklisting decisions were made.
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  command_line->AppendSwitch(switches::kLogGpuControlListDecisions);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (use_software_compositing_) {
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableGpu);
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_AURA)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    command_line->AppendSwitch(switches::kUIDisableThreadedCompositing);
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
195c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(USE_AURA)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Most tests do not need pixel output, so we don't produce any. The command
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // line can override this behaviour to allow for visual debugging.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line->HasSwitch(switches::kEnablePixelOutputInTests))
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    enable_pixel_output_ = true;
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line->HasSwitch(switches::kDisableGLDrawingForTests)) {
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED() << "kDisableGLDrawingForTests should not be used as it"
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    "is chosen by tests. Use kEnablePixelOutputInTests "
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    "to enable pixel output.";
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Don't enable pixel output for browser tests unless they override and force
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // us to, or it's requested on the command line.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!enable_pixel_output_ && !use_software_compositing_)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableGLDrawingForTests);
211c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
212c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool use_osmesa = true;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We usually use OSMesa as this works on all bots. The command line can
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // override this behaviour to use hardware GL.
217c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (command_line->HasSwitch(switches::kUseGpuInTests))
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    use_osmesa = false;
219c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Some bots pass this flag when they want to use hardware GL.
221c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (command_line->HasSwitch("enable-gpu"))
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    use_osmesa = false;
223c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
224c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(OS_MACOSX)
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // On Mac we always use hardware GL.
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  use_osmesa = false;
227c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
228c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
229c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(OS_ANDROID)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // On Android we always use hardware GL.
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  use_osmesa = false;
232c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
233c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
234c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(OS_CHROMEOS)
235c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // If the test is running on the chromeos envrionment (such as
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // device or vm bots), we use hardware GL.
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::SysInfo::IsRunningOnChromeOS())
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    use_osmesa = false;
239c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
240c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (use_osmesa && !use_software_compositing_)
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    command_line->AppendSwitch(switches::kOverrideUseGLWithOSMesaForTests);
243c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<net::HostResolverProc> local_resolver =
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new LocalHostResolverProc();
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  rule_based_resolver_ =
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new net::RuleBasedHostResolverProc(local_resolver.get());
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  rule_based_resolver_->AddSimulatedFailure("wpad");
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  net::ScopedDefaultHostResolverProc scoped_local_host_resolver_proc(
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      rule_based_resolver_.get());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpInProcessBrowserTestFixture();
25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::Closure* ui_task =
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new base::Closure(
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          base::Bind(&BrowserTestBase::ProxyRunTestOnMainThreadLoop, this));
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  MainFunctionParams params(*command_line);
25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  params.ui_task = ui_task;
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(phajdan.jr): Check return code, http://crbug.com/374738 .
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  BrowserMain(params);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
26323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  GetContentMainParams()->ui_task = ui_task;
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(expected_exit_code_, ContentMain(*GetContentMainParams()));
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TearDownInProcessBrowserTestFixture();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserTestBase::TearDown() {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserTestBase::ProxyRunTestOnMainThreadLoop() {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle_sigterm_) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_browser_process_pid = base::GetCurrentProcId();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    signal(SIGTERM, DumpStackTraceSignalHandler);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableTracing)) {
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::debug::CategoryFilter category_filter(
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            switches::kEnableTracing));
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TracingController::GetInstance()->EnableRecording(
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        category_filter,
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::debug::TraceOptions(base::debug::RECORD_CONTINUOUSLY),
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TracingController::EnableRecordingDoneCallback());
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestOnMainThreadLoop();
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableTracing)) {
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::FilePath trace_file =
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        CommandLine::ForCurrentProcess()->GetSwitchValuePath(
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            switches::kEnableTracingOutput);
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // If there was no file specified, put a hardcoded one in the current
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // working directory.
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (trace_file.empty())
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      trace_file = base::FilePath().AppendASCII("trace.json");
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Wait for tracing to collect results from the renderers.
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::RunLoop run_loop;
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TracingController::GetInstance()->DisableRecording(
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TracingControllerImpl::CreateFileSink(
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            trace_file,
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::Bind(&TraceDisableRecordingComplete,
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       run_loop.QuitClosure(),
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       trace_file)));
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    run_loop.Run();
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserTestBase::CreateTestServer(const base::FilePath& test_server_base) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!test_server_.get());
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_server_.reset(new net::SpawnedTestServer(
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTP,
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::kLocalhost,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_base));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserTestBase::PostTaskToInProcessRendererAndWait(
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Closure& task) {
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess));
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner;
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop* renderer_loop =
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderProcessHostImpl::GetInProcessRendererThreadForTesting();
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(renderer_loop);
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  renderer_loop->PostTask(
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&RunTaskOnRendererThread, task, runner->QuitClosure()));
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  runner->Run();
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserTestBase::EnablePixelOutput() { enable_pixel_output_ = true; }
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserTestBase::UseSoftwareCompositing() {
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  use_software_compositing_ = true;
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserTestBase::UsingOSMesa() const {
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CommandLine* cmd = CommandLine::ForCurrentProcess();
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return cmd->GetSwitchValueASCII(switches::kUseGL) ==
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         gfx::kGLImplementationOSMesaName;
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
350