summaryrefslogtreecommitdiff
path: root/tester
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-05-31 20:03:05 +1000
committerChris Johns <chrisj@rtems.org>2014-05-31 20:03:05 +1000
commitc04a84917a82caa06b8efc4f24d3b60ed8f05d78 (patch)
treebe2073222f07b90c80216fdb105f02fb1fdc5c0d /tester
parent5cdcde1ec2ccfa9dd88fadf55bbd18a220f2567f (diff)
tester: Correctly handle contro-c.
Add support to kill running tests if the user presses control-c.
Diffstat (limited to 'tester')
-rw-r--r--tester/rt/bsps.py41
-rw-r--r--tester/rt/config.py9
-rw-r--r--tester/rt/test.py42
3 files changed, 75 insertions, 17 deletions
diff --git a/tester/rt/bsps.py b/tester/rt/bsps.py
new file mode 100644
index 0000000..91f5f62
--- /dev/null
+++ b/tester/rt/bsps.py
@@ -0,0 +1,41 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2013-2014 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from rtemstoolkit import error
+from rtemstoolkit import log
+from rtemstoolkit import path
+
+def list(opts):
+ path_ = opts.defaults.expand('%%{_configdir}/bsps/*.mc')
+ bsps = path.collect_files(path_)
+ log.notice(' BSP List:')
+ for bsp in bsps:
+ log.notice(' %s' % (path.basename(bsp[:-3])))
+ raise error.exit()
diff --git a/tester/rt/config.py b/tester/rt/config.py
index 7bfb157..d431093 100644
--- a/tester/rt/config.py
+++ b/tester/rt/config.py
@@ -62,7 +62,7 @@ class file(config.file):
self.console = None
self.output = None
self.report = report
- self.load(name)
+ self.name = name
def __del__(self):
if self.console:
@@ -181,6 +181,9 @@ class file(config.file):
for l in text:
print ' '.join(l)
+ def run(self):
+ self.load(self.name)
+
def capture(self, text):
text = [(']', l) for l in text.replace(chr(13), '').splitlines()]
self._lock()
@@ -203,3 +206,7 @@ class file(config.file):
if flag in dt.split(','):
return True
return False
+
+ def kill(self):
+ if self.process:
+ self.process.kill()
diff --git a/tester/rt/test.py b/tester/rt/test.py
index c667479..b0981b4 100644
--- a/tester/rt/test.py
+++ b/tester/rt/test.py
@@ -38,7 +38,9 @@ import time
from rtemstoolkit import error
from rtemstoolkit import log
from rtemstoolkit import path
+from rtemstoolkit import stacktraces
+import bsps
import config
import console
import options
@@ -46,17 +48,6 @@ import report
import version
import fnmatch
-def stacktraces():
- import traceback
- code = []
- for threadId, stack in sys._current_frames().items():
- code.append("\n# thread-id: %s" % threadId)
- for filename, lineno, name, line in traceback.extract_stack(stack):
- code.append('file: "%s", line %d, in %s' % (filename, lineno, name))
- if line:
- code.append(" %s" % (line.strip()))
- return '\n'.join(code)
-
class test(object):
def __init__(self, index, total, report, executable, rtems_tools, bsp, bsp_config, opts):
self.index = index
@@ -78,7 +69,15 @@ class test(object):
if not path.isdir(rtems_tools_bin):
raise error.general('cannot find RTEMS tools path: %s' % (rtems_tools_bin))
self.opts.defaults['rtems_tools'] = rtems_tools_bin
- self.config = config.file(report, bsp_config, self.opts)
+ self.config = config.file(self.report, self.bsp_config, self.opts)
+
+ def run(self):
+ if self.config:
+ self.config.run()
+
+ def kill(self):
+ if self.config:
+ self.config.kill()
class test_run(object):
def __init__(self, index, total, report, executable, rtems_tools, bsp, bsp_config, opts):
@@ -102,6 +101,7 @@ class test_run(object):
self.executable, self.rtems_tools,
self.bsp, self.bsp_config,
self.opts)
+ self.test.run()
except KeyboardInterrupt:
pass
except:
@@ -120,6 +120,10 @@ class test_run(object):
if self.result is not None:
raise self.result[0], self.result[1], self.result[2]
+ def kill(self):
+ if self.test:
+ self.test.kill()
+
def find_executables(paths, glob):
executables = []
for p in paths:
@@ -175,8 +179,13 @@ def list_bsps(opts):
log.notice(' %s' % (path.basename(bsp[:-3])))
raise error.exit()
+def killall(tests):
+ for test in tests:
+ test.kill()
+
def run(command_path = None):
import sys
+ tests = []
stdtty = console.save()
opts = None
default_exefilter = '*.exe'
@@ -194,7 +203,7 @@ def run(command_path = None):
command_path = command_path)
log.notice('RTEMS Testing - Tester, v%s' % (version.str()))
if opts.find_arg('--list-bsps'):
- list_bsps(opts)
+ bsps.list(opts)
exe_filter = opts.find_arg('--filter')
if exe_filter:
exe_filter = exe_filter[1]
@@ -246,7 +255,6 @@ def run(command_path = None):
reporting = 1
jobs = int(opts.jobs(opts.defaults['_ncpus']))
exe = 0
- tests = []
finished = []
if jobs > len(executables):
jobs = len(executables)
@@ -288,7 +296,8 @@ def run(command_path = None):
report_finished(reports, report_mode, -1, finished, job_trace)
reports.summary()
end_time = datetime.datetime.now()
- log.notice('Testing time: %s' % (str(end_time - start_time)))
+ log.notice('Average test time: %s' % (str((end_time - start_time) / total)))
+ log.notice('Testing time : %s' % (str(end_time - start_time)))
except error.general, gerr:
print gerr
sys.exit(1)
@@ -302,8 +311,9 @@ def run(command_path = None):
print '}} dumping:', threading.active_count()
for t in threading.enumerate():
print '}} ', t.name
- print stacktraces()
+ print stacktraces.trace()
log.notice('abort: user terminated')
+ killall(tests)
sys.exit(1)
finally:
console.restore(stdtty)