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