From 89e8c2abb6f72ef9e95630646244fdd160be5c56 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 12 Oct 2017 06:13:47 +1100 Subject: tester: Add support to email results. --- tester/rt/report.py | 68 +++++++++++++++++++++++++++++++---------------------- tester/rt/test.py | 41 ++++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 30 deletions(-) diff --git a/tester/rt/report.py b/tester/rt/report.py index 97eb80f..1a7d8ba 100644 --- a/tester/rt/report.py +++ b/tester/rt/report.py @@ -208,41 +208,53 @@ class report(object): log.output(result) log.output(output) - def summary(self): + def score_card(self): + l = [] + l += ['Passed: %*d' % (self.total_len, self.passed)] + l += ['Failed: %*d' % (self.total_len, self.failed)] + l += ['User Input: %*d' % (self.total_len, self.user_input)] + l += ['Expected Fail: %*d' % (self.total_len, self.expected_fail)] + l += ['Indeterminate: %*d' % (self.total_len, self.indeterminate)] + l += ['Benchmark: %*d' % (self.total_len, self.benchmark)] + l += ['Timeout: %*d' % (self.total_len, self.timeouts)] + l += ['Invalid: %*d' % (self.total_len, self.invalids)] + l += ['---------------%s' % ('-' * self.total_len)] + l += ['Total: %*d' % (self.total_len, self.total)] + return os.linesep.join(l) + + def failures(self): def show_state(results, state, max_len): + l = [] for name in results: if results[name]['result'] == state: - log.output(' %s' % (path.basename(name))) - log.output() - log.notice('Passed: %*d' % (self.total_len, self.passed)) - log.notice('Failed: %*d' % (self.total_len, self.failed)) - log.notice('User Input: %*d' % (self.total_len, self.user_input)) - log.notice('Expected Fail: %*d' % (self.total_len, self.expected_fail)) - log.notice('Indeterminate: %*d' % (self.total_len, self.indeterminate)) - log.notice('Benchmark: %*d' % (self.total_len, self.benchmark)) - log.notice('Timeout: %*d' % (self.total_len, self.timeouts)) - log.notice('Invalid: %*d' % (self.total_len, self.invalids)) - log.output('---------------%s' % ('-' * self.total_len)) - log.notice('Total: %*d' % (self.total_len, self.total)) - log.output() + l += [' %s' % (path.basename(name))] + return l + l = [] if self.failed: - log.output('Failures:') - show_state(self.results, 'failed', self.name_max_len) + l += ['Failures:'] + l += show_state(self.results, 'failed', self.name_max_len) if self.user_input: - log.output('User Input:') - show_state(self.results, 'user-input', self.name_max_len) + l += ['User Input:'] + l += show_state(self.results, 'user-input', self.name_max_len) if self.expected_fail: - log.output('Expected Fail:') - show_state(self.results, 'expected-fail', self.name_max_len) + l += ['Expected Fail:'] + l += show_state(self.results, 'expected-fail', self.name_max_len) if self.indeterminate: - log.output('Indeterminate:') - show_state(self.results, 'indeterminate', self.name_max_len) + l += ['Indeterminate:'] + l += show_state(self.results, 'indeterminate', self.name_max_len) if self.benchmark: - log.output('Benchmark:') - show_state(self.results, 'benchmark', self.name_max_len) + l += ['Benchmark:'] + l += show_state(self.results, 'benchmark', self.name_max_len) if self.timeouts: - log.output('Timeouts:') - show_state(self.results, 'timeout', self.name_max_len) + l += ['Timeouts:'] + l += show_state(self.results, 'timeout', self.name_max_len) if self.invalids: - log.output('Invalid:') - show_state(self.results, 'invalid', self.name_max_len) + l += ['Invalid:'] + l += show_state(self.results, 'invalid', self.name_max_len) + return os.linesep.join(l) + + def summary(self): + log.output() + log.notice(self.score_card()) + log.output() + log.output(self.failures()) diff --git a/tester/rt/test.py b/tester/rt/test.py index 8a1eb9c..c67bb54 100644 --- a/tester/rt/test.py +++ b/tester/rt/test.py @@ -41,6 +41,7 @@ import time from rtemstoolkit import error from rtemstoolkit import log from rtemstoolkit import path +from rtemstoolkit import mailer from rtemstoolkit import reraise from rtemstoolkit import stacktraces from rtemstoolkit import version @@ -51,6 +52,20 @@ from . import console from . import options from . import report +class log_capture(object): + def __init__(self): + self.log = [] + log.capture = self.capture + + def __str__(self): + return os.linesep.join(self.log) + + def capture(self, text): + self.log += [l for l in text.replace(chr(13), '').splitlines()] + + def get(self): + return self.log + class test(object): def __init__(self, index, total, report, executable, rtems_tools, bsp, bsp_config, opts): self.index = index @@ -201,9 +216,15 @@ def run(command_path = None): '--filter': 'Glob that executables must match to run (default: ' + default_exefilter + ')', '--stacktrace': 'Dump a stack trace on a user termination (^C)' } + mailer.append_options(optargs) opts = options.load(sys.argv, optargs = optargs, command_path = command_path) + mail = None + output = None + if opts.find_arg('--mail'): + mail = mailer.mail(opts) + output = log_capture() log.notice('RTEMS Testing - Tester, %s' % (version.str())) if opts.find_arg('--list-bsps'): bsps.list(opts) @@ -303,8 +324,24 @@ def run(command_path = None): report_finished(reports, report_mode, -1, finished, job_trace) reports.summary() end_time = datetime.datetime.now() - log.notice('Average test time: %s' % (str((end_time - start_time) / total))) - log.notice('Testing time : %s' % (str(end_time - start_time))) + average_time = 'Average test time: %s' % (str((end_time - start_time) / total)) + total_time = 'Testing time : %s' % (str(end_time - start_time)) + log.notice(average_time) + log.notice(total_time) + if mail is not None and output is not None: + to_addr = opts.find_arg('--mail-to') + if to_addr: + to_addr = to_addr[1] + else: + to_addr = 'build@rtems.org' + subject = '[rtems-test] %s: %s' % (str(start_time).split('.')[0], bsp) + body = [total_time, average_time, + '', 'Summary', '=======', '', + reports.score_card(), '', + reports.failures(), + '', 'Log', '===', ''] + output.get() + mail.send(to_addr, subject, os.linesep.join(body)) + except error.general as gerr: print(gerr) sys.exit(1) -- cgit v1.2.3