browser_test_base.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/browser_test_base.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/command_line.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/debug/stack_trace.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/i18n/icu_util.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/message_loop/message_loop.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/sys_info.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/app/content_main.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_switches.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/common/main_function_params.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_launcher.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_utils.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/net_errors.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/dns/mock_host_resolver.h"
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/compositor/compositor_switches.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gl/gl_implementation.h"
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gl/gl_switches.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_POSIX)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/process/process_handle.h"
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/mac/mac_util.h"
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_ANDROID)
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/browser_main_runner.h"
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(USE_AURA)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/compositor/image_transport_factory.h"
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content {
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_POSIX)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// On SIGTERM (sent by the runner on timeouts), dump a stack trace (to make
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// debugging easier) and also exit with a known error code (so that the test
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// framework considers this a failure -- http://crbug.com/57578).
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Note: We only want to do this in the browser process, and not forked
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// processes. That might lead to hangs because of locks inside tcmalloc or the
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// OS. See http://crbug.com/141302.
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static int g_browser_process_pid;
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void DumpStackTraceSignalHandler(int signal) {
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (g_browser_process_pid == base::GetCurrentProcId()) {
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    logging::RawLog(logging::LOG_ERROR,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    "BrowserTestBase signal handler received SIGTERM. "
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    "Backtrace:\n");
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::debug::StackTrace().Print();
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  _exit(128 + signal);
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(OS_POSIX)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RunTaskOnRendererThread(const base::Closure& task,
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                             const base::Closure& quit_task) {
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  task.Run();
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_task);
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// In many cases it may be not obvious that a test makes a real DNS lookup.
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// We generally don't want to rely on external DNS servers for our tests,
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// so this host resolver procedure catches external queries and returns a failed
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// lookup result.
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LocalHostResolverProc : public net::HostResolverProc {
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LocalHostResolverProc() : HostResolverProc(NULL) {}
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual int Resolve(const std::string& host,
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      net::AddressFamily address_family,
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      net::HostResolverFlags host_resolver_flags,
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      net::AddressList* addrlist,
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      int* os_error) OVERRIDE {
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char* kLocalHostNames[] = {"localhost", "127.0.0.1", "::1"};
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool local = false;
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (host == net::GetHostName()) {
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      local = true;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      for (size_t i = 0; i < arraysize(kLocalHostNames); i++)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (host == kLocalHostNames[i]) {
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          local = true;
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          break;
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // To avoid depending on external resources and to reduce (if not preclude)
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // network interactions from tests, we simulate failure for non-local DNS
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // queries, rather than perform them.
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // If you really need to make an external DNS query, use
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // net::RuleBasedHostResolverProc and its AllowDirectLookup method.
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!local) {
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      DVLOG(1) << "To avoid external dependencies, simulating failure for "
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          "external DNS lookup of " << host;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return net::ERR_NOT_IMPLEMENTED;
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ResolveUsingPrevious(host, address_family, host_resolver_flags,
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                addrlist, os_error);
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~LocalHostResolverProc() {}
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciextern int BrowserMain(const MainFunctionParams&);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowserTestBase::BrowserTestBase()
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : enable_pixel_output_(false), use_software_compositing_(false) {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX)
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::mac::SetOverrideAmIBundled(true);
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_POSIX)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle_sigterm_ = true;
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is called through base::TestSuite initially. It'll also be called
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // inside BrowserMain, so tell the code to ignore the check that it's being
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // called more than once
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::i18n::AllowMultipleInitializeCallsForTesting();
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  embedded_test_server_.reset(new net::test_server::EmbeddedTestServer);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowserTestBase::~BrowserTestBase() {
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // RemoteTestServer can cause wait on the UI thread.
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ThreadRestrictions::ScopedAllowWait allow_wait;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_server_.reset(NULL);
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void BrowserTestBase::SetUp() {
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The tests assume that file:// URIs can freely access other file:// URIs.
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  command_line->AppendSwitch(switches::kAllowFileAccessFromFiles);
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  command_line->AppendSwitch(switches::kDomAutomationController);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It is sometimes useful when looking at browser test failures to know which
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GPU blacklisting decisions were made.
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  command_line->AppendSwitch(switches::kLogGpuControlListDecisions);
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (use_software_compositing_) {
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    command_line->AppendSwitch(switches::kDisableGpu);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    command_line->AppendSwitch(switches::kEnableSoftwareCompositing);
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_AURA)
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    command_line->AppendSwitch(switches::kUIDisableThreadedCompositing);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_AURA)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Most tests do not need pixel output, so we don't produce any. The command
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // line can override this behaviour to allow for visual debugging.
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (command_line->HasSwitch(switches::kEnablePixelOutputInTests))
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    enable_pixel_output_ = true;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line->HasSwitch(switches::kDisableGLDrawingForTests)) {
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED() << "kDisableGLDrawingForTests should not be used as it"
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    "is chosen by tests. Use kEnablePixelOutputInTests "
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    "to enable pixel output.";
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Don't enable pixel output for browser tests unless they override and force
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // us to, or it's requested on the command line.
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!enable_pixel_output_ && !use_software_compositing_)
1833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    command_line->AppendSwitch(switches::kDisableGLDrawingForTests);
1843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif
1853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool use_osmesa = true;
1873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // We usually use OSMesa as this works on all bots. The command line can
1893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // override this behaviour to use hardware GL.
1903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (command_line->HasSwitch(switches::kUseGpuInTests))
1913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    use_osmesa = false;
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Some bots pass this flag when they want to use hardware GL.
1943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (command_line->HasSwitch("enable-gpu"))
1953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    use_osmesa = false;
1963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_MACOSX)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // On Mac we always use hardware GL.
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_osmesa = false;
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_ANDROID)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // On Android we always use hardware GL.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_osmesa = false;
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the test is running on the chromeos envrionment (such as
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // device or vm bots), we use hardware GL.
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (base::SysInfo::IsRunningOnChromeOS())
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    use_osmesa = false;
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line->HasSwitch(switches::kUseGL)) {
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NOTREACHED() <<
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        "kUseGL should not be used with tests. Try kUseGpuInTests instead.";
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (use_osmesa && !use_software_compositing_) {
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    command_line->AppendSwitchASCII(
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        switches::kUseGL, gfx::kGLImplementationOSMesaName);
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<net::HostResolverProc> local_resolver =
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new LocalHostResolverProc();
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  rule_based_resolver_ =
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new net::RuleBasedHostResolverProc(local_resolver.get());
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  rule_based_resolver_->AddSimulatedFailure("wpad");
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  net::ScopedDefaultHostResolverProc scoped_local_host_resolver_proc(
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      rule_based_resolver_.get());
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetUpInProcessBrowserTestFixture();
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Closure* ui_task =
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new base::Closure(
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&BrowserTestBase::ProxyRunTestOnMainThreadLoop, this));
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID)
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MainFunctionParams params(*command_line);
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.ui_task = ui_task;
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserMainRunner::Create()->Initialize(params);
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // We are done running the test by now. During teardown we
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // need to be able to perform IO.
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::ThreadRestrictions::SetIOAllowed(true);
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(base::IgnoreResult(&base::ThreadRestrictions::SetIOAllowed),
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 true));
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetContentMainParams()->ui_task = ui_task;
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ContentMain(*GetContentMainParams());
251e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
252e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TearDownInProcessBrowserTestFixture();
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void BrowserTestBase::TearDown() {
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void BrowserTestBase::ProxyRunTestOnMainThreadLoop() {
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_POSIX)
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (handle_sigterm_) {
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    g_browser_process_pid = base::GetCurrentProcId();
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    signal(SIGTERM, DumpStackTraceSignalHandler);
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(OS_POSIX)
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunTestOnMainThreadLoop();
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserTestBase::CreateTestServer(const base::FilePath& test_server_base) {
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK(!test_server_.get());
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_server_.reset(new net::SpawnedTestServer(
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTP,
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      net::SpawnedTestServer::kLocalhost,
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      test_server_base));
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserTestBase::PostTaskToInProcessRendererAndWait(
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::Closure& task) {
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHECK(CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess));
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner;
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::MessageLoop* renderer_loop =
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      RenderProcessHostImpl::GetInProcessRendererThreadForTesting();
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHECK(renderer_loop);
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
286e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  renderer_loop->PostTask(
287e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FROM_HERE,
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&RunTaskOnRendererThread, task, runner->QuitClosure()));
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  runner->Run();
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BrowserTestBase::EnablePixelOutput() { enable_pixel_output_ = true; }
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BrowserTestBase::UseSoftwareCompositing() {
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(USE_AURA) && !defined(OS_MACOSX)
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TODO(danakj): Remove when GTK linux is no more.
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NOTREACHED();
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  use_software_compositing_ = true;
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserTestBase::UsingOSMesa() const {
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CommandLine* cmd = CommandLine::ForCurrentProcess();
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return cmd->GetSwitchValueASCII(switches::kUseGL) ==
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         gfx::kGLImplementationOSMesaName;
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)