[rtems-tools commit] tester: Clean up the coverage python code.

Chris Johns chrisj at rtems.org
Tue Jun 19 03:45:04 UTC 2018


Module:    rtems-tools
Branch:    master
Commit:    5195eb735abead4d047123c60887597fd438d6d5
Changeset: http://git.rtems.org/rtems-tools/commit/?id=5195eb735abead4d047123c60887597fd438d6d5

Author:    Chris Johns <chrisj at rtems.org>
Date:      Mon Jun 18 09:36:38 2018 +1000

tester: Clean up the coverage python code.

---

 tester/rt/coverage.py | 95 +++++++++++++++++++++++++++------------------------
 1 file changed, 50 insertions(+), 45 deletions(-)

diff --git a/tester/rt/coverage.py b/tester/rt/coverage.py
index 54933d5..093d516 100644
--- a/tester/rt/coverage.py
+++ b/tester/rt/coverage.py
@@ -28,16 +28,9 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 
-from rtemstoolkit import error
-from rtemstoolkit import path
-from rtemstoolkit import log
-from rtemstoolkit import execute
-from rtemstoolkit import macros
-
-from datetime import datetime
-
-from . import options
+from __future__ import print_function
 
+import datetime
 import shutil
 import os
 
@@ -46,6 +39,15 @@ try:
 except:
     import ConfigParser as configparser
 
+from rtemstoolkit import error
+from rtemstoolkit import path
+from rtemstoolkit import log
+from rtemstoolkit import execute
+from rtemstoolkit import macros
+
+
+from . import options
+
 class summary:
     def __init__(self, p_summary_dir):
         self.summary_file_path = path.join(p_summary_dir, 'summary.txt')
@@ -63,12 +65,11 @@ class summary:
         self.is_failure = False
 
     def parse(self):
-        if(not path.exists(self.summary_file_path)):
-            log.notice('summary file %s does not exist!' % (self.summary_file_path))
+        if not path.exists(self.summary_file_path):
+            log.output('coverage: summary file %s does not exist!' % (self.summary_file_path))
             self.is_failure = True
-            return
 
-        with open(self.summary_file_path,'r') as summary_file:
+        with open(self.summary_file_path, 'r') as summary_file:
            self.bytes_analyzed = self._get_next_with_colon(summary_file)
            self.bytes_not_executed = self._get_next_with_colon(summary_file)
            self.percentage_executed = self._get_next_with_colon(summary_file)
@@ -80,7 +81,7 @@ class summary:
            self.branches_never_taken = self._get_next_without_colon(summary_file)
         if len(self.branches_uncovered) > 0 and len(self.branches_total) > 0:
             self.percentage_branches_covered = \
-            1 - (float(self.branches_uncovered) / float(self.branches_total))
+                1.0 - (float(self.branches_uncovered) / float(self.branches_total))
         else:
             self.percentage_branches_covered = 0.0
         return
@@ -139,7 +140,7 @@ class report_gen_html:
         for symbol_set in partial_reports:
             table += self._row(symbol_set, partial_reports[symbol_set])
         table += "</table> </br>"
-        timestamp = "Analysis performed on " + datetime.now().ctime()
+        timestamp = "Analysis performed on " + datetime.datetime.now().ctime()
         return "<body>\n" + header + table + timestamp + "\n</body>"
 
     def _row(self, symbol_set, summary):
@@ -163,7 +164,8 @@ class report_gen_html:
             row += " <td>" + summary.branches_uncovered + "</td>"
             row += " <td>" + summary.branches_total + "</td>"
             row += " <td> {:.3%} </td>".format(summary.percentage_branches_covered)
-            row += ' <td><progress value="{:.3}" max="100"></progress></td>'.format(100*summary.percentage_branches_covered)
+            spbc = 100 * summary.percentage_branches_covered
+            row += ' <td><progress value="{:.3}" max="100"></progress></td>'.format(spbc)
             row += "</tr>\n"
         return row
 
@@ -190,8 +192,8 @@ class report_gen_html:
         return '<a href="' + address + '">' + text + '</a>'
 
     def _create_index_file(self, head_section, content):
-        with open(path.join(self.build_dir,
-                            self.bsp + "-report.html"),'w') as f:
+        name = path.join(self.build_dir, self.bsp + "-report.html")
+        with open(name, 'w') as f:
             f.write(head_section)
             f.write(content)
 
@@ -228,20 +230,23 @@ class build_path_generator(object):
         self.target = target
     def run(self):
         build_path = '/'
