1 package Test::Valgrind::Test::Action;
6 use base qw<Test::Valgrind::Action::Test>;
12 require Test::Valgrind;
14 XSLoader::load('Test::Valgrind', $Test::Valgrind::VERSION);
20 *report = *report_smart;
31 extra_tests => $extra_tests,
38 my ($self, $sess, $report) = @_;
40 if ($report->can('is_leak') and $report->is_leak) {
41 my $data = $report->data;
42 my @trace = map $_->[2] || '?',
43 @{$data->{stack} || []}[0 .. 3];
46 and $trace[1] eq 'tv_leak'
47 and ($trace[2] eq 'Perl_pp_entersub' or $trace[3] eq 'Perl_pp_entersub')
51 push @filtered_reports, [
54 $data->{leakedblocks},
60 $self->SUPER::report($sess, $report);
64 return unless $extra_tests;
66 my $tb = Test::Builder->new;
68 $tb->is_eq(scalar(@filtered_reports), 1, 'caught one extra leak');
70 if (@filtered_reports) {
71 my $first = shift @filtered_reports;
72 $tb->diag("The subsequent report was correctly caught:\n" . $first->[0]);
73 $tb->is_eq($first->[1], 10_000, '10_000 bytes leaked');
74 $tb->is_eq($first->[2], 1, ' in one block');
76 for my $extra_report (@filtered_reports) {
78 "The subsequent report should NOT have been caught:\n" . $extra_report->[0]
82 $tb->ok(0, 'no extra leak caught, hence no bytes leaked');
83 $tb->ok(0, 'no extra leak caught, hence no block leaked');