| Index: mojo/tools/gtest.py
|
| diff --git a/mojo/tools/gtest.py b/mojo/tools/gtest.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a731115ae5e777424932a1f33d793b94289ae654
|
| --- /dev/null
|
| +++ b/mojo/tools/gtest.py
|
| @@ -0,0 +1,105 @@
|
| +# Copyright 2015 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.
|
| +
|
| +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
|
|
|