| Index: chrome/test/browser/browser_tests_launcher.cc
|
| ===================================================================
|
| --- chrome/test/browser/browser_tests_launcher.cc (revision 17736)
|
| +++ chrome/test/browser/browser_tests_launcher.cc (working copy)
|
| @@ -1,174 +0,0 @@
|
| -// 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 <windows.h>
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/logging.h"
|
| -#include "base/process_util.h"
|
| -#include "base/string_util.h"
|
| -
|
| -namespace {
|
| -
|
| -const wchar_t* const kBrowserTestDLLName = L"browser_tests.dll";
|
| -const wchar_t* const kGTestListTestsFlag = L"gtest_list_tests";
|
| -}
|
| -
|
| -// TestEnvContext takes care of loading/unloading the DLL containing the tests.
|
| -class TestEnvContext {
|
| - public:
|
| - TestEnvContext()
|
| - : module_(NULL),
|
| - run_test_proc_(NULL) {
|
| - }
|
| -
|
| - ~TestEnvContext() {
|
| - if (!module_)
|
| - return;
|
| - BOOL r = ::FreeLibrary(module_);
|
| - DCHECK(r);
|
| - LOG(INFO) << "Unloaded " << kBrowserTestDLLName;
|
| - }
|
| -
|
| - bool Init() {
|
| - module_ = ::LoadLibrary(kBrowserTestDLLName);
|
| - if (!module_) {
|
| - LOG(ERROR) << "Failed to find " << kBrowserTestDLLName;
|
| - return false;
|
| - }
|
| -
|
| - run_test_proc_ = reinterpret_cast<RunTestProc>(
|
| - ::GetProcAddress(module_, "RunTests"));
|
| - if (!run_test_proc_) {
|
| - LOG(ERROR) <<
|
| - "Failed to find RunTest function in " << kBrowserTestDLLName;
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| - }
|
| -
|
| - // Returns true if the test succeeded, false if it failed.
|
| - bool RunTest(const std::string& test_name) {
|
| - std::string filter_flag = StringPrintf("--gtest_filter=%s",
|
| - test_name.c_str());
|
| - char* argv[2];
|
| - argv[0] = "";
|
| - argv[1] = const_cast<char*>(filter_flag.c_str());
|
| - return RunAsIs(2, argv) == 0;
|
| - }
|
| -
|
| - // Calls-in to GTest with the arguments we were started with.
|
| - int RunAsIs(int argc, char** argv) {
|
| - return (run_test_proc_)(argc, argv);
|
| - }
|
| -
|
| - private:
|
| - typedef int (__cdecl *RunTestProc)(int, char**);
|
| -
|
| - HMODULE module_;
|
| - RunTestProc run_test_proc_;
|
| -};
|
| -
|
| -// Retrieves the list of tests to run.
|
| -// Simply uses the --gtest_list_tests option which honor the filter.
|
| -// Sadly there is no dry-run option (or willingness to get such an option) in
|
| -// GTest. So we'll have to process disabled and repeat options ourselves.
|
| -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.
|
| - std::wstring new_command_line = command_line.command_line_string() + L" --" +
|
| - kGTestListTestsFlag;
|
| - std::string output;
|
| - if (!base::GetAppOutput(new_command_line, &output))
|
| - return false;
|
| -
|
| - // Now let's parse the returned output.
|
| - // It 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;
|
| -}
|
| -
|
| -int main(int argc, char** argv) {
|
| - CommandLine::Init(argc, argv);
|
| - const CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| -
|
| - if (command_line->HasSwitch(kGTestListTestsFlag)) {
|
| - TestEnvContext test_context;
|
| - if (!test_context.Init())
|
| - return 1;
|
| - return test_context.RunAsIs(argc, argv);
|
| - }
|
| -
|
| - // 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 0;
|
| - }
|
| -
|
| - if (test_list.empty()) {
|
| - printf("No tests to run.\n");
|
| - return 0;
|
| - }
|
| -
|
| - // Run the tests.
|
| - 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;
|
| - TestEnvContext test_context;
|
| - if (!test_context.Init())
|
| - return 1;
|
| - test_run_count++;
|
| - if (!test_context.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", failed_tests.size(),
|
| - failed_tests.size() > 1 ? "s" : "");
|
| - if (failed_tests.empty())
|
| - return 0;
|
| -
|
| - 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 1;
|
| -}
|
|
|