xref: /openbsd-src/gnu/usr.bin/perl/t/op/stat_errors.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
1*5759b3d2Safresh1#!./perl
2*5759b3d2Safresh1
3*5759b3d2Safresh1BEGIN {
4*5759b3d2Safresh1    chdir 't' if -d 't';
5*5759b3d2Safresh1    require './test.pl';
6*5759b3d2Safresh1    set_up_inc('../lib');
7*5759b3d2Safresh1    skip_all_if_miniperl("miniperl can't load PerlIO::scalar");
8*5759b3d2Safresh1}
9*5759b3d2Safresh1
10*5759b3d2Safresh1plan(tests => 2*11*29);
11*5759b3d2Safresh1
12*5759b3d2Safresh1use Errno qw(EBADF ENOENT);
13*5759b3d2Safresh1
14*5759b3d2Safresh1open(SCALARFILE, "<", \"wibble") or die $!; # needs PerlIO::scalar
15*5759b3d2Safresh1open(CLOSEDFILE, "<", "./test.pl") or die $!;
16*5759b3d2Safresh1close(CLOSEDFILE) or die $!;
17*5759b3d2Safresh1opendir(CLOSEDDIR, "../lib") or die $!;
18*5759b3d2Safresh1closedir(CLOSEDDIR) or die $!;
19*5759b3d2Safresh1
20*5759b3d2Safresh1foreach my $op (
21*5759b3d2Safresh1    qw(stat lstat),
22*5759b3d2Safresh1    (map { "-$_" } qw(r w x o R W X O e z s f d l p S b c t u g k T B M A C)),
23*5759b3d2Safresh1) {
24*5759b3d2Safresh1    foreach my $arg (
25*5759b3d2Safresh1	(map { ($_, "\\*$_") }
26*5759b3d2Safresh1	    qw(NEVEROPENED SCALARFILE CLOSEDFILE CLOSEDDIR _)),
27*5759b3d2Safresh1	"\"tmpnotexist\"",
28*5759b3d2Safresh1    ) {
29*5759b3d2Safresh1	my $argdesc = $arg;
30*5759b3d2Safresh1	if ($arg eq "_") {
31*5759b3d2Safresh1	    my @z = lstat "tmpnotexist";
32*5759b3d2Safresh1	    $argdesc .= " with prior stat fail";
33*5759b3d2Safresh1	}
34*5759b3d2Safresh1	SKIP: {
35*5759b3d2Safresh1	    if ($op eq "-l" && $arg =~ /\A\\/) {
36*5759b3d2Safresh1		# The op weirdly stringifies the globref and uses it as
37*5759b3d2Safresh1		# a filename, rather than treating it as a file handle.
38*5759b3d2Safresh1		# That might be a bug, but while that behaviour exists it
39*5759b3d2Safresh1		# needs to be exempted from these tests.
40*5759b3d2Safresh1		skip "-l on globref", 2;
41*5759b3d2Safresh1	    }
42*5759b3d2Safresh1	    if ($op eq "-t" && $arg eq "\"tmpnotexist\"") {
43*5759b3d2Safresh1		# The op doesn't operate on filenames.
44*5759b3d2Safresh1		skip "-t on filename", 2;
45*5759b3d2Safresh1	    }
46*5759b3d2Safresh1	    $! = 0;
47*5759b3d2Safresh1	    my $res = eval "$op $arg";
48*5759b3d2Safresh1	    my $err = $!;
49*5759b3d2Safresh1	    is $res, $op =~ /\A-/ ? undef : !!0, "result of $op $arg";
50*5759b3d2Safresh1	    is 0+$err,
51*5759b3d2Safresh1		$arg eq "\"tmpnotexist\"" ||
52*5759b3d2Safresh1		    ($op =~ /\A-[TB]\z/ && $arg =~ /_\z/) ? ENOENT : EBADF,
53*5759b3d2Safresh1		"error from $op $arg";
54*5759b3d2Safresh1	}
55*5759b3d2Safresh1    }
56*5759b3d2Safresh1}
57*5759b3d2Safresh1
58*5759b3d2Safresh11;
59