#!/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')