#!/usr/bin/perl -w # $Id: coverage.perl 2147 2006-11-02 20:06:03Z bsmith $ # Runs "make test" with Devel::Cover to check POE's test coverage. # Generates a quite fine HTML report in the db_cover directory. use strict; use Cwd; use Getopt::Long; use Config; use File::Spec; # HARNESS_PERL_SWITCHES=$(perl mylib/coverage.perl --coverflags) prove -br t/10_units/ my ($opt_coverflags, $opt_prove, $opt_noclean); my ($cover, $prove, $make) = (File::Spec->catfile($Config{bin}, "/cover"), File::Spec->catfile($Config{bin}, "prove"), $Config{make}); GetOptions( 'coverflags' => \$opt_coverflags, 'prove' => sub { $opt_prove = 1; die "!FINISH" }, 'noclean' => \$opt_noclean, 'path-cover=s' => \$cover, 'path-prove=s' => \$prove, 'path-make=s' => \$make, ) or die "$0: usage\n"; my $output_dir = cwd() . "/cover_db"; my $hps = $ENV{HARNESS_PERL_SWITCHES} || ""; $hps =~ s/~/$ENV{HOME}/g; my @includes = ("mylib", $hps =~ /-I\s*(\S+)/g); $hps =~ s/(?<=-I)\s+//g; my $ignores = join(",", map("+inc,$_", @includes), "+ignore,^t/"); warn "*** Ignores: $ignores"; my $cover_options = "-MDevel::Cover"; $cover_options .= "=$ignores" if $ignores; if ($opt_coverflags) { print $cover_options, "\n"; exit 0; } # preparation/cleaning steps unless ($opt_noclean) { system( $make, "distclean" ); system( $^X, "Makefile.PL", "--default" ) and exit($? >> 8); system( $make ) and exit($? >> 8); if (-e $output_dir) { system( $^X, $cover, "-delete", $output_dir ) and exit($? >> 8); } } # run the test suite in the coverage environment { my $harness_switches = "$hps $cover_options"; $harness_switches =~ s/^\s+//; $harness_switches =~ s/\s+$//; warn "*** HARNESS_PERL_SWITCHES = $harness_switches"; local $ENV{HARNESS_PERL_SWITCHES} = $harness_switches; if ($opt_prove) { warn "*** proving: $prove @ARGV"; system( $prove, @ARGV ) and exit($? >> 8); } elsif (@ARGV) { # it might be more useful to punt to prove(1), but prove isn't always # available, maybe a --prove flag foreach my $test (@ARGV) { warn "*** running: $^X $harness_switches $test"; system( $^X, $harness_switches, $test ) and exit($? >> 8); } } else { system( $make, "test" ) and exit($? >> 8); } } # coverage report system( $^X, $cover, $output_dir ) and exit($? >> 8); warn "*** used ".((times)[2] + (times)[3])." seconds of CPU"; exit; __END__ =head1 NAME coverage.perl -- A command-line tool for producing coverage reports of POE =head1 SYNOPSIS coverage.perl [options] [tests] Options: --coverflags Print out the -MDevel::Cover option that would have been used, then exit. --noclean Do not clean and rebuild source tree or cover_db --prove Run the prove utility with the rest of the command line