Devel-DTrace
view release on metacpan or search on metacpan
t/devel-dtrace.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use Test::Differences;
use constant IS_SOLARIS => ( $^O =~ /solaris/ );
my @scripts = map { [ $_, reference( $_ ) ] }
@ARGV ? @ARGV : glob 't/scripts/*.pl';
my @methods
= ( [ 'module', $^X, ( map { "-I$_" } @INC ), '-MDevel::DTrace' ], );
if ( $] >= 5.008008 && !IS_SOLARIS ) {
push @methods, [ 'dtperl', './dtperl' ];
}
plan tests => 1 * @scripts * @methods;
for my $method ( @methods ) {
my ( $type, @cmd ) = @$method;
for my $script ( @scripts ) {
my ( $name, $todo, $want ) = @$script;
my $got = dtrace_run( @cmd, $name );
if ( @$want && $want->[0] eq ':tail:' ) {
$want = [ @{$want}[ 1 .. $#$want ] ];
$got = [ @{$got}[ $#$got - $#$want .. $#$got ] ];
}
TODO: {
local $TODO = $todo if $todo;
eq_or_diff $got, $want, "$type, $name: ok";
}
}
}
sub reference {
my $scp = shift;
my @out = ();
my $todo = undef;
local $_;
open my $sh, '<', $scp or die "Can't read $scp ($!)\n";
while ( <$sh> ) {
chomp;
$todo = $1 if /# TODO\s+(.+)/;
next if $. == 1 .. /^__DATA__$/;
push @out, $_;
}
return ( $todo, \@out );
}
sub dtrace_run {
my @cmd = @_;
local $ENV{'DEVEL_DTRACE_RUNOPS_FAKE'} = 1;
open my $proc, '-|', @cmd or die "Can't run @cmd ($!)\n";
chomp( my @out = <$proc> );
close $proc or die "@cmd failed ($!)\n";
return \@out;
}
( run in 1.486 second using v1.01-cache-2.11-cpan-6aa56a78535 )