Home | History | Annotate | Line # | Download | only in lesstest
      1 #!/usr/bin/env perl
      2 use strict;
      3 
      4 # Run one or more test files.
      5 my $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 
      7 use Getopt::Std;
      8 use Cwd;
      9 
     10 my $rundir;
     11 my $lesstest;
     12 my $lt_screen;
     13 my $less;
     14 my $lt_opts;
     15 my $err_only;
     16 my $num_tests = 0;
     17 
     18 exit main();
     19 sub 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.
     51 sub 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 
     80 sub 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 
     96 sub rfile {
     97 	my ($file, $cwd) = @_;
     98 	return undef if not defined $file;
     99 	$file = "$cwd/$file" unless $file =~ m|^/|;
    100 	return $file;
    101 }
    102 
    103 sub less_is_test {
    104 	my ($less) = @_;
    105 	my $ver = `$less -V`;
    106 	return $ver =~ /LESSTEST/;
    107 }
    108