rustls/admin/coverage

88 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
import os
import glob
import subprocess
LLVM_PATH = glob.glob('/usr/lib/llvm-3.*/lib/clang/3.*.[0-9]/lib/linux/')[0]
COVERAGE_OPTIONS = '-Ccodegen-units=1 -Clink-dead-code -Cpasses=insert-gcov-profiling -Cpanic=abort -Zpanic-abort-tests -L%s -lclang_rt.profile-x86_64' % LLVM_PATH
LCOVOPTS = '--gcov-tool ./admin/llvm-gcov --rc lcov_excl_line=assert'.split()
def lcov_exe(*args):
return ['lcov'] + LCOVOPTS + list(args)
def sh(cmd):
subprocess.check_call(cmd, shell = True)
def cleanup():
sh('cargo clean')
sh("rm -rf *.gcda *.gcno")
def run(which):
exe = filter(lambda x: '.d' not in x, glob.glob('target/debug/deps/' + which + '-*'))[0]
sh('./' + exe)
def cargo():
# run stable cargo, because nightly is oft-broken
out = subprocess.check_output(['rustup', 'run', 'stable', 'rustup', 'which', 'cargo'])
return out.strip()
def rustc(*args):
exe = [cargo(), 'rustc', '--all-features'] + list(args)
env = dict(os.environ)
env.update(RUSTC_WRAPPER = './admin/coverage-rustc',
COVERAGE_OPTIONS = COVERAGE_OPTIONS,
CARGO_INCREMENTAL = '0')
subprocess.check_call(exe, env = env)
def lcov(outfile):
exe = lcov_exe('--capture', '--directory', '.', '--base-directory', '.', '-o', outfile)
subprocess.check_call(exe)
return outfile
def merge(outfile, infiles):
arg = []
for i in infiles:
arg.append('--add')
arg.append(i)
arg.append('-o')
arg.append(outfile)
subprocess.check_call(lcov_exe(*arg))
def remove(outfile, infile, pattern):
subprocess.check_call(lcov_exe('--remove', infile, os.getcwd() + pattern, '-o', outfile))
def extract(outfile, infile):
subprocess.check_call(lcov_exe('--extract', infile, os.getcwd() + '/rustls/src/*', '-o', outfile))
def genhtml(outdir, infile):
subprocess.check_call(['genhtml', '--branch-coverage', '--demangle-cpp', '--legend',
infile, '-o', outdir, '--ignore-errors', 'source'])
all_infos = []
# unit tests
cleanup()
rustc('--package', 'rustls', '--profile', 'test', '--lib')
run('rustls')
all_infos.append(lcov('rustls.info'))
cleanup()
for example in 'bench bogo_shim trytls_shim'.split():
rustc('--package', 'rustls', '--profile', 'dev', '--example', example)
# crate-level tests
for test in 'api'.split():
rustc('--package', 'rustls', '--profile', 'dev', '--test', test)
run(test)
# trytls/bogo
#sh('cd trytls && ./runme')
sh('cd bogo && ./runme')
all_infos.append(lcov('tests.info'))
merge('merged.info', all_infos)
remove('coverage.info', 'merged.info', '/rustls/src/msgs/macros.rs')
extract('final.info', 'coverage.info')
genhtml('target/coverage/', 'final.info')