[test suite] update to use helper scripts for code coverage report generation

This commit is contained in:
Michael Rash 2014-11-15 00:22:14 -05:00
parent b9d5919cdd
commit 49b09c4903
6 changed files with 90 additions and 36 deletions

View File

@ -0,0 +1,9 @@
#!/bin/sh -x
cd ..
./rm-coverage-files.sh
cd afl
./afl-compile.sh --enable-profile-coverage
exit

View File

@ -1,7 +1,7 @@
#!/bin/sh -x #!/bin/sh -x
cd ../../ cd ../../
CC=afl-gcc ./extras/apparmor/configure_args.sh --enable-afl-fuzzing CC=afl-gcc ./extras/apparmor/configure_args.sh --enable-afl-fuzzing $@
make clean make clean
make make
cd test/afl cd test/afl

View File

@ -0,0 +1,13 @@
#!/bin/sh -x
RESULTS_DIR=afl-lcov-results
[ -d $RESULTS_DIR ] && rm -rf $RESULTS_DIR
cd ..
./gen-coverage-report.sh
mv lcov-results afl/$RESULTS_DIR
cd afl
echo "[+] Code coverage available in the $RESULTS_DIR/ directory"
exit

29
test/gen-coverage-report.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/sh -x
TOP_DIR="test"
LCOV_INFO="$TOP_DIR/lcov_coverage.info"
LCOV_INFO_FINAL="$TOP_DIR/lcov_coverage_final.info"
LCOV_RESULTS_DIR="$TOP_DIR/lcov-results"
cd ..
[ ! -d $TOP_DIR ] && mkdir $TOP_DIR
[ -d $LCOV_RESULTS_DIR ] && rm -rf $LCOV_RESULTS_DIR
[ ! -d $LCOV_RESULTS_DIR ] && mkdir $LCOV_RESULTS_DIR
for d in client server
do
cd $d
gcov -b -u *.gcno
cd ..
done
cd lib
gcov -b -u .libs/*.gcno
cd ..
lcov --rc lcov_branch_coverage=1 --capture --directory . --output-file $LCOV_INFO
lcov --rc lcov_branch_coverage=1 -r $LCOV_INFO /usr/include/\* --output-file $LCOV_INFO_FINAL
genhtml --rc genhtml_branch_coverage=1 $LCOV_INFO_FINAL --output-directory $LCOV_RESULTS_DIR
cd test
exit

12
test/rm-coverage-files.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh -x
cd ..
for d in client server lib
do
for s in *.gcda *.gcno *.gcov
do
find $d -name $s | xargs rm -f
done
done
cd test
exit

View File

@ -214,6 +214,8 @@ my $enable_recompilation_warnings_check = 0;
my $enable_configure_args_checks = 0; my $enable_configure_args_checks = 0;
my $enable_profile_coverage_check = 0; my $enable_profile_coverage_check = 0;
my $disable_profile_coverage_init = 0; my $disable_profile_coverage_init = 0;
my $profile_rm_prev_sh = 'rm-coverage-files.sh';
my $profile_gen_report_sh = 'gen-coverage-report.sh';
my $enable_make_distcheck = 0; my $enable_make_distcheck = 0;
my $enable_perl_module_checks = 0; my $enable_perl_module_checks = 0;
my $enable_perl_module_fuzzing_spa_pkt_generation = 0; my $enable_perl_module_fuzzing_spa_pkt_generation = 0;
@ -1296,6 +1298,8 @@ sub compile_warnings() {
sub profile_coverage() { sub profile_coverage() {
my $rv = 1;
### check for any *.gcno files - if they don't exist, then fwknop was ### check for any *.gcno files - if they don't exist, then fwknop was
### not compiled with profile support ### not compiled with profile support
unless (glob('../client/*.gcno') and glob('../server/*.gcno')) { unless (glob('../client/*.gcno') and glob('../server/*.gcno')) {
@ -1306,40 +1310,28 @@ sub profile_coverage() {
my $curr_dir = getcwd() or die $!; my $curr_dir = getcwd() or die $!;
### gcov -b ../client/*.gcno unless ($lcov_path) {
for my $dir ('../client', '../server', '../lib/.libs') { &write_test_file(
next unless -d $dir; "[-] lcov command not found, skipping code coverage report generation.",
chdir $dir or die $!; $curr_test_file);
system "$gcov_path -b -u *.gcno > /dev/null 2>&1"; return 0;
chdir $curr_dir or die $!;
&run_cmd(qq|grep "called 0 returned" $dir/*.gcov|,
$cmd_out_tmp, $curr_test_file);
} }
### if lcov has been installed then use it to build profile &run_cmd("./$profile_gen_report_sh", $cmd_out_tmp, $curr_test_file);
### result HTML pages
if ($lcov_path) {
mkdir "$output_dir/$lcov_results_dir"
unless -d "$output_dir/$lcov_results_dir";
&run_cmd(qq|$lcov_path --rc lcov_branch_coverage=1 --capture --directory .. | .
qq|--output-file $output_dir/lcov_coverage.info|,
$cmd_out_tmp, $curr_test_file);
### exclude /usr/include/* files if (-d $lcov_results_dir) {
&run_cmd(qq|$lcov_path --rc lcov_branch_coverage=1 | . move $lcov_results_dir, "$output_dir/$lcov_results_dir";
qq|-r $output_dir/lcov_coverage.info | . for my $f ('lcov_coverage.info', 'lcov_coverage_final.info') {
qq|/usr/include/\\* --output-file $output_dir/lcov_coverage_final.info|, move $f, "$output_dir/$f" if -e $f;
$cmd_out_tmp, $curr_test_file);
&run_cmd(qq|$genhtml_path --rc genhtml_branch_coverage=1 | .
qq|$output_dir/lcov_coverage_final.info | .
qq|--output-directory $output_dir/$lcov_results_dir|,
$cmd_out_tmp, $curr_test_file);
if (-d "${output_dir}.last") {
&run_cmd("./$coverage_diff_path", $cmd_out_tmp, $curr_test_file);
} }
} else {
&write_test_file("[-] $lcov_results_dir does not exist.",
$cmd_out_tmp, $curr_test_file);
$rv = 0;
}
if (-d "${output_dir}.last") {
&run_cmd("./$coverage_diff_path", $cmd_out_tmp, $curr_test_file);
} }
if ($username) { if ($username) {
@ -1352,7 +1344,7 @@ sub profile_coverage() {
system qq/find .. -name $extension | xargs -r chmod a+w/; system qq/find .. -name $extension | xargs -r chmod a+w/;
} }
return 1; return $rv;
} }
sub fiu_run_fault_injection() { sub fiu_run_fault_injection() {
@ -1588,12 +1580,11 @@ sub config_recompile() {
my $config_cmd = shift; my $config_cmd = shift;
if ($enable_profile_coverage_check) { if ($enable_profile_coverage_check) {
chdir 'test' or die $!;
### we're recompiling, so remove any existing profile coverage ### we're recompiling, so remove any existing profile coverage
### files since they will be invalidated by the recompile ### files since they will be invalidated by the recompile
for my $extension ('*.gcno', '*.gcda', '*.gcov') { &run_cmd("./test/$profile_rm_prev_sh", $cmd_out_tmp, $curr_test_file);
### remove profile output from any previous run chdir '..' or die $!;
system qq{find . -name $extension | xargs rm 2> /dev/null};
}
} }
&run_cmd('make clean', $cmd_out_tmp, "test/$curr_test_file"); &run_cmd('make clean', $cmd_out_tmp, "test/$curr_test_file");