use Test::More; use strict; use lib qw(t/lib); use Config; use NYTProfTest; plan tests => 20; use Devel::NYTProf::ReadStream qw(for_chunks); my $pre589 = ($] < 5.008009 or $] eq "5.010000"); (my $base = __FILE__) =~ s/\.t$//; # generate an nytprof out file my $out = 'nytprof_readstream.out'; $ENV{NYTPROF} = "file=$out"; unlink $out; run_perl_command(q{-d:NYTProf -e "sub A { };" -e "1;" -e "A()"}); my %prof; my @seqn; for_chunks { push @seqn, "$."; my $tag = shift; push @{ $prof{$tag} }, [ @_ ]; if (1) { my @params = @_; not defined $_ and $_ = '(undef)' for @params; chomp @params; print "# $. $tag @params\n"; } } filename => $out; ok scalar @seqn, 'should have read chunks'; is_deeply(\@seqn, [0..@seqn-1], "chunk seq"); #use Data::Dumper; warn Dumper \%prof; is_deeply $prof{VERSION}, [ [ 4, 0 ] ]; # check for expected tags # but not START_DEFLATE as that'll be missing if there's no zlib # and not SRC_LINE as old perl's for my $tag (qw( COMMENT ATTRIBUTE DISCOUNT TIME_BLOCK SUB_INFO SUB_CALLERS PID_START PID_END NEW_FID )) { is ref $prof{$tag}[0], 'ARRAY', $tag; } SKIP: { skip 'needs perl >= 5.8.9 or >= 5.10.1', 1 if $pre589; is ref $prof{SRC_LINE}[0], 'ARRAY', 'SRC_LINE'; } # check some attributes my %attr = map { $_->[0] => $_->[1] } @{ $prof{ATTRIBUTE} }; cmp_ok $attr{ticks_per_sec}, '>=', 1_000_000, 'ticks_per_sec'; is $attr{application}, '-e', 'application'; is $attr{nv_size}, $Config{nvsize}, 'nv_size'; cmp_ok $attr{xs_version}, '>=', 2.1, 'xs_version'; cmp_ok $attr{basetime}, '>=', $^T, 'basetime'; is_deeply $prof{SUB_INFO}, [ [ 1, 1, 1, 'main::A' ], [ 1, 0, 0, 'main::BEGIN' ], [ 1, 1, 1, 'main::RUNTIME' ] ]; $prof{SUB_CALLERS}[0][$_] = 0 for (3,4); is_deeply $prof{SUB_CALLERS}, [ [ 1, 3, 1, 0, 0, '0', 0, 'main::A', 'main::RUNTIME' ] ];