[rtems-tools commit] tester: Add reporting the RTEMS version, build and tools.
Chris Johns
chrisj at rtems.org
Sat Nov 11 05:23:19 UTC 2017
Module: rtems-tools
Branch: master
Commit: 30218f5ca5b6b060258791a4f4c915e16f1edbe9
Changeset: http://git.rtems.org/rtems-tools/commit/?id=30218f5ca5b6b060258791a4f4c915e16f1edbe9
Author: Chris Johns <chrisj at rtems.org>
Date: Sun Nov 5 18:48:20 2017 +1100
tester: Add reporting the RTEMS version, build and tools.
Update #3217.
---
tester/rt/config.py | 19 ++++++----
tester/rt/report.py | 102 ++++++++++++++++++++++++++++++++++++++++++----------
tester/rt/run.py | 4 ++-
tester/rt/test.py | 18 +++++++---
4 files changed, 112 insertions(+), 31 deletions(-)
diff --git a/tester/rt/config.py b/tester/rt/config.py
index eb11740..1c2670a 100644
--- a/tester/rt/config.py
+++ b/tester/rt/config.py
@@ -67,6 +67,7 @@ class file(config.file):
self.realtime_trace = self.exe_trace('output')
self.console_trace = self.exe_trace('console')
self.console_prefix = console_prefix
+ self.show_header = not self.defined('test_disable_header')
self.process = None
self.console = None
self.output = None
@@ -301,8 +302,8 @@ class file(config.file):
bsp_arch = self.expand('%{arch}')
bsp = self.expand('%{bsp}')
fexe = self._target_exe_filter(exe)
- if self.report is not None:
- self.report.start(index, total, exe, fexe, bsp_arch, bsp)
+ self.report.start(index, total, exe, fexe,
+ bsp_arch, bsp, self.show_header)
if self.index == 1:
self._target_command('on', bsp_arch, bsp, exe, fexe)
self._target_command('pretest', bsp_arch, bsp, exe, fexe)
@@ -321,10 +322,14 @@ class file(config.file):
self._target_command('off', bsp_arch, bsp, exe, fexe)
self._target_command('posttest', bsp_arch, bsp, exe, fexe)
try:
- status = ''
- if self.report is not None:
- status = self.report.end(exe, self.output)
- self._capture_console('test result: %s' % (status))
+ status = self.report.end(exe, self.output, self.console_prefix)
+ version = self.report.get_config('version', not_found = 'n/p')
+ build = self.report.get_config('build', not_found = 'n/p')
+ tools = self.report.get_config('tools', not_found = 'n/p')
+ self._capture_console('test result: %s' % (status))
+ self._capture_console('test version: %s' % (version))
+ self._capture_console('test build: %s' % (build))
+ self._capture_console('test tools: %s' % (tools))
if status == 'timeout':
if self.index != self.total:
self._target_command('reset', bsp_arch, bsp, exe, fexe)
@@ -336,7 +341,7 @@ class file(config.file):
def _realtime_trace(self, text):
for l in text:
- print(l)
+ print(''.join(l))
def run(self):
self.target_start_regx = self._target_regex('target_start_regex')
diff --git a/tester/rt/report.py b/tester/rt/report.py
index 7c906de..4bf6ef4 100644
--- a/tester/rt/report.py
+++ b/tester/rt/report.py
@@ -55,14 +55,18 @@ class report(object):
self.total = total
self.total_len = len(str(total))
self.passed = 0
- self.user_input = 0
self.failed = 0
+ self.user_input = 0
self.expected_fail = 0
self.indeterminate = 0
self.benchmark = 0
self.timeouts = 0
self.invalids = 0
+ self.wrong_version = 0
+ self.wrong_build = 0
+ self.wrong_tools = 0
self.results = {}
+ self.config = {}
self.name_max_len = 0
def __str__(self):
@@ -74,10 +78,14 @@ class report(object):
msg += 'Benchmark: %*d%s' % (self.total_len, self.self.benchmark, os.linesep)
msg += 'Timeout: %*d%s' % (self.total_len, self.timeouts, os.linesep)
msg += 'Invalid: %*d%s' % (self.total_len, self.invalids, os.linesep)
+ msg += 'Wrong Version %*d%s' % (self.total_len, self.wrong_version, os.linesep)
+ msg += 'Wrong Build %*d%s' % (self.total_len, self.wrong_build, os.linesep)
+ msg += 'Wrong Tools %*d%s' % (self.total_len, self.wrong_tools, os.linesep)
return msg
- def start(self, index, total, name, executable, bsp_arch, bsp):
- header = '[%*d/%*d] p:%-*d f:%-*d u:%-*d e:%-*d I:%-*d B:%-*d t:%-*d i:%-*d | %s/%s: %s' % \
+ def start(self, index, total, name, executable, bsp_arch, bsp, show_header):
+ header = '[%*d/%*d] p:%-*d f:%-*d u:%-*d e:%-*d I:%-*d B:%-*d ' \
+ 't:%-*d i:%-*d W:%-*d | %s/%s: %s' % \
(len(str(total)), index,
len(str(total)), total,
len(str(total)), self.passed,
@@ -88,6 +96,7 @@ class report(object):
len(str(total)), self.benchmark,
len(str(total)), self.timeouts,
len(str(total)), self.invalids,
+ len(str(total)), self.wrong_version + self.wrong_build + self.wrong_tools,
bsp_arch,
bsp,
path.basename(name))
@@ -106,25 +115,36 @@ class report(object):
'header': header }
self.lock.release()
- log.notice(header, stdout_only = True)
+ if show_header:
+ log.notice(header, stdout_only = True)
- def end(self, name, output):
+ def end(self, name, output, output_prefix):
start = False
end = False
state = None
+ version = None
+ build = None
+ tools = None
timeout = False
prefixed_output = []
for line in output:
- if line[0] == ']':
+ if line[0] == output_prefix:
if line[1].startswith('*** '):
- if line[1][4:].startswith('BEGIN OF '):
+ banner = line[1][4:]
+ if banner.startswith('BEGIN OF '):
start = True
- if line[1][4:].startswith('END OF '):
+ elif line[1][4:].startswith('END OF '):
end = True
- if line[1][4:].startswith('TEST STATE:'):
- state = line[1][15:].strip()
- if line[1][4:].startswith('TIMEOUT TIMEOUT'):
+ elif banner.startswith('TIMEOUT TIMEOUT'):
timeout = True
+ elif banner.startswith('TEST VERSION:'):
+ version = banner[13:].strip()
+ elif banner.startswith('TEST STATE:'):
+ state = banner[11:].strip()
+ elif banner.startswith('TEST BUILD:'):
+ build = ','.join(banner[11:].strip().split(' '))
+ elif banner.startswith('TEST TOOLS:'):
+ tools = banner[11:].strip()
prefixed_output += [line[0] + ' ' + line[1]]
self.lock.acquire()
if name not in self.results:
@@ -134,9 +154,27 @@ class report(object):
self.lock.release()
raise error.general('test already finished: %s' % (name))
self.results[name]['end'] = datetime.datetime.now()
- if state is None:
+ if version:
+ if 'version' not in self.config:
+ self.config['version'] = version
+ else:
+ if version != self.config['version']:
+ state = 'WRONG-VERSION'
+ if build:
+ if 'build' not in self.config:
+ self.config['build'] = build
+ else:
+ if build != self.config['build']:
+ state = 'WRONG-BUILD'
+ if tools:
+ if 'tools' not in self.config:
+ self.config['tools'] = tools
+ else:
+ if tools != self.config['tools']:
+ state = 'WRONG-TOOLS'
+ if state is None or state == 'EXPECTED-PASS':
if start and end:
- if state is None:
+ if state is None or state == 'EXPECTED-PASS':
status = 'passed'
self.passed += 1
elif timeout:
@@ -175,6 +213,15 @@ class report(object):
elif state == 'BENCHMARK':
status = 'benchmark'
self.benchmark += 1
+ elif state == 'WRONG-VERSION':
+ status = 'wrong-version'
+ self.wrong_version += 1
+ elif state == 'WRONG-BUILD':
+ status = 'wrong-build'
+ self.wrong_build += 1
+ elif state == 'WRONG-TOOLS':
+ status = 'wrong-tools'
+ self.wrong_tools += 1
else:
raise error.general('invalid test state: %s: %s' % (name, state))
self.results[name]['result'] = status
@@ -185,6 +232,8 @@ class report(object):
return status
def log(self, name, mode):
+ status_fails = ['failed', 'timeout', 'invalid',
+ 'wrong-version', 'wrong-build', 'wrong-tools']
if mode != 'none':
self.lock.acquire()
if name not in self.results:
@@ -193,7 +242,7 @@ class report(object):
exe = path.basename(self.results[name]['exe'])
result = self.results[name]['result']
time = self.results[name]['end'] - self.results[name]['start']
- failed = result in ['failed', 'timeout', 'invalid']
+ failed = result in status_fails
result = 'Result: %-10s Time: %s %s' % (result, str(time), exe)
if mode != 'none':
header = self.results[name]['header']
@@ -208,12 +257,16 @@ class report(object):
log.output(result)
log.output(output)
+ def get_config(self, config, not_found = None):
+ if config in self.config:
+ return self.config[config]
+ return not_found
+
def score_card(self, mode = 'full'):
if mode == 'short':
- return 'Passed:%d Failed:%d Timeout:%d Invalid:%d' % (self.passed,
- self.failed,
- self.timeouts,
- self.invalids)
+ wrongs = self.wrong_version + self.wrong_build + self.wrong_tools
+ return 'Passed:%d Failed:%d Timeout:%d Invalid:%d Wrong:%d' % \
+ (self.passed, self.failed, self.timeouts, self.invalids, wrongs)
elif mode == 'full':
l = []
l += ['Passed: %*d' % (self.total_len, self.passed)]
@@ -224,6 +277,9 @@ class report(object):
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 += ['Wrong Version: %*d' % (self.total_len, self.wrong_version)]
+ l += ['Wrong Build: %*d' % (self.total_len, self.wrong_build)]
+ l += ['Wrong Tools: %*d' % (self.total_len, self.wrong_tools)]
l += ['---------------%s' % ('-' * self.total_len)]
l += ['Total: %*d' % (self.total_len, self.total)]
return os.linesep.join(l)
@@ -258,10 +314,18 @@ class report(object):
if self.invalids:
l += ['Invalid:']
l += show_state(self.results, 'invalid', self.name_max_len)
+ if self.wrong_version:
+ l += ['Wrong Version:']
+ l += show_state(self.results, 'wrong-version', self.name_max_len)
+ if self.wrong_build:
+ l += ['Wrong Build:']
+ l += show_state(self.results, 'wrong-build', self.name_max_len)
+ if self.wrong_tools:
+ l += ['Wrong Tools:']
+ l += show_state(self.results, 'wrong-tools', 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/run.py b/tester/rt/run.py
index bcd0697..cf8c4e5 100644
--- a/tester/rt/run.py
+++ b/tester/rt/run.py
@@ -143,9 +143,11 @@ def run(command_path = None):
executables = find_executables(opts.params())
if len(executables) != 1:
raise error.general('one executable required, found %d' % (len(executables)))
+ opts.defaults['test_disable_header'] = '1'
+ reports = report.report(1)
start_time = datetime.datetime.now()
opts.defaults['exe_trace'] = debug_trace
- tst = test(1, 1, None, executables[0], rtems_tools, bsp, bsp_config, opts)
+ tst = test(1, 1, reports, executables[0], rtems_tools, bsp, bsp_config, opts)
tst.run()
end_time = datetime.datetime.now()
total_time = 'Run time : %s' % (str(end_time - start_time))
diff --git a/tester/rt/test.py b/tester/rt/test.py
index 32ff56f..1a91763 100644
--- a/tester/rt/test.py
+++ b/tester/rt/test.py
@@ -351,15 +351,25 @@ def run(command_path = None):
if mail is not None and output is not None:
m_arch = opts.defaults.expand('%{arch}')
m_bsp = opts.defaults.expand('%{bsp}')
- subject = '[rtems-test] %s/%s: %s' % (m_arch,
- m_bsp,
- reports.score_card('short'))
+ build = ' %s:' % (reports.get_config('build', not_found = ''))
+ subject = '[rtems-test] %s/%s:%s %s' % (m_arch,
+ m_bsp,
+ build,
+ reports.score_card('short'))
+ np = 'Not present in test'
+ ver = reports.get_config('version', not_found = np)
+ build = reports.get_config('build', not_found = np)
+ tools = reports.get_config('tools', not_found = np)
body = [total_time, average_time,
'', 'Host', '====', host.label(mode = 'all'),
+ '', 'Configuration', '=============',
+ 'Version: %s' % (ver),
+ 'Build : %s' % (build),
+ 'Tools : %s' % (tools),
'', 'Summary', '=======', '',
reports.score_card(), '',
reports.failures(),
- '', 'Log', '===', ''] + output.get()
+ 'Log', '===', ''] + output.get()
mail.send(to_addr, subject, os.linesep.join(body))
except error.general as gerr:
More information about the vc
mailing list