test_launcher.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
11ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Use of this source code is governed by a BSD-style license that can be
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// found in the LICENSE file.
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/test/test_launcher.h"
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <map>
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <string>
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <vector>
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/command_line.h"
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/containers/hash_tables.h"
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/environment.h"
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/file_util.h"
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/files/scoped_temp_dir.h"
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/logging.h"
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/memory/linked_ptr.h"
181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/memory/scoped_ptr.h"
191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/message_loop/message_loop.h"
201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/stl_util.h"
211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/strings/string_number_conversions.h"
221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/strings/string_util.h"
231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/strings/utf_string_conversions.h"
241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/test/launcher/parallel_test_launcher.h"
251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/test/launcher/test_launcher.h"
261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/test/test_suite.h"
271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/test/test_switches.h"
281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/test/test_timeouts.h"
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/time/time.h"
301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/app/content_main.h"
311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/app/content_main_delegate.h"
321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/app/startup_helper_win.h"
331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/common/content_switches.h"
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/common/sandbox_init.h"
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/public/test/browser_test.h"
361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "net/base/escape.h"
371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "testing/gtest/include/gtest/gtest.h"
381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#if defined(OS_WIN)
401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/base_switches.h"
411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "content/common/sandbox_win.h"
421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "sandbox/win/src/sandbox_factory.h"
431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "sandbox/win/src/sandbox_types.h"
441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#elif defined(OS_MACOSX)
451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "base/mac/scoped_nsautorelease_pool.h"
461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif
471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace content {
491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace {
511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Tests with this prefix run before the same test without it, and use the same
531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// profile. i.e. Foo.PRE_Test runs and then Foo.Test. This allows writing tests
541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// that span browser restarts.
551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kPreTestPrefix[] = "PRE_";
561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Manual tests only run when --run-manual is specified. This allows writing
581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// tests that don't run automatically but are still in the same test binary.
591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// This is useful so that a team that wants to run a few tests doesn't have to
601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// add a new binary that must be compiled on all builds.
611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kManualTestPrefix[] = "MANUAL_";
621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comTestLauncherDelegate* g_launcher_delegate;
641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstd::string RemoveAnyPrePrefixes(const std::string& test_name) {
661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  std::string result(test_name);
671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ReplaceSubstringsAfterOffset(&result, 0, kPreTestPrefix, std::string());
681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return result;
691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid PrintUsage() {
721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  fprintf(stdout,
731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "Runs tests using the gtest framework, each test being run in its own\n"
741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "process.  Any gtest flags can be specified.\n"
751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "  --single_process\n"
761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "    Runs the tests and the launcher in the same process. Useful for \n"
771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "    debugging a specific test in a debugger.\n"
781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "  --single-process\n"
791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "    Same as above, and also runs Chrome in single-process mode.\n"
801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "  --help\n"
811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "    Shows this message.\n"
821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "  --gtest_help\n"
831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "    Shows the gtest help message.\n");
841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Implementation of base::TestLauncherDelegate. This is also a test launcher,
871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// wrapping a lower-level test launcher with content-specific code.
881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass WrapperTestLauncherDelegate : public base::TestLauncherDelegate {
891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  WrapperTestLauncherDelegate(content::TestLauncherDelegate* launcher_delegate,
911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                              size_t jobs)
921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      : launcher_delegate_(launcher_delegate),
931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com        timeout_count_(0),
941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com        printed_timeout_message_(false),
951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com        parallel_launcher_(jobs) {
961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    CHECK(temp_dir_.CreateUniqueTempDir());
971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // base::TestLauncherDelegate:
1001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void OnTestIterationStarting() OVERRIDE;
1011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual std::string GetTestNameForFiltering(
1021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const testing::TestCase* test_case,
1031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const testing::TestInfo* test_info) OVERRIDE;
1041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual bool ShouldRunTest(const testing::TestCase* test_case,
1051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                             const testing::TestInfo* test_info) OVERRIDE;
1061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void RunTest(
1071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const testing::TestCase* test_case,
1081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const testing::TestInfo* test_info,
1091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const base::TestLauncherDelegate::TestResultCallback& callback) OVERRIDE;
1101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void RunRemainingTests() OVERRIDE;
1111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com private:
1131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  struct TestInfo {
1141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::string GetFullName() const { return test_case_name + "." + test_name; }
1151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::string test_case_name;
1171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::string test_name;
1181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::vector<base::TestLauncherDelegate::TestResultCallback> callbacks;
1191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
1201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Launches test from |test_info| using |command_line| and parallel launcher.
1221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void DoRunTest(const TestInfo& test_info, const CommandLine& command_line);
1231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Launches test named |test_name| using |command_line| and parallel launcher,
1251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // given result of PRE_ test |pre_test_result|.
1261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void RunDependentTest(const std::string test_name,
1271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        const CommandLine& command_line,
1281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        const base::TestResult& pre_test_result);
1291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Callback to receive result of a test.
1311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void GTestCallback(
1321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const TestInfo& test_info,
1331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      int exit_code,
1341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const base::TimeDelta& elapsed_time,
1351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      bool was_timeout,
1361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const std::string& output);
1371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  content::TestLauncherDelegate* launcher_delegate_;
1391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Number of times a test timeout occurred.
1411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  size_t timeout_count_;
1421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // True after a message about too many timeouts has been printed,
1441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // to avoid doing it more than once.
1451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool printed_timeout_message_;
1461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  base::ParallelTestLauncher parallel_launcher_;
1481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Store all tests to run before running any of them to properly
1501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // handle PRE_ tests. The map is indexed by test full name (e.g. "A.B").
1511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  typedef std::map<std::string, TestInfo> TestInfoMap;
1521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  TestInfoMap tests_to_run_;
1531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Temporary directory for user data directories.
1551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  base::ScopedTempDir temp_dir_;
1561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  DISALLOW_COPY_AND_ASSIGN(WrapperTestLauncherDelegate);
1581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
1591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::OnTestIterationStarting() {
1611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  tests_to_run_.clear();
1621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
1631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstd::string WrapperTestLauncherDelegate::GetTestNameForFiltering(
1651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestCase* test_case,
1661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestInfo* test_info) {
1671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return RemoveAnyPrePrefixes(
1681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      std::string(test_case->name()) + "." + test_info->name());
1691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
1701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.combool WrapperTestLauncherDelegate::ShouldRunTest(
1721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestCase* test_case,
1731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestInfo* test_info) {
1741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (StartsWithASCII(test_info->name(), kManualTestPrefix, true) &&
1751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      !CommandLine::ForCurrentProcess()->HasSwitch(kRunManualTestsFlag)) {
1761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return false;
1771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
1781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Stop test execution after too many timeouts.
1801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (timeout_count_ > 5) {
1811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (!printed_timeout_message_) {
1821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      printed_timeout_message_ = true;
1831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      printf("Too many timeouts, aborting test\n");
1841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
1851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return false;
1861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
1871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return true;
1891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
1901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::RunTest(
1921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestCase* test_case,
1931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const testing::TestInfo* test_info,
1941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const base::TestLauncherDelegate::TestResultCallback& callback) {
1951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  TestInfo run_test_info;
1961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  run_test_info.test_case_name = test_case->name();
1971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  run_test_info.test_name = test_info->name();
1981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  run_test_info.callbacks.push_back(callback);
1991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  DCHECK(!ContainsKey(tests_to_run_, run_test_info.GetFullName()));
2011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  tests_to_run_[run_test_info.GetFullName()] = run_test_info;
2021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
2031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::RunRemainingTests() {
2051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PRE_ tests and tests that depend on them must share the same
2061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // data directory. Using test name as directory name leads to too long
2071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // names (exceeding UNIX_PATH_MAX, which creates a problem with
2081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // process_singleton_linux). Create a randomly-named temporary directory
2091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // and keep track of the names so that PRE_ tests can still re-use them.
2101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  std::map<std::string, base::FilePath> temp_directories;
2111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // List of tests we can kick off right now, depending on no other tests.
2131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  std::vector<std::pair<std::string, CommandLine> > tests_to_run_now;
2141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  for (TestInfoMap::iterator i = tests_to_run_.begin();
2161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com       i != tests_to_run_.end();
2171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com       ++i) {
2181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const TestInfo& test_info = i->second;
2191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Make sure PRE_ tests and tests that depend on them share the same
2211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // data directory - based it on the test name without prefixes.
2221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::string test_name_no_pre(RemoveAnyPrePrefixes(test_info.GetFullName()));
2231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (!ContainsKey(temp_directories, test_name_no_pre)) {
2241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      base::FilePath temp_dir;
2251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      CHECK(file_util::CreateTemporaryDirInDir(
2261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                temp_dir_.path(), FILE_PATH_LITERAL("d"), &temp_dir));
2271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      temp_directories[test_name_no_pre] = temp_dir;
2281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
2291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    CommandLine new_cmd_line(*CommandLine::ForCurrentProcess());
2311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    CHECK(launcher_delegate_->AdjustChildProcessCommandLine(
2321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              &new_cmd_line, temp_directories[test_name_no_pre]));
2331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    std::string pre_test_name(
2351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com        test_info.test_case_name + "." + kPreTestPrefix + test_info.test_name);
2361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (ContainsKey(tests_to_run_, pre_test_name)) {
2371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      tests_to_run_[pre_test_name].callbacks.push_back(
2381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com          base::Bind(&WrapperTestLauncherDelegate::RunDependentTest,
2391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     base::Unretained(this),
2401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     test_info.GetFullName(),
2411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     new_cmd_line));
2421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    } else {
2431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      tests_to_run_now.push_back(
2441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com          std::make_pair(test_info.GetFullName(), new_cmd_line));
2451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
2461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
2471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  for (size_t i = 0; i < tests_to_run_now.size(); i++) {
2491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const TestInfo& test_info = tests_to_run_[tests_to_run_now[i].first];
2501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const CommandLine& cmd_line = tests_to_run_now[i].second;
2511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    DoRunTest(test_info, cmd_line);
2521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
2531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
2541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::DoRunTest(const TestInfo& test_info,
2561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                            const CommandLine& command_line) {
2571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  CommandLine new_cmd_line(command_line.GetProgram());
2581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  CommandLine::SwitchMap switches = command_line.GetSwitches();
2591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Strip out gtest_output flag because otherwise we would overwrite results
2611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // of the other tests.
2621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  switches.erase(base::kGTestOutputFlag);
2631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  for (CommandLine::SwitchMap::const_iterator iter = switches.begin();
2651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com       iter != switches.end(); ++iter) {
2661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    new_cmd_line.AppendSwitchNative(iter->first, iter->second);
2671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
2681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Always enable disabled tests.  This method is not called with disabled
2701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // tests unless this flag was specified to the browser test executable.
2711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests");
2721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  new_cmd_line.AppendSwitchASCII(
2731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "gtest_filter",
2741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      test_info.test_case_name + "." + test_info.test_name);
2751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  new_cmd_line.AppendSwitch(kSingleProcessTestsFlag);
2761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  char* browser_wrapper = getenv("BROWSER_WRAPPER");
2781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PRE_ tests and tests that depend on them should share the sequence token
2801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // name, so that they are run serially.
2811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  std::string test_name_no_pre = RemoveAnyPrePrefixes(
2821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      test_info.test_case_name + "." + test_info.test_name);
2831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  parallel_launcher_.LaunchChildGTestProcess(
2851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      new_cmd_line,
2861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      browser_wrapper ? browser_wrapper : std::string(),
2871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      TestTimeouts::action_max_timeout(),
2881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      base::Bind(&WrapperTestLauncherDelegate::GTestCallback,
2891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                 base::Unretained(this),
2901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                 test_info));
2911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
2921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::RunDependentTest(
2941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const std::string test_name,
2951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const CommandLine& command_line,
2961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const base::TestResult& pre_test_result) {
2971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const TestInfo& test_info = tests_to_run_[test_name];
2981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (pre_test_result.status == base::TestResult::TEST_SUCCESS) {
2991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Only run the dependent test if PRE_ test succeeded.
3001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    DoRunTest(test_info, command_line);
3011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  } else {
3021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Otherwise skip the test.
3031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    base::TestResult test_result;
3041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    test_result.test_case_name = test_info.test_case_name;
3051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    test_result.test_name = test_info.test_name;
3061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    test_result.status = base::TestResult::TEST_SKIPPED;
3071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    for (size_t i = 0; i < test_info.callbacks.size(); i++)
3081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      test_info.callbacks[i].Run(test_result);
3091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
3101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
3111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid WrapperTestLauncherDelegate::GTestCallback(
3131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const TestInfo& test_info,
3141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    int exit_code,
3151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const base::TimeDelta& elapsed_time,
3161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    bool was_timeout,
3171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    const std::string& output) {
3181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  base::TestResult result;
3191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  result.test_case_name = test_info.test_case_name;
3201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  result.test_name = test_info.test_name;
3211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // TODO(phajdan.jr): Recognize crashes.
3231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (exit_code == 0)
3241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    result.status = base::TestResult::TEST_SUCCESS;
3251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  else if (was_timeout)
3261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    result.status = base::TestResult::TEST_TIMEOUT;
3271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  else
3281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    result.status = base::TestResult::TEST_FAILURE;
3291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  result.elapsed_time = elapsed_time;
3311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // TODO(phajdan.jr): Use base::PrintTestOutputSnippetOnFailure after migrating
3331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // away from run_test_cases.py (http://crbug.com/236893).
3341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  fprintf(stdout, "%s", output.c_str());
3351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  fflush(stdout);
3361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  for (size_t i = 0; i < test_info.callbacks.size(); i++)
3381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    test_info.callbacks[i].Run(result);
3391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  parallel_launcher_.ResetOutputWatchdog();
3401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
3411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.combool GetSwitchValueAsInt(const std::string& switch_name, int* result) {
3431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (!CommandLine::ForCurrentProcess()->HasSwitch(switch_name))
3441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return true;
3451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  std::string switch_value =
3471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name);
3481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (!base::StringToInt(switch_value, result) || *result < 1) {
3491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    LOG(ERROR) << "Invalid value for " << switch_name << ": " << switch_value;
3501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return false;
3511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
3521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return true;
3541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
3551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace
3571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kHelpFlag[]   = "help";
3591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kLaunchAsBrowser[] = "as-browser";
3611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See kManualTestPrefix above.
3631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kRunManualTestsFlag[] = "run-manual";
3641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comconst char kSingleProcessTestsFlag[]   = "single_process";
3661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comTestLauncherDelegate::~TestLauncherDelegate() {
3691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
3701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.combool ShouldRunContentMain() {
3721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#if defined(OS_WIN) || defined(OS_LINUX)
3731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  CommandLine* command_line = CommandLine::ForCurrentProcess();
3741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return command_line->HasSwitch(switches::kProcessType) ||
3751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com         command_line->HasSwitch(kLaunchAsBrowser);
3761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#else
3771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return false;
3781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // defined(OS_WIN) || defined(OS_LINUX)
3791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
3801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comint RunContentMain(int argc, char** argv,
3821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                   TestLauncherDelegate* launcher_delegate) {
3831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#if defined(OS_WIN)
3841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  sandbox::SandboxInterfaceInfo sandbox_info = {0};
3851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  InitializeSandboxInfo(&sandbox_info);
3861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  scoped_ptr<ContentMainDelegate> chrome_main_delegate(
3871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      launcher_delegate->CreateContentMainDelegate());
3881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return ContentMain(GetModuleHandle(NULL),
3891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     &sandbox_info,
3901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     chrome_main_delegate.get());
3911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#elif defined(OS_LINUX)
3921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  scoped_ptr<ContentMainDelegate> chrome_main_delegate(
3931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      launcher_delegate->CreateContentMainDelegate());
3941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return ContentMain(argc, const_cast<const char**>(argv),
3951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                     chrome_main_delegate.get());
3961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // defined(OS_WIN)
3971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  NOTREACHED();
3981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return 0;
3991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
4001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comint LaunchTests(TestLauncherDelegate* launcher_delegate,
4021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                int argc,
4031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                char** argv) {
4041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  DCHECK(!g_launcher_delegate);
4051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  g_launcher_delegate = launcher_delegate;
4061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  CommandLine::Init(argc, argv);
4081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const CommandLine* command_line = CommandLine::ForCurrentProcess();
4091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (command_line->HasSwitch(kHelpFlag)) {
4111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    PrintUsage();
4121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return 0;
4131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
4141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (command_line->HasSwitch(kSingleProcessTestsFlag) ||
4161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      (command_line->HasSwitch(switches::kSingleProcess) &&
4171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com       command_line->HasSwitch(base::kGTestFilterFlag)) ||
4181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      command_line->HasSwitch(base::kGTestListTestsFlag) ||
4191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      command_line->HasSwitch(base::kGTestHelpFlag)) {
4201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#if defined(OS_WIN)
4211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (command_line->HasSwitch(kSingleProcessTestsFlag)) {
4221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      sandbox::SandboxInterfaceInfo sandbox_info;
4231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      InitializeSandboxInfo(&sandbox_info);
4241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      InitializeSandbox(&sandbox_info);
4251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
4261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif
4271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return launcher_delegate->RunTestSuite(argc, argv);
4281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
4291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (ShouldRunContentMain())
4311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return RunContentMain(argc, argv, launcher_delegate);
4321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  fprintf(stdout,
4341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "Starting tests...\n"
4351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "IMPORTANT DEBUGGING NOTE: each test is run inside its own process.\n"
4361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "For debugging a test inside a debugger, use the\n"
4371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "--gtest_filter=<your_test_name> flag along with either\n"
4381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "--single_process (to run the test in one launcher/browser process) or\n"
4391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "--single-process (to do the above, and also run Chrome in single-"
4401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      "process mode).\n");
4411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  base::AtExitManager at_exit;
4431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  testing::InitGoogleTest(&argc, argv);
4441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  TestTimeouts::Initialize();
4451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  int jobs = 1;  // TODO(phajdan.jr): Default to half the number of CPU cores.
4471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (!GetSwitchValueAsInt(switches::kTestLauncherJobs, &jobs))
4481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return 1;
4491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  base::MessageLoopForIO message_loop;
4511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  WrapperTestLauncherDelegate delegate(launcher_delegate, jobs);
4531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return base::LaunchTests(&delegate, argc, argv);
4541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
4551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comTestLauncherDelegate* GetCurrentTestLauncherDelegate() {
4571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return g_launcher_delegate;
4581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
4591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace content
4611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com