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)