diff options
-rw-r--r-- | tester/rt/coverage.py | 50 | ||||
-rw-r--r-- | tester/rt/test.py | 15 |
2 files changed, 43 insertions, 22 deletions
diff --git a/tester/rt/coverage.py b/tester/rt/coverage.py index 093d516..31ad4d1 100644 --- a/tester/rt/coverage.py +++ b/tester/rt/coverage.py @@ -33,6 +33,7 @@ from __future__ import print_function import datetime import shutil import os +import sys try: import configparser @@ -245,21 +246,21 @@ class symbol_parser(object): def __init__(self, symbol_config_path, symbol_select_path, - coverage_arg, + symbol_set, build_dir): self.symbol_select_file = symbol_select_path self.symbol_file = symbol_config_path self.build_dir = build_dir self.symbol_sets = {} - self.cov_arg = coverage_arg + self.symbol_set = symbol_set self.ssets = [] def parse(self): config = configparser.ConfigParser() try: config.read(self.symbol_file) - if self.cov_arg: - self.ssets = self.cov_arg.split(',') + if self.symbol_set is not None: + self.ssets = self.symbol_set.split(',') else: self.ssets = config.get('symbol-sets', 'sets').split(',') self.ssets = [sset.encode('utf-8') for sset in self.ssets] @@ -291,27 +292,41 @@ class covoar(object): ''' Covoar runner ''' - def __init__(self, base_result_dir, config_dir, executables, explanations_txt): + def __init__(self, base_result_dir, config_dir, executables, explanations_txt, trace): self.base_result_dir = base_result_dir self.config_dir = config_dir self.executables = ' '.join(executables) self.explanations_txt = explanations_txt self.project_name = 'RTEMS-5' + self.trace = trace + + def _find_covoar(self): + covoar_exe = 'covoar' + tester_dir = path.dirname(path.abspath(sys.argv[0])) + base = path.dirname(tester_dir) + exe = path.join(base, 'bin', covoar_exe) + if path.isfile(exe): + return exe + exe = path.join(base, 'build', 'tester', 'covoar', covoar_exe) + if path.isfile(exe): + return exe + raise error.general('coverage: %s not found'% (covoar_exe)) def run(self, set_name, symbol_file): covoar_result_dir = path.join(self.base_result_dir, set_name) - if (not path.exists(covoar_result_dir)): + if not path.exists(covoar_result_dir): path.mkdir(covoar_result_dir) - if (not path.exists(symbol_file)): - raise error.general('symbol set file: coverage %s not created, skipping %s'% (symbol_file, set_name)) - command = 'covoar -S ' + symbol_file + \ + if not path.exists(symbol_file): + raise error.general('coverage: no symbol set file: %s'% (symbol_file)) + exe = self._find_covoar() + command = exe + ' -S ' + symbol_file + \ ' -O ' + covoar_result_dir + \ ' -E ' + self.explanations_txt + \ ' -p ' + self.project_name + ' ' + self.executables log.notice() log.notice('Running coverage analysis: %s (%s)' % (set_name, covoar_result_dir)) start_time = datetime.datetime.now() - executor = execute.execute(verbose = True, output = self.output_handler) + executor = execute.execute(verbose = self.trace, output = self.output_handler) exit_code = executor.shell(command, cwd=os.getcwd()) if exit_code[0] != 0: raise error.general('coverage: covoar failure:: %d' % (exit_code[0])) @@ -325,11 +340,12 @@ class coverage_run(object): ''' Coverage analysis support for rtems-test ''' - def __init__(self, p_macros, coverage_arg, executables): + def __init__(self, macros_, executables, symbol_set = None, trace = False): ''' Constructor ''' - self.macros = p_macros + self.trace = trace + self.macros = macros_ self.build_dir = self.macros['_cwd'] self.explanations_txt = self.macros.expand(self.macros['cov_explanations']) self.test_dir = path.join(self.build_dir, self.macros['bsp'] + '-coverage') @@ -346,7 +362,7 @@ class coverage_run(object): self.symbol_sets = [] self.no_clean = int(self.macros['_no_clean']) self.report_format = self.macros['cov_report_format'] - self.coverage_arg = coverage_arg + self.symbol_set = symbol_set self.target = self.macros['target'] def run(self): @@ -356,11 +372,12 @@ class coverage_run(object): build_dir = build_path_generator(self.executables, self.target).run() parser = symbol_parser(self.symbol_config_path, self.symbol_select_path, - self.coverage_arg, + self.symbol_set, build_dir) parser.run() covoar_runner = covoar(self.test_dir, self.symbol_select_path, - self.executables, self.explanations_txt) + self.executables, self.explanations_txt, + self.trace) covoar_runner.run('score', self.symbol_select_path) self._generate_reports(); self._summarize(); @@ -379,7 +396,8 @@ class coverage_run(object): def _cleanup(self): if not self.no_clean: - log.output('Coverage cleaning tempfiles') + if self.trace: + log.output('Coverage cleaning tempfiles') for exe in self.executables: trace_file = exe + '.cov' if path.exists(trace_file): diff --git a/tester/rt/test.py b/tester/rt/test.py index 0e744cd..9214ad6 100644 --- a/tester/rt/test.py +++ b/tester/rt/test.py @@ -228,7 +228,7 @@ def run(command_path = None): '--user-config': 'Path to your local user configuration INI file', '--report-mode': 'Reporting modes, failures (default),all,none', '--list-bsps': 'List the supported BSPs', - '--debug-trace': 'Debug trace based on specific flags', + '--debug-trace': 'Debug trace based on specific flags (console,gdb,output,cov)', '--filter': 'Glob that executables must match to run (default: ' + default_exefilter + ')', '--stacktrace': 'Dump a stack trace on a user termination (^C)', @@ -266,7 +266,7 @@ def run(command_path = None): if len(debug_trace) != 1: debug_trace = debug_trace[1] else: - raise error.general('no debug flags, can be: console,gdb,output') + raise error.general('no debug flags, can be: console,gdb,output,cov') else: debug_trace = '' opts.defaults['exe_trace'] = debug_trace @@ -285,13 +285,16 @@ def run(command_path = None): bsp_config = opts.defaults.expand(opts.defaults['tester']) coverage_enabled = opts.find_arg('--coverage') if coverage_enabled: + cov_trace = 'cov' in debug_trace.split(',') if len(coverage_enabled) == 2: coverage_runner = coverage.coverage_run(opts.defaults, - coverage_enabled[1], - executables) + executables, + symbol_set = coverage_enabled[1], + trace = cov_trace) else: - coverage_runner = coverage.coverage_run(opts.defaults, 0, - executables) + coverage_runner = coverage.coverage_run(opts.defaults, + executables, + trace = cov_trace) report_mode = opts.find_arg('--report-mode') if report_mode: if report_mode[1] != 'failures' and \ |