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