Commit c418bf27 authored by Denis Bilenko's avatar Denis Bilenko

move report() from util.py to testrunner.py

parent 60c7bcf9
...@@ -6,9 +6,11 @@ import os ...@@ -6,9 +6,11 @@ import os
import glob import glob
import traceback import traceback
import time import time
from datetime import timedelta
from multiprocessing.pool import ThreadPool from multiprocessing.pool import ThreadPool
import util import util
from util import log
TIMEOUT = 180 TIMEOUT = 180
...@@ -70,12 +72,12 @@ def run_many(tests, expected=None, failfast=False): ...@@ -70,12 +72,12 @@ def run_many(tests, expected=None, failfast=False):
pool.join() pool.join()
except KeyboardInterrupt: except KeyboardInterrupt:
try: try:
util.log('Waiting for currently running to finish...') log('Waiting for currently running to finish...')
reap_all() reap_all()
except KeyboardInterrupt: except KeyboardInterrupt:
pool.terminate() pool.terminate()
util.report(total, failed, exit=False, took=time.time() - start, expected=expected) report(total, failed, exit=False, took=time.time() - start, expected=expected)
util.log('(partial results)\n') log('(partial results)\n')
raise raise
except: except:
traceback.print_exc() traceback.print_exc()
...@@ -88,15 +90,15 @@ def run_many(tests, expected=None, failfast=False): ...@@ -88,15 +90,15 @@ def run_many(tests, expected=None, failfast=False):
failed_then_succeeded = [] failed_then_succeeded = []
if NWORKERS > 1 and toretry: if NWORKERS > 1 and toretry:
util.log('\nWill retry %s failed tests sequentially:\n- %s\n', len(toretry), '\n- '.join(toretry)) log('\nWill retry %s failed tests sequentially:\n- %s\n', len(toretry), '\n- '.join(toretry))
for name, (cmd, kwargs, _ignore) in list(failed.items()): for name, (cmd, kwargs, _ignore) in list(failed.items()):
if not util.run(cmd, buffer_output=False, **kwargs): if not util.run(cmd, buffer_output=False, **kwargs):
failed.pop(name) failed.pop(name)
failed_then_succeeded.append(name) failed_then_succeeded.append(name)
if failed_then_succeeded: if failed_then_succeeded:
util.log('\n%s tests failed during concurrent run but succeeded when ran sequentially:', len(failed_then_succeeded)) log('\n%s tests failed during concurrent run but succeeded when ran sequentially:', len(failed_then_succeeded))
util.log('- ' + '\n- '.join(failed_then_succeeded)) log('- ' + '\n- '.join(failed_then_succeeded))
util.report(total, failed, took=time.time() - start, expected=expected) util.report(total, failed, took=time.time() - start, expected=expected)
...@@ -143,6 +145,66 @@ def load_list_from_file(filename): ...@@ -143,6 +145,66 @@ def load_list_from_file(filename):
return result return result
def matches(expected, command):
for line in expected:
if command.endswith(' ' + line):
return True
return False
def format_seconds(seconds):
if seconds < 20:
return '%.1fs' % seconds
seconds = str(timedelta(seconds=round(seconds)))
if seconds.startswith('0:'):
seconds = seconds[2:]
return seconds
def report(total, failed, exit=True, took=None, expected=None):
runtimelog = util.runtimelog
if runtimelog:
log('\nLongest-running tests:')
runtimelog.sort()
length = len('%.1f' % -runtimelog[0][0])
frmt = '%' + str(length) + '.1f seconds: %s'
for delta, name in runtimelog[:5]:
log(frmt, -delta, name)
if took:
took = ' in %s' % format_seconds(took)
else:
took = ''
failed_expected = []
failed_unexpected = []
if failed:
log('\n%s/%s tests failed%s', len(failed), total, took)
expected = set(expected or [])
for name in failed:
if matches(expected, name):
failed_expected.append(name)
else:
failed_unexpected.append(name)
if failed_expected:
log('\n%s/%s expected failures', len(failed_expected), total)
for name in failed_expected:
log(' - %s', name)
if failed_unexpected:
log('\n%s/%s unexpected failures', len(failed_unexpected), total)
for name in failed_unexpected:
log(' - %s', name)
else:
log('\n%s tests passed%s', total, took)
if exit:
if failed_unexpected:
sys.exit(min(100, len(failed_unexpected)))
if total <= 0:
sys.exit('No tests found.')
def main(): def main():
import optparse import optparse
parser = optparse.OptionParser() parser = optparse.OptionParser()
......
...@@ -6,7 +6,6 @@ import unittest ...@@ -6,7 +6,6 @@ import unittest
import threading import threading
import subprocess import subprocess
import time import time
from datetime import timedelta
runtimelog = [] runtimelog = []
...@@ -202,65 +201,6 @@ def run(command, **kwargs): ...@@ -202,65 +201,6 @@ def run(command, **kwargs):
return RunResult(result, out, name) return RunResult(result, out, name)
def matches(expected, command):
for line in expected:
if command.endswith(' ' + line):
return True
return False
def format_seconds(seconds):
if seconds < 20:
return '%.1fs' % seconds
seconds = str(timedelta(seconds=round(seconds)))
if seconds.startswith('0:'):
seconds = seconds[2:]
return seconds
def report(total, failed, exit=True, took=None, expected=None):
if runtimelog:
log('\nLongest-running tests:')
runtimelog.sort()
length = len('%.1f' % -runtimelog[0][0])
frmt = '%' + str(length) + '.1f seconds: %s'
for delta, name in runtimelog[:5]:
log(frmt, -delta, name)
if took:
took = ' in %s' % format_seconds(took)
else:
took = ''
failed_expected = []
failed_unexpected = []
if failed:
log('\n%s/%s tests failed%s', len(failed), total, took)
expected = set(expected or [])
for name in failed:
if matches(expected, name):
failed_expected.append(name)
else:
failed_unexpected.append(name)
if failed_expected:
log('\n%s/%s expected failures', len(failed_expected), total)
for name in failed_expected:
log(' - %s', name)
if failed_unexpected:
log('\n%s/%s unexpected failures', len(failed_unexpected), total)
for name in failed_unexpected:
log(' - %s', name)
else:
log('\n%s tests passed%s', total, took)
if exit:
if failed_unexpected:
sys.exit(min(100, len(failed_unexpected)))
if total <= 0:
sys.exit('No tests found.')
class TestServer(unittest.TestCase): class TestServer(unittest.TestCase):
cwd = '../examples/' cwd = '../examples/'
args = [] args = []
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment