Regression: Add ANSI colours to highlight test status
authorAndreas Hansson <andreas.hansson@arm.com>
Sat, 14 Apr 2012 09:44:27 +0000 (05:44 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Sat, 14 Apr 2012 09:44:27 +0000 (05:44 -0400)
This patch adds a very basic pretty-printing of the test status
(passed or failed) to highlight failing tests even more: green for
passed, and red for failed. The printing only uses ANSI it the target
output is a tty and supports ANSI colours. Hence, any regression
scripts that are outputting to files or sending e-mails etc should
still be fine.

SConstruct
src/python/m5/util/terminal.py
tests/SConscript

index baf95724aa3e1ee1b43f350e4bd1ceeb9f5195cb..a45a6e63f293a42b75dfbbb86a4d3746c9a482b8 100755 (executable)
@@ -120,6 +120,7 @@ extra_python_paths = [
 sys.path[1:1] = extra_python_paths
 
 from m5.util import compareVersions, readCommand
+from m5.util.terminal import get_termcap
 
 help_texts = {
     "options" : "",
@@ -169,14 +170,7 @@ AddLocalOption('--update-ref', dest='update_ref', action='store_true',
 AddLocalOption('--verbose', dest='verbose', action='store_true',
                help='Print full tool command lines')
 
-use_colors = GetOption('use_colors')
-if use_colors:
-    from m5.util.terminal import termcap
-elif use_colors is None:
-    # option unspecified; default behavior is to use colors iff isatty
-    from m5.util.terminal import tty_termcap as termcap
-else:
-    from m5.util.terminal import no_termcap as termcap
+termcap = get_termcap(GetOption('use_colors'))
 
 ########################################################################
 #
@@ -462,6 +456,8 @@ class Transform(object):
 
 Export('Transform')
 
+# enable the regression script to use the termcap
+main['TERMCAP'] = termcap
 
 if GetOption('verbose'):
     def MakeAction(action, string, *args, **kwargs):
index 9038c1f547baf50775457a59dee1c1189c604edd..6bf85f14d5f9d55c01e3260d0908a52cbb16b642 100644 (file)
@@ -93,6 +93,15 @@ if sys.stdout.isatty():
 else:
     tty_termcap = no_termcap
 
+def get_termcap(use_colors = None):
+    if use_colors:
+        return termcap
+    elif use_colors is None:
+        # option unspecified; default behavior is to use colors iff isatty
+        return tty_termcap
+    else:
+        return no_termcap
+
 def test_termcap(obj):
     for c_name in color_names:
         c_str = getattr(obj, c_name)
index 93bdcf9b47e935262742f1bb821b9a5934fdac3f..d9c40ebe3123d08f22d35b517f3f926d7bac092b 100644 (file)
@@ -38,6 +38,9 @@ Import('env')
 
 env['DIFFOUT'] = File('diff-out')
 
+# get the termcap from the environment
+termcap = env['TERMCAP']
+
 # Dict that accumulates lists of tests by category (quick, medium, long)
 env.Tests = {}
 
@@ -171,7 +174,26 @@ def run_test_string(target, source, env):
 testAction = env.Action(run_test, run_test_string)
 
 def print_test(target, source, env):
-    print '***** ' + contents(source[0])
+    # print the status with colours to make it easier to see what
+    # passed and what failed
+    line = contents(source[0])
+
+    # split the line to words and get the last one
+    words = line.split()
+    status = words[-1]
+
+    # if the test failed make it red, if it passed make it green, and
+    # skip the punctuation
+    if status == "FAILED!":
+        status = termcap.Red + status[:-1] + termcap.Normal + status[-1]
+    elif status == "passed.":
+        status = termcap.Green + status[:-1] + termcap.Normal + status[-1]
+
+    # put it back in the list and join with space
+    words[-1] = status
+    line = " ".join(words)
+
+    print '***** ' + line
     return 0
 
 printAction = env.Action(print_test, strfunction = None)