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