Devel-NYTProf
view release on metacpan or search on metacpan
t/lib/NYTProfTest.pm view on Meta::CPAN
report_rusage($rusage_start);
}
# report which env vars influenced the failures, if any
sub report_env_influence {
my ($tag) = @_;
#warn Dumper(\%env_influence);
my @env_influence;
for my $envvar (sort keys %env_influence) {
my $variants = $env_influence{$envvar};
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Sortkeys = 1;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Quotekeys= 0;
local $Data::Dumper::Pair = ' ';
$variants->{$_} = Dumper($variants->{$_}) for keys %$variants;
# was there at least one failure?
next unless grep { /FAIL/ } values %$variants;
my $v = (values %$variants)[0]; # use one as a reference
# all the same?
next if keys %$variants == grep { $_ eq $v } values %$variants;
push @env_influence, sprintf "%15s: %s\n", $envvar,
join ', ', map { "$_ => $variants->{$_}" } sort keys %$variants;
}
if (@env_influence and not defined wantarray) {
push @env_influence, sprintf "%s with %s\n",
$env_failed{$_} ? 'FAILED' : 'Passed', $_
for sort keys %env_failed;
diag "SUMMARY: Breakdown of $tag test failures by option settings:";
diag $_ for @env_influence;
}
%env_influence = ();
return @env_influence;
}
# execute a group of tests (t/testFoo.*) - calls plan()
sub run_test_group {
my ($rtg_opts) = @_;
my $extra_test_code = $rtg_opts->{extra_test_code};
my $extra_test_count = $rtg_opts->{extra_test_count} || 0;
my $extra_options = $rtg_opts->{extra_options};
if ($ENV{NYTPROF_TEST_NOEXTRA}) {
diag "NYTPROF_TEST_NOEXTRA - skipping $extra_test_count extra tests"
if $extra_test_count;
$extra_test_code = undef;
$extra_test_count = 0;
$extra_options = {};
}
# obtain group from file name
my $group;
if ((caller)[1] =~ /([^\/\\]+)\.t$/) {
$group = $1;
} else {
croak "Can't determine test group";
}
my @tests = grep { -f $_ }
map { "$group.$_" }
sort { $text_extn_info->{$a}{order} <=> $text_extn_info->{$b}{order} }
keys %$text_extn_info;
unlink <$group.*_new*>; # delete _new* files from previous run
if ($opts{v}) {
print "tests: @tests\n";
print "perl: $perl\n";
print "perl5lib: $perl5lib\n";
print "nytprofbin: $bindir\n";
}
plan skip_all => "No '$group.*' test files and no extra_test_code"
if !@tests and !$extra_test_code;
my $opts = mk_opt_combinations($extra_options);
my $tests_per_env = number_of_tests(@tests) + $extra_test_count + 1;
my $optscount = $ENV{NYTPROF_TEST_SHORT} ? 1 : @$opts;
plan tests => 1 + $tests_per_env * $optscount;
# Windows emulates the executable bit based on file extension only
ok($^O eq "MSWin32" ? -f $nytprofcsv : -x $nytprofcsv, "Found nytprofcsv as $nytprofcsv");
# non-default output file to test override works and to allow parallel testing
my $profile_datafile = "nytprof_$group.out";
$NYTPROF_TEST{file} = $profile_datafile;
do_foreach_opt_combination( $opts, sub {
my ($env) = @_;
for my $test (@tests) {
run_test($test, $env);
}
if ($extra_test_code) {
my $profile;
if (@tests) {
print("running $extra_test_count extra tests...\n");
$profile = eval { Devel::NYTProf::Data->new({ filename => $profile_datafile }) };
if ($@) {
diag($@);
fail("extra tests group '$group'") foreach (1 .. $extra_test_count);
return;
}
}
$extra_test_code->($profile, $env);
}
return 1;
} );
report_env_influence($group);
( run in 2.058 seconds using v1.01-cache-2.11-cpan-54e63673c56 )