-        Path = self.executables[0].split('/')
-        for P in Path:
-            if P == self.target:
-                break;
+        path_ = self.executables[0].split('/')
+        for p in path_:
+            if p == self.target:
+                break
             else:
-                build_path = path.join(build_path, P)
+                build_path = path.join(build_path, p)
         return build_path
 
 class symbol_parser(object):
     '''
     Parse the symbol sets ini and create custom ini file for covoar
     '''
-    def __init__(self, symbol_config_path,
-                 symbol_select_path, coverage_arg, build_dir):
+    def __init__(self,
+                 symbol_config_path,
+                 symbol_select_path,
+                 coverage_arg,
+                 build_dir):
         self.symbol_select_file = symbol_select_path
         self.symbol_file = symbol_config_path
         self.build_dir = build_dir
@@ -257,10 +262,9 @@ class symbol_parser(object):
                 self.ssets = self.cov_arg.split(',')
             else:
                 self.ssets = config.get('symbol-sets', 'sets').split(',')
-                self.ssets = [ sset.encode('utf-8') for sset in self.ssets]
+                self.ssets = [sset.encode('utf-8') for sset in self.ssets]
             for sset in self.ssets:
-                lib = path.join(self.build_dir,
-                                config.get('libraries', sset))
+                lib = path.join(self.build_dir, config.get('libraries', sset))
                 self.symbol_sets[sset] = lib.encode('utf-8')
         except:
             raise error.general('Symbol set parsing failed')
@@ -277,7 +281,7 @@ class symbol_parser(object):
             with open(self.symbol_select_file, 'w') as conf:
                 config.write(conf)
         except:
-            raise error.general('write failed')
+            raise error.general('symbol parser write failed')
 
     def run(self):
         self.parse()
@@ -299,22 +303,23 @@ class covoar(object):
         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 was not created for covoar, skipping %s'% (symbol_file, set_name))
-        command = ('covoar -S ' + symbol_file
-                  + ' -O ' + covoar_result_dir
-                  + ' -E ' + self.explanations_txt
-                  + ' -p ' + self.project_name + ' ' + self.executables)
-        log.notice('Running covoar for %s' % (set_name))
-        print( 'covoar results directory:\n' + covoar_result_dir )
+            raise error.general('symbol set file: coverage %s not created, skipping %s'% (symbol_file, set_name))
+        command = 'covoar -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)
         exit_code = executor.shell(command, cwd=os.getcwd())
-        if (exit_code[0] != 0):
-            raise error.general('covoar failure exit code: %d' % (exit_code[0]))
-        log.notice('Coverage run for %s finished successfully.' % (set_name))
-        log.notice('-----------------------------------------------')
+        if exit_code[0] != 0:
+            raise error.general('coverage: covoar failure:: %d' % (exit_code[0]))
+        end_time = datetime.datetime.now()
+        log.notice('Coverage time: %s' % (str(end_time - start_time)))
 
     def output_handler(self, text):
-        log.notice('%s' % (text))
+        log.output('%s' % (text))
 
 class coverage_run(object):
     '''
@@ -328,7 +333,7 @@ class coverage_run(object):
         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')
-        if (not path.exists(self.test_dir)):
+        if not path.exists(self.test_dir):
             path.mkdir(self.test_dir)
         self.rtdir = path.abspath(self.macros['_rtdir'])
         self.rtscripts = self.macros.expand(self.macros['_rtscripts'])
@@ -363,7 +368,7 @@ class coverage_run(object):
             self._cleanup();
 
     def _generate_reports(self):
-        log.notice('Generating reports')
+        log.notice('Coverage generating reports')
         if self.report_format == 'html':
             report = report_gen_html(self.symbol_sets,
                                      self.build_dir,
@@ -374,7 +379,7 @@ class coverage_run(object):
 
     def _cleanup(self):
         if not self.no_clean:
-            log.notice('***Cleaning tempfiles***')
+            log.output('Coverage cleaning tempfiles')
             for exe in self.executables:
                 trace_file = exe + '.cov'
                 if path.exists(trace_file):
@@ -382,4 +387,4 @@ class coverage_run(object):
             os.remove(self.symbol_select_path)
 
     def _summarize(self):
-        log.notice('Coverage analysis finished. You can find results in %s' % (self.build_dir))
+        log.notice('Coverage analysis finished: %s' % (self.build_dir))




More information about the vc mailing list