15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/test/base/chrome_test_launcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 82385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/debug/leak_annotations.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_path.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_metrics.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_file_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_main_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_test_suite.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/app/content_main.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/test/test_launcher.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_utils.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_application_mac.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/aura/test/ui_controls_factory_aura.h" 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls_aura.h" 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/test/ui_controls_factory_desktop_aurax11.h" 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS) 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/test/ui_controls_factory_ash.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#if defined(OS_LINUX) || defined(OS_ANDROID) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/app/chrome_crash_reporter_client.h" 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif 462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace { 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeTestLauncherDelegate : public content::TestLauncherDelegate { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit ChromeTestLauncherDelegate(ChromeTestSuiteRunner* runner) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : runner_(runner) {} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ChromeTestLauncherDelegate() {} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int RunTestSuite(int argc, char** argv) OVERRIDE { 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return runner_->RunTestSuite(argc, argv); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AdjustChildProcessCommandLine( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine* command_line, const base::FilePath& temp_data_dir) OVERRIDE { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine new_command_line(command_line->GetProgram()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::SwitchMap switches = command_line->GetSwitches(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strip out user-data-dir if present. We will add it back in again later. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches.erase(switches::kUserDataDir); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (CommandLine::SwitchMap::const_iterator iter = switches.begin(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != switches.end(); ++iter) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_command_line.AppendSwitchNative((*iter).first, (*iter).second); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_command_line.AppendSwitchPath(switches::kUserDataDir, temp_data_dir); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:// access for ChromeOS. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_command_line.AppendSwitch(switches::kAllowFileAccess); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *command_line = new_command_line; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual content::ContentMainDelegate* CreateContentMainDelegate() OVERRIDE { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeMainDelegate(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AdjustDefaultParallelJobs(int* default_jobs) OVERRIDE { 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kAshBrowserTests)) { 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *default_jobs = 1; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fprintf(stdout, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Disabling test parallelization for --ash-browsertests.\n"); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fflush(stdout); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_WIN) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChromeTestSuiteRunner* runner_; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChromeTestLauncherDelegate); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int LaunchChromeTests(int default_jobs, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChromeTestSuiteRunner* runner, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int argc, 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char** argv) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_browser_application_mac::RegisterBrowserCrApp(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#if defined(OS_LINUX) || defined(OS_ANDROID) 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // We leak this pointer intentionally. The breakpad client needs to outlive 1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // all other code. 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome::ChromeCrashReporterClient* crash_client = 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new chrome::ChromeCrashReporterClient(); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ANNOTATE_LEAKING_OBJECT_PTR(crash_client); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crash_reporter::SetCrashReporterClient(crash_client); 1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif 1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChromeTestLauncherDelegate launcher_delegate(runner); 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return content::LaunchTests(&launcher_delegate, default_jobs, argc, argv); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 126