Changeset 5251361 in rtems-tools


Ignore:
Timestamp:
Oct 23, 2017, 4:22:34 AM (2 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
bf58911
Parents:
7051ba5
Message:

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.

Location:
tester
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • tester/rt/config.py

    r7051ba5 r5251361  
    116116        return regex
    117117
    118     def _target_command(self, command, bsp_arch = None, bsp = None, exe = None):
     118    def _target_command(self, command, bsp_arch = None, bsp = None, exe = None, fexe = None):
    119119        if self.defined('target_%s_command' % (command)):
    120120            cmd = self.expand('%%{target_%s_command}' % (command)).strip()
     
    125125            if exe is not None and '@EXE@' in cmd:
    126126                cmd = cmd.replace('@EXE@', exe)
     127            if fexe is not None and '@FEXE@' in cmd:
     128                cmd = cmd.replace('@FEXE@', exe)
    127129            if len(cmd) > 0:
    128130                rs_proc = execute.capture_execution()
    129131                ec, proc, output = rs_proc.open(cmd, shell = True)
    130                 self._capture_console('target %s: %s: %s' % (command, cmd, output))
     132                self._capture_console('target %s: %s' % (command, cmd))
     133                if len(output) > 0:
     134                    output = os.linesep.join([' ' + l for l in output.splitlines()])
     135                    self._capture_console(output)
     136
     137    def _target_exe_filter(self, exe):
     138        if self.defined('target_exe_filter_command'):
     139            f = self.expand('%{target_exe_filter_command}').strip()
     140            # Be like sed and use the first character as the delmiter.
     141            if len(f) > 0:
     142                delimiter = f[0]
     143                pat = ''
     144                repl = ''
     145                repl_not_pat = False
     146                esc = False
     147                for c in f[1:]:
     148                    add = True
     149                    if not esc and c == '\\':
     150                        esc = True
     151                        add = False
     152                    elif esc:
     153                        if c == delimiter:
     154                            c = delimiter
     155                        else:
     156                            c = '\\' + c
     157                            esc = False
     158                    elif c == delimiter:
     159                        if repl_not_pat:
     160                            exe = re.sub(r'%s' % (pat), repl, exe)
     161                            self._capture_console('target exe filter: find:%s subst:%s -> %s' % \
     162                                                  (pat, repl, exe))
     163                            return exe
     164                        repl_not_pat = True
     165                        add = False
     166                    if add:
     167                        if repl_not_pat:
     168                            repl += c
     169                        else:
     170                            pat += c
     171                raise error.general('invalid exe filter: %s' % (f))
    131172
    132173    def _output_length(self):
     
    218259            if self.console:
    219260                self.console.open()
    220             self.process.open(executable = data[0],
     261            self.process.open(executable = exe,
    221262                              port = port,
    222263                              output_length = self._output_length,
     
    249290                    bsp_arch = self.expand('%{bsp_arch}')
    250291                    bsp = self.expand('%{bsp}')
    251                     self.report.start(index, total, exe, exe, bsp_arch, bsp)
     292                    fexe = self._target_exe_filter(exe)
     293                    self.report.start(index, total, exe, fexe, bsp_arch, bsp)
    252294                    if self.index == 1:
    253                         self._target_command('on', bsp_arch, bsp, exe)
    254                     self._target_command('pretest', bsp_arch, bsp, exe)
     295                        self._target_command('on', bsp_arch, bsp, exe, fexe)
     296                    self._target_command('pretest', bsp_arch, bsp, exe, fexe)
    255297                finally:
    256298                    self._unlock()
    257299                if _directive == '%execute':
    258                     self._dir_execute(ds, total, index, exe, bsp_arch, bsp)
     300                    self._dir_execute(ds, total, index, fexe, bsp_arch, bsp)
    259301                elif _directive == '%gdb':
    260                     self._dir_gdb(ds, total, index, exe, bsp_arch, bsp)
     302                    self._dir_gdb(ds, total, index, fexe, bsp_arch, bsp)
    261303                elif _directive == '%tftp':
    262                     self._dir_tftp(ds, total, index, exe, bsp_arch, bsp)
     304                    self._dir_tftp(ds, total, index, fexe, bsp_arch, bsp)
    263305                else:
    264306                    raise error.general(self._name_line_msg('invalid directive'))
    265307                self._lock()
    266308                if self.index == self.total:
    267                     self._target_command('off', bsp_arch, bsp, exe)
    268                 self._target_command('posttest', bsp_arch, bsp, exe)
     309                    self._target_command('off', bsp_arch, bsp, exe, fexe)
     310                self._target_command('posttest', bsp_arch, bsp, exe, fexe)
    269311                try:
    270312                    status = self.report.end(exe, self.output)
     
    272314                    if status == 'timeout':
    273315                        if self.index == self.total:
    274                             self._target_command('off', bsp_arch, bsp, exe)
     316                            self._target_command('off', bsp_arch, bsp, exe, fexe)
    275317                        else:
    276                             self._target_command('reset', bsp_arch, bsp, exe)
     318                            self._target_command('reset', bsp_arch, bsp, exe, fexe)
    277319                    self.process = None
    278320                    self.output = None
  • tester/rt/report.py

    r7051ba5 r5251361  
    9191                  bsp_arch,
    9292                  bsp,
    93                   path.basename(executable))
     93                  path.basename(name))
    9494        self.lock.acquire()
    9595        if name in self.results:
  • tester/rtems/testing/bsps/xilinx_zynq_zedboard.mc

    r7051ba5 r5251361  
    5454xilinx_zynq_zedboard_arch: none,    none,   'arm'
    5555test_restarts:             none,    none,   '3'
     56target_pretest_command:    none,    none,   'rtems-zynq-mkimg @EXE@'
     57target_exe_filter_command: none,    none,   '/\.exe/.exe.img/'
    5658target_on_command:         none,    none,   'wemo-reset CSEng1 0 && sleep 4 && wemo-reset CSEng1 -1'
    5759target_off_command:        none,    none,   'wemo-reset CSEng1 0'
Note: See TracChangeset for help on using the changeset viewer.