diff -ruN libvirt-new/configure.in libvirt/configure.in --- libvirt-new/configure.in 2006-08-24 10:26:46.000000000 -0400 +++ libvirt/configure.in 2006-08-24 10:21:47.000000000 -0400 @@ -246,6 +246,34 @@ AC_SUBST(PYTHON_INCLUDES) AC_SUBST(PYTHON_SITE_PACKAGES) +AC_ARG_ENABLE(test-coverage, +[ --enable-test-coverage turn on code coverage instrumentation], +[case "${enableval}" in + yes|no) ;; + *) AC_MSG_ERROR([bad value ${enableval} for test-coverage option]) ;; + esac], + [enableval=no]) + +if test "${enableval}" = yes; then + COV_CFLAGS="-fprofile-arcs -ftest-coverage" + COV_LDFLAGS="-Wc,-fprofile-arcs -Wc,-ftest-coverage" + AC_MSG_CHECKING(whether compiler accepts $COV_CFLAGS) + ac_save_CFLAGS="$CFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS $COV_CFLAGS" + LDFLAGS="$LDFLAGS $COV_LDFLAGS" + AC_TRY_COMPILE(, + [int x;], + AC_MSG_RESULT(yes), + COV_CFLAGS="" + COV_LDFLAGS="" + AC_MSG_RESULT(no)) + CFLAGS="$ac_save_CFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + AC_SUBST([COVERAGE_CFLAGS], [$COV_CFLAGS]) + AC_SUBST([COVERAGE_LDFLAGS], [$COV_LDFLAGS]) +fi + # very annoying rm -f COPYING cp COPYING.LIB COPYING @@ -256,4 +284,5 @@ libvirt.pc libvirt.spec \ include/libvirt/Makefile include/libvirt/libvirt.h \ python/Makefile python/tests/Makefile \ - tests/Makefile proxy/Makefile) + tests/Makefile proxy/Makefile \ + utils/Makefile) diff -ruN libvirt-new/Makefile.am libvirt/Makefile.am --- libvirt-new/Makefile.am 2006-07-07 08:30:27.000000000 -0400 +++ libvirt/Makefile.am 2006-08-24 10:21:10.000000000 -0400 @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = src include docs @PYTHON_SUBDIR@ tests proxy +SUBDIRS = src include docs @PYTHON_SUBDIR@ tests proxy utils EXTRA_DIST = libvirt.spec.in libvirt.spec COPYING.LIB \ libvirt.pc.in libvirt.pc TODO AUTHORS ChangeLog \ @@ -11,6 +11,25 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libvirt.pc +cov: cov-recursive cov-am + +clean-cov: + rm -rf coverage + cd src && $(MAKE) $(AM_MAKEFLAGS) clean-cov + +cov-recursive: + cd src && $(MAKE) $(AM_MAKEFLAGS) cov + +cov-am: + rm -rf coverage + mkdir coverage + perl $(srcdir)/utils/coverage-report.pl src/*.cov > coverage/index.xml + xsltproc $(srcdir)/utils/coverage-report.xsl coverage/index.xml \ + > coverage/index.html + for i in src/*.gcov ; do o=`echo $$i | sed -e 's/src/coverage/'` ; \ + perl $(srcdir)/utils/coverage-report-entry.pl $$i > $$o.html ; done + rpm: clean @(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.gz) diff -ruN libvirt-new/src/.cvsignore libvirt/src/.cvsignore --- libvirt-new/src/.cvsignore 2006-07-07 08:30:32.000000000 -0400 +++ libvirt/src/.cvsignore 2006-08-24 10:19:50.000000000 -0400 @@ -5,3 +5,7 @@ *.lo *.la virsh +*.gcov +*.cov +*.gcno +*.gcda diff -ruN libvirt-new/src/Makefile.am libvirt/src/Makefile.am --- libvirt-new/src/Makefile.am 2006-07-07 08:30:32.000000000 -0400 +++ libvirt/src/Makefile.am 2006-08-24 09:55:24.000000000 -0400 @@ -9,10 +9,11 @@ EXTRA_DIST = libvirt_sym.version lib_LTLIBRARIES = libvirt.la +libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) libvirt_la_LIBADD = @LIBXML_LIBS@ - libvirt_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libvirt_sym.version \ - -version-info @LIBVIRT_VERSION_INFO@ + -version-info @LIBVIRT_VERSION_INFO@ \ + $(COVERAGE_LDFLAGS) libvirt_la_SOURCES = \ libvirt.c internal.h \ @@ -30,7 +31,22 @@ bin_PROGRAMS = virsh virsh_SOURCES = virsh.c -virsh_LDFLAGS = +virsh_CFLAGS = $(COVERAGE_CFLAGS) +virsh_LDFLAGS = $(COVERAGE_CFLAGS) virsh_DEPENDENCIES = $(DEPS) virsh_LDADD = $(LDADDS) $(VIRSH_LIBS) +COVERAGE_FILES = $(libvirt_la_SOURCES:%.c=libvirt_la-%.cov) $(virsh_SOURCES:%.c=virsh-%.cov) + +cov: clean-cov $(COVERAGE_FILES) + +clean-cov: + rm -f *.cov *.gcov + +libvirt_la-%.cov: libvirt_la-%.o + gcov -b -f -o . $< > $@ + +virsh-%.cov: virsh-%.o + gcov -b -f -o . $< > $@ + +CLEANFILES = *.cov *.gcov .libs/*.gcda diff -ruN libvirt-new/tests/Makefile.am libvirt/tests/Makefile.am --- libvirt-new/tests/Makefile.am 2006-08-24 10:27:02.000000000 -0400 +++ libvirt/tests/Makefile.am 2006-08-24 10:10:39.000000000 -0400 @@ -27,19 +27,19 @@ $(top_builddir)/src/xmlrpc.c \ $(top_builddir)/src/xmlrpc.h -xmlrpctest_LDFLAGS = +xmlrpctest_LDFLAGS = $(COVERAGE_CFLAGS) xmlrpctest_LDADD = $(LDADDS) xml2sexprtest_SOURCES = \ xml2sexprtest.c \ testutils.c testutils.h -xml2sexprtest_LDFLAGS = +xml2sexprtest_LDFLAGS = $(COVERAGE_CFLAGS) xml2sexprtest_LDADD = $(LDADDS) sexpr2xmltest_SOURCES = \ sexpr2xmltest.c \ testutils.c testutils.h -sexpr2xmltest_LDFLAGS = +sexpr2xmltest_LDFLAGS = $(COVERAGE_CFLAGS) sexpr2xmltest_LDADD = $(LDADDS) $(LIBVIRT): diff -ruN libvirt-new/utils/coverage-report-entry.pl libvirt/utils/coverage-report-entry.pl --- libvirt-new/utils/coverage-report-entry.pl 1969-12-31 19:00:00.000000000 -0500 +++ libvirt/utils/coverage-report-entry.pl 2006-08-24 10:25:21.000000000 -0400 @@ -0,0 +1,57 @@ +#!/usr/bin/perl +# +# Copyright (C) 2006 Daniel P. Berrange +# +# See COPYING.LIB for the License of this software + +print < + +Coverage report for $ARGV[0] + + + +

