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