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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_launcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_loop.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/stl_util.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/test/launcher/test_launcher.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_suite.h"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/test/test_switches.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/app/content_main.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/app/content_main_delegate.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/app/startup_helper_win.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/sandbox_init.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_switches.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/sandbox_win.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_factory.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_types.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests with this prefix run before the same test without it, and use the same
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// profile. i.e. Foo.PRE_Test runs and then Foo.Test. This allows writing tests
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that span browser restarts.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPreTestPrefix[] = "PRE_";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manual tests only run when --run-manual is specified. This allows writing
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests that don't run automatically but are still in the same test binary.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is useful so that a team that wants to run a few tests doesn't have to
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// add a new binary that must be compiled on all builds.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kManualTestPrefix[] = "MANUAL_";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLauncherDelegate* g_launcher_delegate;
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentMainParams* g_params;
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string RemoveAnyPrePrefixes(const std::string& test_name) {
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string result(test_name);
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ReplaceSubstringsAfterOffset(&result, 0, kPreTestPrefix, std::string());
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return result;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrintUsage() {
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fprintf(stdout,
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "Runs tests using the gtest framework, each batch of tests being\n"
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "run in their own process. Supported command-line flags:\n"
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          " Common flags:\n"
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --gtest_filter=...\n"
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Runs a subset of tests (see --gtest_help for more info).\n"
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --help\n"
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Shows this message.\n"
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --gtest_help\n"
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Shows the gtest help message.\n"
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-jobs=N\n"
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Sets the number of parallel test jobs to N.\n"
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --single_process\n"
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Runs the tests and the launcher in the same process. Useful\n"
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    for debugging a specific test in a debugger.\n"
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          " Other flags:\n"
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-retry-limit=N\n"
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Sets the limit of test retries on failures to N.\n"
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-summary-output=PATH\n"
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Saves a JSON machine-readable summary of the run.\n"
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-print-test-stdio=auto|always|never\n"
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Controls when full test output is printed.\n"
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    auto means to print it when the test failed.\n"
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-total-shards=N\n"
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Sets the total number of shards to N.\n"
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "\n"
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "  --test-launcher-shard-index=N\n"
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "    Sets the shard index to run to N (from 0 to TOTAL - 1).\n");
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Implementation of base::TestLauncherDelegate. This is also a test launcher,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// wrapping a lower-level test launcher with content-specific code.
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WrapperTestLauncherDelegate : public base::TestLauncherDelegate {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  explicit WrapperTestLauncherDelegate(
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      content::TestLauncherDelegate* launcher_delegate)
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      : launcher_delegate_(launcher_delegate) {
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CHECK(temp_dir_.CreateUniqueTempDir());
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // base::TestLauncherDelegate:
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool ShouldRunTest(const testing::TestCase* test_case,
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const testing::TestInfo* test_info) OVERRIDE;
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual size_t RunTests(base::TestLauncher* test_launcher,
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                          const std::vector<std::string>& test_names) OVERRIDE;
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual size_t RetryTests(
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::TestLauncher* test_launcher,
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const std::vector<std::string>& test_names) OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void DoRunTest(base::TestLauncher* test_launcher,
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 const std::string& test_name);
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Launches test named |test_name| using parallel launcher,
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // given result of PRE_ test |pre_test_result|.
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void RunDependentTest(base::TestLauncher* test_launcher,
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                        const std::string test_name,
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        const base::TestResult& pre_test_result);
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Callback to receive result of a test.
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void GTestCallback(
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::TestLauncher* test_launcher,
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const std::string& test_name,
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      int exit_code,
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const base::TimeDelta& elapsed_time,
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      bool was_timeout,
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& output);
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::TestLauncherDelegate* launcher_delegate_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Store dependent test name (map is indexed by full test name).
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  typedef std::map<std::string, std::string> DependentTestMap;
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DependentTestMap dependent_test_map_;
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DependentTestMap reverse_dependent_test_map_;
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Store unique data directory prefix for test names (without PRE_ prefixes).
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // PRE_ tests and tests that depend on them must share the same
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // data directory. Using test name as directory name leads to too long
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // names (exceeding UNIX_PATH_MAX, which creates a problem with
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // process_singleton_linux). Create a randomly-named temporary directory
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // and keep track of the names so that PRE_ tests can still re-use them.
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  typedef std::map<std::string, base::FilePath> UserDataDirMap;
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UserDataDirMap user_data_dir_map_;
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Store names of all seen tests to properly handle PRE_ tests.
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::set<std::string> all_test_names_;
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Temporary directory for user data directories.
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WrapperTestLauncherDelegate);
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool WrapperTestLauncherDelegate::ShouldRunTest(
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const testing::TestCase* test_case,
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const testing::TestInfo* test_info) {
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  all_test_names_.insert(
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::string(test_case->name()) + "." + test_info->name());
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (StartsWithASCII(test_info->name(), kManualTestPrefix, true) &&
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      !CommandLine::ForCurrentProcess()->HasSwitch(kRunManualTestsFlag)) {
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (StartsWithASCII(test_info->name(), kPreTestPrefix, true)) {
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // We will actually run PRE_ tests, but to ensure they run on the same shard
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // as dependent tests, handle all these details internally.
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string GetPreTestName(const std::string& full_name) {
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  size_t dot_pos = full_name.find('.');
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CHECK_NE(dot_pos, std::string::npos);
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string test_case_name = full_name.substr(0, dot_pos);
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string test_name = full_name.substr(dot_pos + 1);
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return test_case_name + "." + kPreTestPrefix + test_name;
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)size_t WrapperTestLauncherDelegate::RunTests(
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TestLauncher* test_launcher,
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::vector<std::string>& test_names) {
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dependent_test_map_.clear();
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reverse_dependent_test_map_.clear();
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  user_data_dir_map_.clear();
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Number of additional tests to run because of dependencies.
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  size_t additional_tests_to_run_count = 0;
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Compute dependencies of tests to be run.
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < test_names.size(); i++) {
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string full_name(test_names[i]);
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string pre_test_name(GetPreTestName(full_name));
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    while (ContainsKey(all_test_names_, pre_test_name)) {
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      additional_tests_to_run_count++;
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DCHECK(!ContainsKey(dependent_test_map_, pre_test_name));
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      dependent_test_map_[pre_test_name] = full_name;
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DCHECK(!ContainsKey(reverse_dependent_test_map_, full_name));
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      reverse_dependent_test_map_[full_name] = pre_test_name;
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      full_name = pre_test_name;
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      pre_test_name = GetPreTestName(pre_test_name);
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < test_names.size(); i++) {
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string full_name(test_names[i]);
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Make sure no PRE_ tests were requested explicitly.
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK_EQ(full_name, RemoveAnyPrePrefixes(full_name));
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!ContainsKey(user_data_dir_map_, full_name)) {
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::FilePath temp_dir;
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      CHECK(base::CreateTemporaryDirInDir(temp_dir_.path(),
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          FILE_PATH_LITERAL("d"), &temp_dir));
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      user_data_dir_map_[full_name] = temp_dir;
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // If the test has any dependencies, get to the root and start with that.
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    while (ContainsKey(reverse_dependent_test_map_, full_name))
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      full_name = GetPreTestName(full_name);
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DoRunTest(test_launcher, full_name);
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return test_names.size() + additional_tests_to_run_count;
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)size_t WrapperTestLauncherDelegate::RetryTests(
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TestLauncher* test_launcher,
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::vector<std::string>& test_names) {
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // List of tests we can kick off right now, depending on no other tests.
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<std::string> tests_to_run_now;
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // We retry at least the tests requested to retry.
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::set<std::string> test_names_set(test_names.begin(), test_names.end());
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // In the face of PRE_ tests, we need to retry the entire chain of tests,
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // from the very first one.
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < test_names.size(); i++) {
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string test_name(test_names[i]);
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    while (ContainsKey(reverse_dependent_test_map_, test_name)) {
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      test_name = reverse_dependent_test_map_[test_name];
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      test_names_set.insert(test_name);
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Discard user data directories from any previous runs. Start with
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fresh state.
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (UserDataDirMap::const_iterator i = user_data_dir_map_.begin();
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       i != user_data_dir_map_.end();
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       ++i) {
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Delete temporary directories now to avoid using too much space in /tmp.
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!base::DeleteFile(i->second, true)) {
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      LOG(WARNING) << "Failed to delete " << i->second.value();
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  user_data_dir_map_.clear();
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::set<std::string>::const_iterator i = test_names_set.begin();
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       i != test_names_set.end();
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       ++i) {
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string full_name(*i);
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Make sure PRE_ tests and tests that depend on them share the same
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // data directory - based it on the test name without prefixes.
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string test_name_no_pre(RemoveAnyPrePrefixes(full_name));
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!ContainsKey(user_data_dir_map_, test_name_no_pre)) {
29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::FilePath temp_dir;
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      CHECK(base::CreateTemporaryDirInDir(temp_dir_.path(),
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          FILE_PATH_LITERAL("d"), &temp_dir));
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      user_data_dir_map_[test_name_no_pre] = temp_dir;
29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    size_t dot_pos = full_name.find('.');
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    CHECK_NE(dot_pos, std::string::npos);
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string test_case_name = full_name.substr(0, dot_pos);
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string test_name = full_name.substr(dot_pos + 1);
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string pre_test_name(
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_case_name + "." + kPreTestPrefix + test_name);
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!ContainsKey(test_names_set, pre_test_name))
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      tests_to_run_now.push_back(full_name);
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < tests_to_run_now.size(); i++)
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DoRunTest(test_launcher, tests_to_run_now[i]);
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return test_names_set.size();
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WrapperTestLauncherDelegate::DoRunTest(base::TestLauncher* test_launcher,
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                            const std::string& test_name) {
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name));
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CommandLine cmd_line(*CommandLine::ForCurrentProcess());
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CHECK(launcher_delegate_->AdjustChildProcessCommandLine(
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            &cmd_line, user_data_dir_map_[test_name_no_pre]));
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CommandLine new_cmd_line(cmd_line.GetProgram());
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CommandLine::SwitchMap switches = cmd_line.GetSwitches();
32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Strip out gtest_output flag because otherwise we would overwrite results
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // of the other tests.
32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switches.erase(base::kGTestOutputFlag);
33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (CommandLine::SwitchMap::const_iterator iter = switches.begin();
33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)       iter != switches.end(); ++iter) {
33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    new_cmd_line.AppendSwitchNative(iter->first, iter->second);
33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Always enable disabled tests.  This method is not called with disabled
33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // tests unless this flag was specified to the browser test executable.
33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests");
3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  new_cmd_line.AppendSwitchASCII("gtest_filter", test_name);
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  new_cmd_line.AppendSwitch(kSingleProcessTestsFlag);
34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  char* browser_wrapper = getenv("BROWSER_WRAPPER");
34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  test_launcher->LaunchChildGTestProcess(
34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new_cmd_line,
34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      browser_wrapper ? browser_wrapper : std::string(),
34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      TestTimeouts::action_max_timeout(),
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::TestLauncher::USE_JOB_OBJECTS |
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          base::TestLauncher::ALLOW_BREAKAWAY_FROM_JOB,
35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::Bind(&WrapperTestLauncherDelegate::GTestCallback,
35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 base::Unretained(this),
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 test_launcher,
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 test_name));
35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WrapperTestLauncherDelegate::RunDependentTest(
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TestLauncher* test_launcher,
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string test_name,
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::TestResult& pre_test_result) {
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (pre_test_result.status == base::TestResult::TEST_SUCCESS) {
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Only run the dependent test if PRE_ test succeeded.
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DoRunTest(test_launcher, test_name);
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Otherwise skip the test.
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::TestResult test_result;
3661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    test_result.full_name = test_name;
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    test_result.status = base::TestResult::TEST_SKIPPED;
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    test_launcher->OnTestFinished(test_result);
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (ContainsKey(dependent_test_map_, test_name)) {
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      RunDependentTest(test_launcher,
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       dependent_test_map_[test_name],
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       test_result);
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void WrapperTestLauncherDelegate::GTestCallback(
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TestLauncher* test_launcher,
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string& test_name,
38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int exit_code,
38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& elapsed_time,
38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bool was_timeout,
38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const std::string& output) {
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::TestResult result;
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  result.full_name = test_name;
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(phajdan.jr): Recognize crashes.
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (exit_code == 0)
39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.status = base::TestResult::TEST_SUCCESS;
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else if (was_timeout)
39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.status = base::TestResult::TEST_TIMEOUT;
39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.status = base::TestResult::TEST_FAILURE;
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  result.elapsed_time = elapsed_time;
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  result.output_snippet = GetTestOutputSnippet(result, output);
39968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (ContainsKey(dependent_test_map_, test_name)) {
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RunDependentTest(test_launcher, dependent_test_map_[test_name], result);
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // No other tests depend on this, we can delete the temporary directory now.
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Do so to avoid too many temporary files using lots of disk space.
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name));
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (ContainsKey(user_data_dir_map_, test_name_no_pre)) {
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (!base::DeleteFile(user_data_dir_map_[test_name_no_pre], true)) {
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        LOG(WARNING) << "Failed to delete "
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     << user_data_dir_map_[test_name_no_pre].value();
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      user_data_dir_map_.erase(test_name_no_pre);
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_launcher->OnTestFinished(result);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHelpFlag[]   = "help";
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLaunchAsBrowser[] = "as-browser";
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See kManualTestPrefix above.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRunManualTestsFlag[] = "run-manual";
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSingleProcessTestsFlag[]   = "single_process";
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLauncherDelegate::~TestLauncherDelegate() {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LaunchTests(TestLauncherDelegate* launcher_delegate,
4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                int default_jobs,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int argc,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                char** argv) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!g_launcher_delegate);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_launcher_delegate = launcher_delegate;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::Init(argc, argv);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine* command_line = CommandLine::ForCurrentProcess();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line->HasSwitch(kHelpFlag)) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintUsage();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<ContentMainDelegate> chrome_main_delegate(
44923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      launcher_delegate->CreateContentMainDelegate());
45023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ContentMainParams params(chrome_main_delegate.get());
45123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
45223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_WIN)
45323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  sandbox::SandboxInterfaceInfo sandbox_info = {0};
45423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  InitializeSandboxInfo(&sandbox_info);
45523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
45623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  params.instance = GetModuleHandle(NULL);
45723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  params.sandbox_info = &sandbox_info;
45823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif !defined(OS_ANDROID)
45923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  params.argc = argc;
46023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  params.argv = const_cast<const char**>(argv);
46123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // defined(OS_WIN)
46223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line->HasSwitch(kSingleProcessTestsFlag) ||
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (command_line->HasSwitch(switches::kSingleProcess) &&
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       command_line->HasSwitch(base::kGTestFilterFlag)) ||
466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      command_line->HasSwitch(base::kGTestListTestsFlag) ||
467d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      command_line->HasSwitch(base::kGTestHelpFlag)) {
46823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    g_params = &params;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_delegate->RunTestSuite(argc, argv);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_ANDROID)
47323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (command_line->HasSwitch(switches::kProcessType) ||
47423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      command_line->HasSwitch(kLaunchAsBrowser)) {
47523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return ContentMain(params);
47623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::AtExitManager at_exit;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::InitGoogleTest(&argc, argv);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTimeouts::Initialize();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  fprintf(stdout,
4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "IMPORTANT DEBUGGING NOTE: each test is run inside its own process.\n"
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "For debugging a test inside a debugger, use the\n"
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "--gtest_filter=<your_test_name> flag along with either\n"
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "--single_process (to run the test in one launcher/browser process) or\n"
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "--single-process (to do the above, and also run Chrome in single-"
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          "process mode).\n");
4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::MessageLoopForIO message_loop;
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Allow the |launcher_delegate| to modify |default_jobs|.
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  launcher_delegate->AdjustDefaultParallelJobs(&default_jobs);
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  WrapperTestLauncherDelegate delegate(launcher_delegate);
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::TestLauncher launcher(&delegate, default_jobs);
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return (launcher.Run() ? 0 : 1);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLauncherDelegate* GetCurrentTestLauncherDelegate() {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_launcher_delegate;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentMainParams* GetContentMainParams() {
50623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return g_params;
50723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
50823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
510