Coverage report for $ARGV[0]

+ +
+EOF
+
+
+while (<>) {
+    s/&/&/g;
+    s//>/g;
+
+    if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
+	my $class = $2 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    }
+
+
+    print;
+}
+
+print <
+
+
+EOF
diff -ruN libvirt-new/utils/coverage-report.pl libvirt/utils/coverage-report.pl
--- libvirt-new/utils/coverage-report.pl	1969-12-31 19:00:00.000000000 -0500
+++ libvirt/utils/coverage-report.pl	2006-08-24 10:25:35.000000000 -0400
@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2006 Daniel P. Berrange
+#
+# See COPYING.LIB for the License of this software
+
+use warnings;
+use strict;
+
+my %coverage = ( functions => {}, files => {} );
+
+my %filemap;
+
+my $type;
+my $name;
+
+my @functions;
+
+while (<>) {
+    if (/^Function '(.*)'\s*$/) {
+	$type = "function";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+	push @functions, $name;
+    } elsif (/^File '(.*?)'\s*$/) {
+	$type = "file";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+
+	foreach my $func (@functions) {
+	    $coverage{"function"}->{$func}->{file} = $name;
+	}
+	@functions = ();
+    } elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{lines} = $2;
+	$coverage{$type}->{$name}->{linesCoverage} = $1;
+    } elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{branches} = $2;
+	$coverage{$type}->{$name}->{branchesCoverage} = $1;
+    } elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{conds} = $2;
+	$coverage{$type}->{$name}->{condsCoverage} = $1;
+    } elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{calls} = $2;
+	$coverage{$type}->{$name}->{callsCoverage} = $1;
+    } elsif (/^No branches$/) {
+	$coverage{$type}->{$name}->{branches} = 0;
+	$coverage{$type}->{$name}->{branchesCoverage} = "100.00";
+	$coverage{$type}->{$name}->{conds} = 0;
+	$coverage{$type}->{$name}->{condsCoverage} = "100.00";
+    } elsif (/^No calls$/) {
+	$coverage{$type}->{$name}->{calls} = 0;
+	$coverage{$type}->{$name}->{callsCoverage} = "100.00";
+    } elsif (/^\s*(.*):creating '(.*)'\s*$/) {
+	$filemap{$1} = $2;
+    } elsif (/^\s*$/) {
+	# nada
+    } else {
+	warn "Shit [$_]\n";
+    }
+}
+
+my %summary;
+foreach my $type ("function", "file") {
+    $summary{$type} = {};
+    foreach my $m ("lines", "branches", "conds", "calls") {
+	my $totalGot = 0;
+	my $totalMiss = 0;
+	my $count = 0;
+	foreach my $func (keys %{$coverage{function}}) {
+	    $count++;
+	    my $got = $coverage{function}->{$func}->{$m};
+	    $totalGot += $got;
+	    my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100;
+	    $totalMiss += $miss;
+	}
+	$summary{$type}->{$m} = sprintf("%d", $totalGot);
+	$summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100);
+    }
+}
+
+
+
+print "\n";
+
+foreach my $type ("function", "file") {
+    printf "<%ss>\n", $type;
+    foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) {
+	my $rec = $coverage{$type}->{$name};
+	printf "  \n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
+	printf "    \n", $rec->{lines}, $rec->{linesCoverage};
+	if (exists $rec->{branches}) {
+	    printf "    \n", $rec->{branches}, $rec->{branchesCoverage};
+	}
+	if (exists $rec->{conds}) {
+	    printf "    \n", $rec->{conds}, $rec->{condsCoverage};
+	}
+	if (exists $rec->{calls}) {
+	    printf "    \n", $rec->{calls}, $rec->{callsCoverage};
+	}
+	print  "  \n";
+    }
+
+    printf "  \n";
+    printf "    \n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
+    printf "    \n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
+    printf "    \n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
+    printf "    \n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
+    printf  "  \n";
+    printf "\n", $type;
+}
+
+print "\n";
diff -ruN libvirt-new/utils/coverage-report.xsl libvirt/utils/coverage-report.xsl
--- libvirt-new/utils/coverage-report.xsl	1969-12-31 19:00:00.000000000 -0500
+++ libvirt/utils/coverage-report.xsl	2006-08-24 09:10:46.000000000 -0400
@@ -0,0 +1,217 @@
+
+
+
+  
+
+  
+    
+      
+        Coverage report
+        
+      
+      
+        

Coverage report

+ + + +
+ + +

Function coverage

+ + + +
+ + + +

File coverage

+ + + +
+ + + + + + + + + + + + + + + + + + + + + odd + + + even + + + + + + + + + + + + + + odd + + + even + + + + + + +
NameLinesBranchesConditionsCalls
+
+ + + + + + + + + + + + + + Summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + perfect + + + excellant + + + good + + + poor + + + bad + + + terrible + + + + + % of + + +
diff -ruN libvirt-new/utils/Makefile.am libvirt/utils/Makefile.am --- libvirt-new/utils/Makefile.am 1969-12-31 19:00:00.000000000 -0500 +++ libvirt/utils/Makefile.am 2006-08-24 10:22:52.000000000 -0400 @@ -0,0 +1,3 @@ + +EXTRA_DIST = $(wildcard *.xsl) $(wildcard *.pl) +