1use Test2::V0 -no_srand => 1;
2use Config;
3use Capture::Tiny qw( capture_merged );
4use FFI::Temp;
5
6# libexpat1-dev
7
8skip_all 'tested only in CI' if ($ENV{CIPSOMETHING}||'') ne 'true';
9skip_all 'tested only in CI -debug' if $Config{ccflags} !~ /-DDEBUG_LEAKING_SCALARS/;
10
11my %exfail = map { $_ => 1 } qw( attach.pl );
12
13# you can run this on just one (or more) test file in corpus/memory by
14#  perl -Mblib t/memory.t foo.pl
15
16my @list = @ARGV ? @ARGV : do {
17  my $dh;
18  opendir $dh, 'corpus/memory';
19  grep /\.pl$/, sort readdir $dh;
20};
21
22my @supp = do {
23  my $dh;
24  opendir $dh, 'corpus/memory/supp';
25  map { "--suppressions=corpus/memory/supp/$_" } grep /\.supp/, sort readdir $dh;
26};
27
28foreach my $name (@list)
29{
30  subtest $name => sub {
31
32    local $ENV{PERL_DESTRUCT_LEVEL} = 2;
33
34    my $log = FFI::Temp->new;
35
36    my @command = (
37      'valgrind',
38      '--leak-check=yes',
39      "--log-file=$log",
40      '--error-exitcode=2',
41      #'--gen-suppressions=all',
42      #'-v',
43      @supp,
44      $^X,
45      '-Mblib',
46      "corpus/memory/$name",
47    );
48
49    my($out, $exit) = capture_merged {
50      print "+ @command\n";
51      system @command;
52      $?;
53    };
54
55    if($exfail{$name})
56    {
57      note "expected fail";
58      {
59        my $todo = todo 'expected fail';
60        is($exit, 0, 'valgrind') or do {
61          note "[output]\n$out";
62          note "[log]\n", do { local $/; <$log> };
63        };
64      };
65    }
66    else
67    {
68      note "expected pass";
69      is($exit, 0, 'valgrind') or do {
70        diag "[output]\n$out";
71        diag "[log]\n", do { local $/; <$log> };
72      };
73    }
74
75  };
76}
77
78done_testing;
79