X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F80-suppressions.t;h=bc003f29aa49ebcb21cd8d116ded6abc8ec0831c;hb=2c99794db74cfb5c6c4ecb617b231b553d6d1b93;hp=b9266a5f7aa351fd3ed64330b0b8e896c703a43a;hpb=b41c498738a3a4ccb8742883a42e6ea5addb1afd;p=perl%2Fmodules%2FTest-Valgrind.git diff --git a/t/80-suppressions.t b/t/80-suppressions.t index b9266a5..bc003f2 100644 --- a/t/80-suppressions.t +++ b/t/80-suppressions.t @@ -3,53 +3,138 @@ use strict; use warnings; -use Test::More tests => 4; +use Test::More; use Test::Valgrind::Command; use Test::Valgrind::Tool; -use Test::Valgrind::Action; use Test::Valgrind::Session; +use lib 't/lib'; +use Test::Valgrind::FakeValgrind; + my $cmd = Test::Valgrind::Command->new( command => 'Perl', - args => [ ], + args => [ '-e1' ], ); -my $tool = Test::Valgrind::Tool->new( - tool => 'memcheck', -); +{ + package Test::Valgrind::Parser::Dummy; + + use base 'Test::Valgrind::Parser'; + + sub parse { } +} + +{ + package Test::Valgrind::Tool::Dummy; + + use base 'Test::Valgrind::Tool::memcheck'; + + sub parser_class { 'Test::Valgrind::Parser::Dummy' } +} + +my $tool = Test::Valgrind::Tool::Dummy->new(); + +{ + package Test::Valgrind::Action::Dummy; + + use base 'Test::Valgrind::Action'; + + sub do_suppressions { 0 } + + sub report { + my ($self, $sess, $report) = @_; -my $sess = Test::Valgrind::Session->new( + if ($report->is_diag) { + my $contents = $report->data; + if ($contents !~ /^(?:Using valgrind |No suppressions used)/) { + ::diag($contents); + } + return; + } else { + $self->SUPER::report($sess, $report); + } + } +} + +my $dummy_action = Test::Valgrind::Action::Dummy->new(); + +my $sess = eval { Test::Valgrind::Session->new( min_version => $tool->requires_version, -); +) }; + +if (my $err = $@) { + $err =~ s/^(Empty valgrind candidates list|No appropriate valgrind executable could be found)\s+at.*/$1/; + plan skip_all => $err; +} else { + plan tests => 4; +} $sess->command($cmd); $sess->tool($tool); -my $file = $sess->def_supp_file; +my $file = $sess->def_supp_file; +my $VERSION = quotemeta $Test::Valgrind::Session::VERSION; +my $exp = qr!$VERSION/memcheck-\d+(?:\.\d+)*-[0-9a-f]{32}\.supp$!; +like $file, $exp, 'default suppression file is correctly named'; -like($file, qr!\Q$Test::Valgrind::Session::VERSION\E/memcheck-\d+(?:\.\d+)*-[0-9a-f]{32}\.supp$!, 'suppression file is correctly named'); -ok(-e $file, 'suppression file exists'); -ok(-r $file, 'suppression file is readable'); +my $res = open my $supp_fh, '<', $file; +my $err = $!; +ok $res, 'default suppression file can be opened'; +diag "open($file): $err" unless $res; -if (not open my $supp, '<', $file) { - fail("Couldn't open the suppression file at $file: $!"); -} else { - pass("Could open the suppression file"); - my ($in, $count, $true, $line) = (0, 0, 0, 0); - while (<$supp>) { - ++$line; +if ($res) { + my ($count, $non_empty, $perl_related) = (0, 0, 0); + my ($in, $valid_frames, $seen_perl); + while (<$supp_fh>) { chomp; s/^\s*//; s/\s*$//; if (!$in && $_ eq '{') { - $in = $line; - } elsif ($in && $_ eq '}') { - ++$count; - ++$true if $line - $in >= 2; - $in = 0; + $in = 1; + $valid_frames = 0; + $seen_perl = 0; + } elsif ($in) { + if ($_ eq '}') { + ++$count; + ++$non_empty if $valid_frames; + ++$perl_related if $seen_perl; + $in = 0; + } else { + ++$valid_frames if /^\s*fun:/; + ++$seen_perl if /^\s*fun:Perl_/; + } } } - diag "$count suppressions, of which $true are not empty"; - close $supp; + diag "The default suppression file contains $count suppressions, of which $non_empty are not empty and $perl_related apply to perl"; + close $supp_fh; +} + +SKIP: { + my $dummy_vg = Test::Valgrind::FakeValgrind->new(); + skip $dummy_vg => 2 unless ref $dummy_vg; + + eval { Test::Valgrind::Session->new( + valgrind => $dummy_vg->path, + no_def_supp => 1, + extra_supp => [ 't/supp/no_perl' ], + )->run( + tool => $tool, + command => $cmd, + action => $dummy_action, + ) }; + like $@, qr/No compatible suppressions available/, + 'incompatible suppression file'; + + eval { Test::Valgrind::Session->new( + valgrind => $dummy_vg->path, + no_def_supp => 1, + allow_no_supp => 1, + extra_supp => [ 't/supp/no_perl' ], + )->run( + tool => $tool, + command => $cmd, + action => $dummy_action, + ) }; + is $@, '', 'incompatible suppression file, but forced'; }