[rtems-tools commit] tester: Add support to email results.

Chris Johns chrisj at rtems.org
Wed Oct 11 19:14:20 UTC 2017


Module:    rtems-tools
Branch:    master
Commit:    89e8c2abb6f72ef9e95630646244fdd160be5c56
Changeset: http://git.rtems.org/rtems-tools/commit/?id=89e8c2abb6f72ef9e95630646244fdd160be5c56

Author:    Chris Johns <chrisj at rtems.org>
Date:      Thu Oct 12 06:13:47 2017 +1100

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 at 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)



More information about the vc mailing list