Index: chrome/test/browser/browser_test_runner.cc |
=================================================================== |
--- chrome/test/browser/browser_test_runner.cc (revision 0) |
+++ chrome/test/browser/browser_test_runner.cc (revision 0) |
@@ -0,0 +1,126 @@ |
+// 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 "chrome/test/browser/browser_test_runner.h" |
+ |
+#include <vector> |
+ |
+#include "base/command_line.h" |
+#include "base/logging.h" |
+#include "base/process_util.h" |
+#include "base/scoped_ptr.h" |
+#include "base/string_util.h" |
+ |
+namespace { |
+ |
+const wchar_t* const kGTestListTestsFlag = L"gtest_list_tests"; |
+ |
+// Retrieves the list of tests to run by running gtest with the |
+// --gtest_list_tests flag in a forked process and parsing its output. |
+// |command_line| should contain the command line used to start the browser |
+// test launcher, it is expected that it does not contain the |
+// --gtest_list_tests flag already. |
+// Note: we cannot implement this in-process for InProcessBrowserTestRunner as |
+// GTest prints to the stdout and there are no good way of temporarily |
+// redirecting outputs. |
+bool GetTestList(const CommandLine& command_line, |
+ std::vector<std::string>* test_list) { |
+ DCHECK(!command_line.HasSwitch(kGTestListTestsFlag)); |
+ |
+ // Run ourselves with the --gtest_list_tests option and read the output. |
+ CommandLine new_command_line(command_line); |
+ new_command_line.AppendSwitch(kGTestListTestsFlag); |
+ std::string output; |
+ if (!base::GetAppOutput(new_command_line, &output)) |
+ return false; |
+ |
+ // The output looks like: |
+ // TestCase. |
+ // Test1 |
+ // Test2 |
+ // OtherTestCase. |
+ // FooTest |
+ // ... |
+ std::vector<std::string> lines; |
+ SplitString(output, '\n', &lines); |
+ |
+ std::string test_case; |
+ for (std::vector<std::string>::const_iterator iter = lines.begin(); |
+ iter != lines.end(); ++iter) { |
+ std::string line = *iter; |
+ if (line.empty()) |
+ continue; // Just ignore empty lines if any. |
+ |
+ if (line[line.size() - 1] == '.') { |
+ // This is a new test case. |
+ test_case = line; |
+ continue; |
+ } |
+ // We are dealing with a test. |
+ test_list->push_back(test_case + line); |
+ } |
+ return true; |
+} |
+ |
+} // namespace |
+ |
+namespace browser_tests { |
+ |
+BrowserTestRunner::BrowserTestRunner() { |
+} |
+ |
+BrowserTestRunner::~BrowserTestRunner() { |
+} |
+ |
+bool RunTests(const BrowserTestRunnerFactory& browser_test_runner_factory) { |
+ const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
+ |
+ DCHECK(!command_line->HasSwitch(kGTestListTestsFlag)); |
+ |
+ // First let's get the list of tests we need to run. |
+ std::vector<std::string> test_list; |
+ if (!GetTestList(*command_line, &test_list)) { |
+ printf("Failed to retrieve the tests to run.\n"); |
+ return false; |
+ } |
+ |
+ if (test_list.empty()) { |
+ printf("No tests to run.\n"); |
+ return false; |
+ } |
+ |
+ int test_run_count = 0; |
+ std::vector<std::string> failed_tests; |
+ for (std::vector<std::string>::const_iterator iter = test_list.begin(); |
+ iter != test_list.end(); ++iter) { |
+ std::string test_name = *iter; |
+ scoped_ptr<BrowserTestRunner> test_runner( |
+ browser_test_runner_factory.CreateBrowserTestRunner()); |
+ if (!test_runner.get() || !test_runner->Init()) |
+ return false; |
+ test_run_count++; |
+ if (!test_runner->RunTest(test_name.c_str())) { |
+ if (std::find(failed_tests.begin(), failed_tests.end(), test_name) == |
+ failed_tests.end()) { |
+ failed_tests.push_back(*iter); |
+ } |
+ } |
+ } |
+ |
+ printf("%d test%s run\n", test_run_count, test_run_count > 1 ? "s" : ""); |
+ printf("%d test%s failed\n", static_cast<int>(failed_tests.size()), |
+ failed_tests.size() > 1 ? "s" : ""); |
+ if (failed_tests.empty()) |
+ return false; |
+ |
+ printf("Failing tests:\n"); |
+ for (std::vector<std::string>::const_iterator iter = failed_tests.begin(); |
+ iter != failed_tests.end(); ++iter) { |
+ printf("%s\n", iter->c_str()); |
+ } |
+ |
+ return true; |
+} |
+ |
+} // namespace |