You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.3 KiB
103 lines
3.3 KiB
#!/usr/bin/perl |
|
############################################################ |
|
# this perl script is meant for developers only! |
|
# it will run all spec-tests (without verifying the |
|
# results) via valgrind to detect possible leaks. |
|
# expect that it takes 1h or more to finish! |
|
############################################################ |
|
# Prerequisite install: `cpan Parallel::Runner` |
|
# You may also need to install `cpan File::Find` |
|
# You may also need to install `cpan IPC::Run3` |
|
############################################################ |
|
# usage: `perl test-leaks.pl [threads]` |
|
# example: `time perl test-leaks.pl 4` |
|
############################################################ |
|
# leaks will be reported in "mem-leaks.log" |
|
############################################################ |
|
|
|
use strict; |
|
use warnings; |
|
|
|
############################################################ |
|
# configurations (you may adjust) |
|
############################################################ |
|
|
|
# number of threads to use |
|
my $threads = $ARGV[0] || 8; |
|
|
|
# the github repositories to checkout |
|
# if you need other branch, clone manually! |
|
my $sassc = "https://www.github.com/sass/sassc"; |
|
my $specs = "https://www.github.com/sass/sass-spec"; |
|
|
|
############################################################ |
|
# load modules |
|
############################################################ |
|
|
|
use IPC::Run3; |
|
use IO::Handle; |
|
use Fcntl qw(:flock); |
|
use File::Find::Rule; |
|
use Parallel::Runner; |
|
use List::Util qw(shuffle); |
|
|
|
############################################################ |
|
# check prerequisites |
|
############################################################ |
|
|
|
unless (-d "../sassc") { |
|
warn "sassc folder not found\n"; |
|
warn "trying to checkout via git\n"; |
|
system("git", "clone", $sassc, "../sassc"); |
|
die "git command did not exit gracefully" if $?; |
|
} |
|
|
|
unless (-d "../sass-spec") { |
|
warn "sass-spec folder not found\n"; |
|
warn "trying to checkout via git\n"; |
|
system("git", "clone", $specs, "../sass-spec"); |
|
die "git command did not exit gracefully" if $?; |
|
} |
|
|
|
unless (-f "../sassc/bin/sassc") { |
|
warn "sassc executable not found\n"; |
|
warn "trying to compile via make\n"; |
|
system("make", "-C", "../sassc", "-j", $threads); |
|
die "make command did not exit gracefully" if $?; |
|
} |
|
|
|
############################################################ |
|
# main runner code |
|
############################################################ |
|
|
|
my $root = "../sass-spec/spec"; |
|
my @files = File::Find::Rule->file() |
|
->name('input.scss')->in($root); |
|
|
|
open(my $leaks, ">", "mem-leaks.log"); |
|
die "Cannot open log" unless $leaks; |
|
my $runner = Parallel::Runner->new($threads); |
|
die "Cannot start runner" unless $runner; |
|
|
|
print "##########################\n"; |
|
print "Testing $#files spec files\n"; |
|
print "##########################\n"; |
|
|
|
foreach my $file (shuffle @files) { |
|
$runner->run(sub { |
|
$| = 1; select STDOUT; |
|
my $cmd = sprintf('../sassc/bin/sassc %s', $file); |
|
my $check = sprintf('valgrind --leak-check=yes %s', $cmd); |
|
run3($check, undef, \ my $out, \ my $err); |
|
if ($err =~ m/in use at exit: 0 bytes in 0 blocks/) { |
|
print "."; # print success indicator |
|
} else { |
|
print "F"; # print error indicator |
|
flock($leaks, LOCK_EX) or die "Cannot lock log"; |
|
$leaks->printflush("#" x 80, "\n", $err, "\n"); |
|
flock($leaks, LOCK_UN) or die "Cannot unlock log"; |
|
} |
|
}); |
|
} |
|
|
|
$runner->finish;
|
|
|