xref: /netbsd-src/external/bsd/less/dist/lesstest/runtest (revision e4a6e799a67c2028562d75b4e61407b22434aa36)
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