Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1645)

Unified Diff: mojo/tools/gtest.py

Issue 874273002: Add mojo apptest runner. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address James's comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/tools/data/apptests ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « mojo/tools/data/apptests ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698