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 = ¶ms; 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