bring over fail only functionality from nova

This brings over the failonly flag from nova, which was extremely
useful when hunting failing tests.

Change-Id: I21fdc709d6e5bcbb2d2f611611efdf147d4c888e
This commit is contained in:
Sean Dague
2015-01-05 15:22:42 -05:00
parent 35cdd7f940
commit b73b9eb2a0

View File

@@ -21,6 +21,7 @@
import argparse import argparse
import datetime import datetime
import functools import functools
import os
import re import re
import sys import sys
@@ -103,7 +104,7 @@ def print_attachments(stream, test, all_channels=False):
stream.write(" %s\n" % line) stream.write(" %s\n" % line)
def show_outcome(stream, test, print_failures=False): def show_outcome(stream, test, print_failures=False, failonly=False):
global RESULTS global RESULTS
status = test['status'] status = test['status']
# TODO(sdague): ask lifeless why on this? # TODO(sdague): ask lifeless why on this?
@@ -122,24 +123,25 @@ def show_outcome(stream, test, print_failures=False):
if name == 'process-returncode': if name == 'process-returncode':
return return
if status == 'success': if status == 'fail':
stream.write('{%s} %s [%s] ... ok\n' % (
worker, name, duration))
print_attachments(stream, test)
elif status == 'fail':
FAILS.append(test) FAILS.append(test)
stream.write('{%s} %s [%s] ... FAILED\n' % ( stream.write('{%s} %s [%s] ... FAILED\n' % (
worker, name, duration)) worker, name, duration))
if not print_failures: if not print_failures:
print_attachments(stream, test, all_channels=True) print_attachments(stream, test, all_channels=True)
elif status == 'skip': elif not failonly:
stream.write('{%s} %s ... SKIPPED: %s\n' % ( if status == 'success':
worker, name, test['details']['reason'].as_text())) stream.write('{%s} %s [%s] ... ok\n' % (
else: worker, name, duration))
stream.write('{%s} %s [%s] ... %s\n' % ( print_attachments(stream, test)
worker, name, duration, test['status'])) elif status == 'skip':
if not print_failures: stream.write('{%s} %s ... SKIPPED: %s\n' % (
print_attachments(stream, test, all_channels=True) worker, name, test['details']['reason'].as_text()))
else:
stream.write('{%s} %s [%s] ... %s\n' % (
worker, name, duration, test['status']))
if not print_failures:
print_attachments(stream, test, all_channels=True)
stream.flush() stream.flush()
@@ -219,6 +221,11 @@ def parse_args():
parser.add_argument('--fails', '-f', action='store_true', parser.add_argument('--fails', '-f', action='store_true',
dest='post_fails', help='Print failure debug ' dest='post_fails', help='Print failure debug '
'information after the stream is proccesed') 'information after the stream is proccesed')
parser.add_argument('--failonly', action='store_true',
dest='failonly', help="Don't print success items",
default=(
os.environ.get('TRACE_FAILONLY', False)
is not False))
return parser.parse_args() return parser.parse_args()
@@ -228,7 +235,8 @@ def main():
sys.stdin, non_subunit_name='stdout') sys.stdin, non_subunit_name='stdout')
outcomes = testtools.StreamToDict( outcomes = testtools.StreamToDict(
functools.partial(show_outcome, sys.stdout, functools.partial(show_outcome, sys.stdout,
print_failures=args.print_failures)) print_failures=args.print_failures,
failonly=args.failonly))
summary = testtools.StreamSummary() summary = testtools.StreamSummary()
result = testtools.CopyStreamResult([outcomes, summary]) result = testtools.CopyStreamResult([outcomes, summary])
start_time = datetime.datetime.utcnow() start_time = datetime.datetime.utcnow()