Commit ff1fd6ccde3d166213d1277fa6b6b9685d45044f
1 parent
c640ed0ce6
Exists in
smarc_8mq_lf_v2020.04
and in
11 other branches
binman: Move coverage logic into a new test_util file
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>
Showing 2 changed files with 68 additions and 25 deletions Side-by-side Diff
tools/binman/binman.py
... | ... | @@ -26,6 +26,7 @@ |
26 | 26 | import cmdline |
27 | 27 | import command |
28 | 28 | import control |
29 | +import test_util | |
29 | 30 | |
30 | 31 | def RunTests(debug, args): |
31 | 32 | """Run the functional tests and any embedded doctests |
32 | 33 | |
... | ... | @@ -78,34 +79,12 @@ |
78 | 79 | |
79 | 80 | def RunTestCoverage(): |
80 | 81 | """Run the tests and check that we get 100% coverage""" |
81 | - # This uses the build output from sandbox_spl to get _libfdt.so | |
82 | - cmd = ('PYTHONPATH=$PYTHONPATH:%s/sandbox_spl/tools python-coverage run ' | |
83 | - '--include "tools/binman/*.py" --omit "*test*,*binman.py" ' | |
84 | - 'tools/binman/binman.py -t' % options.build_dir) | |
85 | - os.system(cmd) | |
86 | - stdout = command.Output('python-coverage', 'report') | |
87 | - lines = stdout.splitlines() | |
88 | - | |
89 | - test_set= set([os.path.basename(line.split()[0]) | |
90 | - for line in lines if '/etype/' in line]) | |
91 | 82 | glob_list = glob.glob(os.path.join(our_path, 'etype/*.py')) |
92 | 83 | all_set = set([os.path.splitext(os.path.basename(item))[0] |
93 | 84 | for item in glob_list if '_testing' not in item]) |
94 | - missing_list = all_set | |
95 | - missing_list.difference_update(test_set) | |
96 | - coverage = lines[-1].split(' ')[-1] | |
97 | - ok = True | |
98 | - if missing_list: | |
99 | - print 'Missing tests for %s' % (', '.join(missing_list)) | |
100 | - print stdout | |
101 | - ok = False | |
102 | - if coverage != '100%': | |
103 | - print stdout | |
104 | - print "Type 'coverage html' to get a report in htmlcov/index.html" | |
105 | - print 'Coverage error: %s, but should be 100%%' % coverage | |
106 | - ok = False | |
107 | - if not ok: | |
108 | - raise ValueError('Test coverage failure') | |
85 | + test_util.RunTestCoverage('tools/binman/binman.py', None, | |
86 | + ['*test*', '*binman.py', 'tools/patman/*', 'tools/dtoc/*'], | |
87 | + options.build_dir, all_set) | |
109 | 88 | |
110 | 89 | def RunBinman(options, args): |
111 | 90 | """Main entry point to binman once arguments are parsed |
tools/patman/test_util.py
1 | +# SPDX-License-Identifier: GPL-2.0+ | |
2 | +# | |
3 | +# Copyright (c) 2016 Google, Inc | |
4 | +# | |
5 | + | |
6 | +import glob | |
7 | +import os | |
8 | +import sys | |
9 | + | |
10 | +import command | |
11 | + | |
12 | +def RunTestCoverage(prog, filter_fname, exclude_list, build_dir, required=None): | |
13 | + """Run tests and check that we get 100% coverage | |
14 | + | |
15 | + Args: | |
16 | + prog: Program to run (with be passed a '-t' argument to run tests | |
17 | + filter_fname: Normally all *.py files in the program's directory will | |
18 | + be included. If this is not None, then it is used to filter the | |
19 | + list so that only filenames that don't contain filter_fname are | |
20 | + included. | |
21 | + exclude_list: List of file patterns to exclude from the coverage | |
22 | + calculation | |
23 | + build_dir: Build directory, used to locate libfdt.py | |
24 | + required: List of modules which must be in the coverage report | |
25 | + | |
26 | + Raises: | |
27 | + ValueError if the code coverage is not 100% | |
28 | + """ | |
29 | + # This uses the build output from sandbox_spl to get _libfdt.so | |
30 | + path = os.path.dirname(prog) | |
31 | + if filter_fname: | |
32 | + glob_list = glob.glob(os.path.join(path, '*.py')) | |
33 | + glob_list = [fname for fname in glob_list if filter_fname in fname] | |
34 | + else: | |
35 | + glob_list = [] | |
36 | + glob_list += exclude_list | |
37 | + glob_list += ['*libfdt.py', '*site-packages*'] | |
38 | + cmd = ('PYTHONPATH=$PYTHONPATH:%s/sandbox_spl/tools python-coverage run ' | |
39 | + '--omit "%s" %s -t' % (build_dir, ','.join(glob_list), prog)) | |
40 | + os.system(cmd) | |
41 | + stdout = command.Output('python-coverage', 'report') | |
42 | + lines = stdout.splitlines() | |
43 | + if required: | |
44 | + # Convert '/path/to/name.py' just the module name 'name' | |
45 | + test_set = set([os.path.splitext(os.path.basename(line.split()[0]))[0] | |
46 | + for line in lines if '/etype/' in line]) | |
47 | + missing_list = required | |
48 | + missing_list.difference_update(test_set) | |
49 | + if missing_list: | |
50 | + print 'Missing tests for %s' % (', '.join(missing_list)) | |
51 | + print stdout | |
52 | + ok = False | |
53 | + | |
54 | + coverage = lines[-1].split(' ')[-1] | |
55 | + ok = True | |
56 | + print coverage | |
57 | + if coverage != '100%': | |
58 | + print stdout | |
59 | + print ("Type 'python-coverage html' to get a report in " | |
60 | + 'htmlcov/index.html') | |
61 | + print 'Coverage error: %s, but should be 100%%' % coverage | |
62 | + ok = False | |
63 | + if not ok: | |
64 | + raise ValueError('Test coverage failure') |