Chromium Code Reviews| Index: mojo/tools/gtest.py |
| diff --git a/mojo/tools/gtest.py b/mojo/tools/gtest.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..28b89c8397f966ac46ff474d581975cba5358f86 |
| --- /dev/null |
| +++ b/mojo/tools/gtest.py |
| @@ -0,0 +1,105 @@ |
| +# Copyright 2014 The Chromium Authors. All rights reserved. |
|
jamesr
2015/01/29 20:12:08
2015
#! please
ppi
2015/01/29 23:41:24
Fixed the year. As discussed off-thread, this is n
|
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +import logging |
| +import os |
| +import re |
| +import subprocess |
| +import sys |
| + |
| +_logging = logging.getLogger() |
| + |
| +def _print_process_error(command_line, error): |
| + """Properly format an exception raised from a failed command execution.""" |
| + |
| + if command_line: |
| + print 'Failed command: %r' % command_line |
| + else: |
| + print 'Failed command:' |
| + print 72 * '-' |
| + |
| + if hasattr(error, 'returncode'): |
| + print ' with exit code %d' % error.returncode |
| + print 72 * '-' |
| + |
| + if hasattr(error, 'output'): |
| + print error.output |
| + else: |
| + print error |
| + print 72 * '-' |
| + |
| +def set_color(): |
| + """Run gtests with color if we're on a TTY (and we're not being told |
| + explicitly what to do).""" |
| + if sys.stdout.isatty() and 'GTEST_COLOR' not in os.environ: |
| + _logging.debug("Setting GTEST_COLOR=yes") |
| + os.environ['GTEST_COLOR'] = 'yes' |
| + |
| + |
| +def _try_command_line(command_line): |
| + """Returns the output of a command line or an empty string on error.""" |
| + _logging.debug("Running command line: %s" % command_line) |
| + try: |
| + return subprocess.check_output(command_line, stderr=subprocess.STDOUT) |
| + except Exception as e: |
| + _print_process_error(command_line, e) |
| + return None |
| + |
| + |
| +def run_test(command_line): |
| + """Runs a command line and checks the output for signs of gtest failure.""" |
| + output = _try_command_line(command_line) |
| + # Fail on output with gtest's "[ FAILED ]" or a lack of "[ PASSED ]". |
| + # The latter condition ensures failure on broken command lines or output. |
| + # Check output instead of exit codes because mojo_shell always exits with 0. |
| + if (output is None or |
| + (output.find("[ FAILED ]") != -1 or output.find("[ PASSED ]") == -1)): |
| + print "Failed test:" |
| + _print_process_error(command_line, output) |
| + return False |
| + _logging.debug("Succeeded with output:\n%s" % output) |
| + return True |
| + |
| + |
| +def get_fixtures(mojo_shell, apptest): |
| + """Returns the "Test.Fixture" list from an apptest using mojo_shell. |
| + |
| + Tests are listed by running the given apptest in mojo_shell and passing |
| + --gtest_list_tests. The output is parsed and reformatted into a list like |
| + [TestSuite.TestFixture, ... ] |
| + An empty list is returned on failure, with errors logged. |
| + """ |
| + command = [mojo_shell, |
| + "--args-for={0} --gtest_list_tests".format(apptest), |
| + apptest] |
| + try: |
| + list_output = subprocess.check_output(command, stderr=subprocess.STDOUT) |
| + _logging.debug("Tests listed:\n%s" % list_output) |
| + return _gtest_list_tests(list_output) |
| + except Exception as e: |
| + print "Failed to get test fixtures:" |
| + _print_process_error(command, e) |
| + return [] |
| + |
| + |
| +def _gtest_list_tests(gtest_list_tests_output): |
| + """Returns a list of strings formatted as TestSuite.TestFixture from the |
| + output of running --gtest_list_tests on a GTEST application.""" |
| + |
| + if not re.match("^(\w*\.\r?\n( \w*\r?\n)+)+", gtest_list_tests_output): |
| + raise Exception("Unrecognized --gtest_list_tests output:\n%s" % |
| + gtest_list_tests_output) |
| + |
| + output_lines = gtest_list_tests_output.split('\n') |
| + |
| + test_list = [] |
| + for line in output_lines: |
| + if not line: |
| + continue |
| + if line[0] != ' ': |
| + suite = line.strip() |
| + continue |
| + test_list.append(suite + line.strip()) |
| + |
| + return test_list |