[rtems-tools commit] tester: Add an executable file name filter.
Chris Johns
chrisj at rtems.org
Mon Oct 23 04:28:01 UTC 2017
Module: rtems-tools
Branch: master
Commit: 52513610668b02c2c3991c75946aa3ed2995e206
Changeset: http://git.rtems.org/rtems-tools/commit/?id=52513610668b02c2c3991c75946aa3ed2995e206
Author: Chris Johns <chrisj at rtems.org>
Date: Mon Oct 23 15:22:34 2017 +1100
tester: Add an executable file name filter.
The exe filter lets a BSP change the executable file to something
that can be downloaded to the target. For example U-Boot requires the image
format. The tester can now be configured to on-demand generate a specific
image for the target as the tester runs.
---
tester/rt/config.py | 68 ++++++++++++++++++-----
tester/rt/report.py | 2 +-
tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc | 2 +
3 files changed, 58 insertions(+), 14 deletions(-)
diff --git a/tester/rt/config.py b/tester/rt/config.py
index ea214c3..80defdd 100644
--- a/tester/rt/config.py
+++ b/tester/rt/config.py
@@ -115,7 +115,7 @@ class file(config.file):
raise error.general(msg)
return regex
- def _target_command(self, command, bsp_arch = None, bsp = None, exe = None):
+ def _target_command(self, command, bsp_arch = None, bsp = None, exe = None, fexe = None):
if self.defined('target_%s_command' % (command)):
cmd = self.expand('%%{target_%s_command}' % (command)).strip()
if bsp_arch is not None and '@ARCH@' in cmd:
@@ -124,10 +124,51 @@ class file(config.file):
cmd = cmd.replace('@BSP@', bsp)
if exe is not None and '@EXE@' in cmd:
cmd = cmd.replace('@EXE@', exe)
+ if fexe is not None and '@FEXE@' in cmd:
+ cmd = cmd.replace('@FEXE@', exe)
if len(cmd) > 0:
rs_proc = execute.capture_execution()
ec, proc, output = rs_proc.open(cmd, shell = True)
- self._capture_console('target %s: %s: %s' % (command, cmd, output))
+ self._capture_console('target %s: %s' % (command, cmd))
+ if len(output) > 0:
+ output = os.linesep.join([' ' + l for l in output.splitlines()])
+ self._capture_console(output)
+
+ def _target_exe_filter(self, exe):
+ if self.defined('target_exe_filter_command'):
+ f = self.expand('%{target_exe_filter_command}').strip()
+ # Be like sed and use the first character as the delmiter.
+ if len(f) > 0:
+ delimiter = f[0]
+ pat = ''
+ repl = ''
+ repl_not_pat = False
+ esc = False
+ for c in f[1:]:
+ add = True
+ if not esc and c == '\\':
+ esc = True
+ add = False
+ elif esc:
+ if c == delimiter:
+ c = delimiter
+ else:
+ c = '\\' + c
+ esc = False
+ elif c == delimiter:
+ if repl_not_pat:
+ exe = re.sub(r'%s' % (pat), repl, exe)
+ self._capture_console('target exe filter: find:%s subst:%s -> %s' % \
+ (pat, repl, exe))
+ return exe
+ repl_not_pat = True
+ add = False
+ if add:
+ if repl_not_pat:
+ repl += c
+ else:
+ pat += c
+ raise error.general('invalid exe filter: %s' % (f))
def _output_length(self):
self._lock()
@@ -217,7 +258,7 @@ class file(config.file):
if not self.in_error:
if self.console:
self.console.open()
- self.process.open(executable = data[0],
+ self.process.open(executable = exe,
port = port,
output_length = self._output_length,
console = self.capture_console,
@@ -248,32 +289,33 @@ class file(config.file):
exe = self.expand('%{test_executable}')
bsp_arch = self.expand('%{bsp_arch}')
bsp = self.expand('%{bsp}')
- self.report.start(index, total, exe, exe, bsp_arch, bsp)
+ fexe = self._target_exe_filter(exe)
+ self.report.start(index, total, exe, fexe, bsp_arch, bsp)
if self.index == 1:
- self._target_command('on', bsp_arch, bsp, exe)
- self._target_command('pretest', bsp_arch, bsp, exe)
+ self._target_command('on', bsp_arch, bsp, exe, fexe)
+ self._target_command('pretest', bsp_arch, bsp, exe, fexe)
finally:
self._unlock()
if _directive == '%execute':
- self._dir_execute(ds, total, index, exe, bsp_arch, bsp)
+ self._dir_execute(ds, total, index, fexe, bsp_arch, bsp)
elif _directive == '%gdb':
- self._dir_gdb(ds, total, index, exe, bsp_arch, bsp)
+ self._dir_gdb(ds, total, index, fexe, bsp_arch, bsp)
elif _directive == '%tftp':
- self._dir_tftp(ds, total, index, exe, bsp_arch, bsp)
+ self._dir_tftp(ds, total, index, fexe, bsp_arch, bsp)
else:
raise error.general(self._name_line_msg('invalid directive'))
self._lock()
if self.index == self.total:
- self._target_command('off', bsp_arch, bsp, exe)
- self._target_command('posttest', bsp_arch, bsp, exe)
+ self._target_command('off', bsp_arch, bsp, exe, fexe)
+ self._target_command('posttest', bsp_arch, bsp, exe, fexe)
try:
status = self.report.end(exe, self.output)
self._capture_console('test result: %s' % (status))
if status == 'timeout':
if self.index == self.total:
- self._target_command('off', bsp_arch, bsp, exe)
+ self._target_command('off', bsp_arch, bsp, exe, fexe)
else:
- self._target_command('reset', bsp_arch, bsp, exe)
+ self._target_command('reset', bsp_arch, bsp, exe, fexe)
self.process = None
self.output = None
finally:
diff --git a/tester/rt/report.py b/tester/rt/report.py
index b4a124e..03a2a47 100644
--- a/tester/rt/report.py
+++ b/tester/rt/report.py
@@ -90,7 +90,7 @@ class report(object):
len(str(total)), self.invalids,
bsp_arch,
bsp,
- path.basename(executable))
+ path.basename(name))
self.lock.acquire()
if name in self.results:
self.lock.release()
diff --git a/tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc b/tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc
index cf5830c..af10810 100644
--- a/tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc
+++ b/tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc
@@ -53,6 +53,8 @@ jobs: none, none, '1'
xilinx_zynq_zedboard: none, none, '%{_rtscripts}/tftp.cfg'
xilinx_zynq_zedboard_arch: none, none, 'arm'
test_restarts: none, none, '3'
+target_pretest_command: none, none, 'rtems-zynq-mkimg @EXE@'
+target_exe_filter_command: none, none, '/\.exe/.exe.img/'
target_on_command: none, none, 'wemo-reset CSEng1 0 && sleep 4 && wemo-reset CSEng1 -1'
target_off_command: none, none, 'wemo-reset CSEng1 0'
target_reset_command: none, none, 'wemo-reset CSEng1 3'
More information about the vc
mailing list