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