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;
26 sub new { shift->SUPER::new(extra_tests => $extra_tests) }
31 my ($self, $sess, $report) = @_;
33 if ($report->can('is_leak') and $report->is_leak) {
34 my $data = $report->data;
35 my @trace = map $_->[2] || '?',
36 @{$data->{stack} || []}[0 .. 3];
39 and $trace[1] eq 'tv_leak'
40 and ($trace[2] eq 'Perl_pp_entersub' or $trace[3] eq 'Perl_pp_entersub')
44 push @filtered_reports, [
47 $data->{leakedblocks},
53 $self->SUPER::report($sess, $report);
57 return unless $extra_tests;
59 my $tb = Test::Builder->new;
61 $tb->is_eq(scalar(@filtered_reports), 1, 'caught one extra leak');
63 if (@filtered_reports) {
64 my $first = shift @filtered_reports;
65 $tb->diag("The subsequent report was correctly caught:\n" . $first->[0]);
66 $tb->is_eq($first->[1], 10_000, '10_000 bytes leaked');
67 $tb->is_eq($first->[2], 1, ' in one block');
69 for my $extra_report (@filtered_reports) {
71 "The subsequent report should NOT have been caught:\n" . $extra_report->[0]
75 $tb->ok(0, 'no extra leak caught, hence no bytes leaked');
76 $tb->ok(0, 'no extra leak caught, hence no block leaked');