At present only binman has the logic for determining Python test coverage but this is useful for other tools also. Move it out into a separate file so it can be used by other tools. Signed-off-by: Simon Glass <sjg@chromium.org>lime2-spi
parent
c640ed0ce6
commit
ff1fd6ccde
@ -0,0 +1,64 @@ |
||||
# SPDX-License-Identifier: GPL-2.0+ |
||||
# |
||||
# Copyright (c) 2016 Google, Inc |
||||
# |
||||
|
||||
import glob |
||||
import os |
||||
import sys |
||||
|
||||
import command |
||||
|
||||
def RunTestCoverage(prog, filter_fname, exclude_list, build_dir, required=None): |
||||
"""Run tests and check that we get 100% coverage |
||||
|
||||
Args: |
||||
prog: Program to run (with be passed a '-t' argument to run tests |
||||
filter_fname: Normally all *.py files in the program's directory will |
||||
be included. If this is not None, then it is used to filter the |
||||
list so that only filenames that don't contain filter_fname are |
||||
included. |
||||
exclude_list: List of file patterns to exclude from the coverage |
||||
calculation |
||||
build_dir: Build directory, used to locate libfdt.py |
||||
required: List of modules which must be in the coverage report |
||||
|
||||
Raises: |
||||
ValueError if the code coverage is not 100% |
||||
""" |
||||
# This uses the build output from sandbox_spl to get _libfdt.so |
||||
path = os.path.dirname(prog) |
||||
if filter_fname: |
||||
glob_list = glob.glob(os.path.join(path, '*.py')) |
||||
glob_list = [fname for fname in glob_list if filter_fname in fname] |
||||
else: |
||||
glob_list = [] |
||||
glob_list += exclude_list |
||||
glob_list += ['*libfdt.py', '*site-packages*'] |
||||
cmd = ('PYTHONPATH=$PYTHONPATH:%s/sandbox_spl/tools python-coverage run ' |
||||
'--omit "%s" %s -t' % (build_dir, ','.join(glob_list), prog)) |
||||
os.system(cmd) |
||||
stdout = command.Output('python-coverage', 'report') |
||||
lines = stdout.splitlines() |
||||
if required: |
||||
# Convert '/path/to/name.py' just the module name 'name' |
||||
test_set = set([os.path.splitext(os.path.basename(line.split()[0]))[0] |
||||
for line in lines if '/etype/' in line]) |
||||
missing_list = required |
||||
missing_list.difference_update(test_set) |
||||
if missing_list: |
||||
print 'Missing tests for %s' % (', '.join(missing_list)) |
||||
print stdout |
||||
ok = False |
||||
|
||||
coverage = lines[-1].split(' ')[-1] |
||||
ok = True |
||||
print coverage |
||||
if coverage != '100%': |
||||
print stdout |
||||
print ("Type 'python-coverage html' to get a report in " |
||||
'htmlcov/index.html') |
||||
print 'Coverage error: %s, but should be 100%%' % coverage |
||||
ok = False |
||||
if not ok: |
||||
raise ValueError('Test coverage failure') |
Loading…
Reference in new issue