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