1*e4a6e799Ssimonb#!/usr/bin/env perl 2*e4a6e799Ssimonbuse strict; 3*e4a6e799Ssimonb 4*e4a6e799Ssimonb# Run one or more test files. 5*e4a6e799Ssimonbmy $usage = "usage: runtest [-eE] [-d lesstest-dir] [-l less.exe] [-r temp-dir] [-s lt_screen] [-t lesstest] [-O lesstest-opts] [file.lt | dir]...\n"; 6*e4a6e799Ssimonb 7*e4a6e799Ssimonbuse Getopt::Std; 8*e4a6e799Ssimonbuse Cwd; 9*e4a6e799Ssimonb 10*e4a6e799Ssimonbmy $rundir; 11*e4a6e799Ssimonbmy $lesstest; 12*e4a6e799Ssimonbmy $lt_screen; 13*e4a6e799Ssimonbmy $less; 14*e4a6e799Ssimonbmy $lt_opts; 15*e4a6e799Ssimonbmy $err_only; 16*e4a6e799Ssimonbmy $num_tests = 0; 17*e4a6e799Ssimonb 18*e4a6e799Ssimonbexit main(); 19*e4a6e799Ssimonbsub main { 20*e4a6e799Ssimonb my %opt; 21*e4a6e799Ssimonb die $usage if not getopts('d:eEl:O:r:s:t:', \%opt); 22*e4a6e799Ssimonb die $usage if not @ARGV; 23*e4a6e799Ssimonb 24*e4a6e799Ssimonb my $cwd = getcwd(); 25*e4a6e799Ssimonb my $srcdir = ($opt{d} or $cwd); 26*e4a6e799Ssimonb $rundir = (rfile($opt{r}, $cwd) or "$srcdir/.runtest_dir"); 27*e4a6e799Ssimonb $lesstest = (rfile($opt{t}, $cwd) or "$srcdir/lesstest"); 28*e4a6e799Ssimonb $lt_screen = (rfile($opt{s}, $cwd) or "$srcdir/lt_screen"); 29*e4a6e799Ssimonb $less = (rfile($opt{l}, $cwd) or "$srcdir/../obj/less"); 30*e4a6e799Ssimonb $lt_opts = ($opt{O} or ""); 31*e4a6e799Ssimonb $err_only = $opt{E} ? 2 : $opt{e} ? 1 : 0; 32*e4a6e799Ssimonb $lt_opts = "-$lt_opts" if $lt_opts =~ /^[^-]/; 33*e4a6e799Ssimonb $lt_opts .= ($err_only == 2) ? " -E" : $err_only ? " -e" : ""; 34*e4a6e799Ssimonb die "cannot execute $lesstest: $!" if not -x $lesstest; 35*e4a6e799Ssimonb die "cannot execute $lt_screen: $!" if not -x $lt_screen; 36*e4a6e799Ssimonb die "cannot execute $less: $!" if not -x $less; 37*e4a6e799Ssimonb die "$less is not compiled to support LESSTEST" if not less_is_test($less); 38*e4a6e799Ssimonb die "cannot create $rundir: $!" if system "rm -rf '$rundir' && mkdir -p '$rundir'"; 39*e4a6e799Ssimonb die "cannot chdir to $rundir: $!" if not chdir $rundir; 40*e4a6e799Ssimonb 41*e4a6e799Ssimonb my $errs = 0; 42*e4a6e799Ssimonb foreach my $file (@ARGV) { 43*e4a6e799Ssimonb $errs += run(rfile($file, $cwd)); 44*e4a6e799Ssimonb } 45*e4a6e799Ssimonb system "rm -rf '$rundir'"; 46*e4a6e799Ssimonb print STDERR "RAN $num_tests tests with $errs errors\n" if $errs > 0 or $err_only != 2; 47*e4a6e799Ssimonb return ($errs > 0); 48*e4a6e799Ssimonb} 49*e4a6e799Ssimonb 50*e4a6e799Ssimonb# Run a test as directed by a lt file. 51*e4a6e799Ssimonbsub run { 52*e4a6e799Ssimonb my ($file) = @_; 53*e4a6e799Ssimonb if (-d $file) { 54*e4a6e799Ssimonb return run_dir($file); 55*e4a6e799Ssimonb } 56*e4a6e799Ssimonb if ($file !~ /\.lt$/) { 57*e4a6e799Ssimonb print STDERR "SKIP unknown file suffix: $file\n"; 58*e4a6e799Ssimonb return 0; 59*e4a6e799Ssimonb } 60*e4a6e799Ssimonb if (not -f $file) { 61*e4a6e799Ssimonb print STDERR "ERR cannot open $file: $!\n"; 62*e4a6e799Ssimonb return 1; 63*e4a6e799Ssimonb } 64*e4a6e799Ssimonb my ($basename) = $file =~ m|^.*/([^/]+)$|; 65*e4a6e799Ssimonb if ($file =~ /'/) { 66*e4a6e799Ssimonb print STDERR "ERR invalid character in $file\n"; 67*e4a6e799Ssimonb return 1; 68*e4a6e799Ssimonb } 69*e4a6e799Ssimonb print STDERR "TEST $basename\n" unless $err_only; 70*e4a6e799Ssimonb my $cmd = "$lesstest $lt_opts -s '$lt_screen' -t '$file' '$less'"; 71*e4a6e799Ssimonb my $err = system $cmd; 72*e4a6e799Ssimonb ++$num_tests; 73*e4a6e799Ssimonb if ($err) { 74*e4a6e799Ssimonb print STDERR "ERR status $err from $cmd\n"; 75*e4a6e799Ssimonb return 1; 76*e4a6e799Ssimonb } 77*e4a6e799Ssimonb return 0; 78*e4a6e799Ssimonb} 79*e4a6e799Ssimonb 80*e4a6e799Ssimonbsub run_dir { 81*e4a6e799Ssimonb my ($dir) = @_; 82*e4a6e799Ssimonb my $errs = 0; 83*e4a6e799Ssimonb my $dd; 84*e4a6e799Ssimonb if (not opendir($dd, $dir)) { 85*e4a6e799Ssimonb print STDERR "ERR cannot open directory $dir: $!\n"; 86*e4a6e799Ssimonb return 1; 87*e4a6e799Ssimonb } 88*e4a6e799Ssimonb while (my $entry = readdir($dd)) { 89*e4a6e799Ssimonb next if $entry =~ /^\./; 90*e4a6e799Ssimonb $errs += run("$dir/$entry"); 91*e4a6e799Ssimonb } 92*e4a6e799Ssimonb closedir $dd; 93*e4a6e799Ssimonb return $errs; 94*e4a6e799Ssimonb} 95*e4a6e799Ssimonb 96*e4a6e799Ssimonbsub rfile { 97*e4a6e799Ssimonb my ($file, $cwd) = @_; 98*e4a6e799Ssimonb return undef if not defined $file; 99*e4a6e799Ssimonb $file = "$cwd/$file" unless $file =~ m|^/|; 100*e4a6e799Ssimonb return $file; 101*e4a6e799Ssimonb} 102*e4a6e799Ssimonb 103*e4a6e799Ssimonbsub less_is_test { 104*e4a6e799Ssimonb my ($less) = @_; 105*e4a6e799Ssimonb my $ver = `$less -V`; 106*e4a6e799Ssimonb return $ver =~ /LESSTEST/; 107*e4a6e799Ssimonb} 108