| Index: chrome/test/browser/browser_test_launcher_out_of_proc.cc
|
| ===================================================================
|
| --- chrome/test/browser/browser_test_launcher_out_of_proc.cc (revision 0)
|
| +++ chrome/test/browser/browser_test_launcher_out_of_proc.cc (revision 0)
|
| @@ -0,0 +1,85 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/logging.h"
|
| +#include "base/process_util.h"
|
| +
|
| +#include "chrome/test/browser/browser_test_runner.h"
|
| +#include "chrome/test/unit/chrome_test_suite.h"
|
| +
|
| +// This version of the browser test launcher forks a new process for each test
|
| +// it runs.
|
| +
|
| +namespace {
|
| +
|
| +const wchar_t* const kGTestListTestsFlag = L"gtest_list_tests";
|
| +const wchar_t* const kChildProcessFlag = L"child";
|
| +
|
| +class OutOfProcBrowserTestRunner : public browser_tests::BrowserTestRunner {
|
| + public:
|
| + OutOfProcBrowserTestRunner() {
|
| + }
|
| +
|
| + virtual ~OutOfProcBrowserTestRunner() {
|
| + }
|
| +
|
| + bool Init() {
|
| + return true;
|
| + }
|
| +
|
| + // Returns true if the test succeeded, false if it failed.
|
| + bool RunTest(const std::string& test_name) {
|
| + const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
|
| + CommandLine new_cmd_line(cmd_line->argv());
|
| + new_cmd_line.AppendSwitchWithValue(L"gtest_filter", ASCIIToWide(test_name));
|
| + new_cmd_line.AppendSwitch(kChildProcessFlag);
|
| +
|
| + base::ProcessHandle process_handle;
|
| + bool r = base::LaunchApp(new_cmd_line, false, false, &process_handle);
|
| + if (!r)
|
| + return false;
|
| +
|
| + int exit_code = 0;
|
| + r = base::WaitForExitCode(process_handle, &exit_code);
|
| + if (!r)
|
| + return false;
|
| +
|
| + return exit_code == 0;
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(OutOfProcBrowserTestRunner);
|
| +};
|
| +
|
| +class OutOfProcBrowserTestRunnerFactory
|
| + : public browser_tests::BrowserTestRunnerFactory {
|
| + public:
|
| + OutOfProcBrowserTestRunnerFactory() { }
|
| +
|
| + virtual browser_tests::BrowserTestRunner* CreateBrowserTestRunner() const {
|
| + return new OutOfProcBrowserTestRunner();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(OutOfProcBrowserTestRunnerFactory);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +int main(int argc, char** argv) {
|
| + CommandLine::Init(argc, argv);
|
| + const CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| +
|
| + if (command_line->HasSwitch(kChildProcessFlag))
|
| + return ChromeTestSuite(argc, argv).Run();
|
| +
|
| + if (command_line->HasSwitch(kGTestListTestsFlag))
|
| + return ChromeTestSuite(argc, argv).Run();
|
| +
|
| + OutOfProcBrowserTestRunnerFactory test_runner_factory;
|
| + return browser_tests::RunTests(test_runner_factory) ? 0 : 1;
|
| +}
|
|
|