This is a live mirror of the Perl 5 development currently hosted at
In t/op/filetest.t, simplify the skip logic when testing -r and -w on op.
authorNicholas Clark <>
Thu, 24 May 2012 08:45:00 +0000 (09:45 +0100)
committerNicholas Clark <>
Thu, 31 May 2012 16:09:44 +0000 (18:09 +0200)
This code has got excessively hairy. Originally, t/op/filetest.t was added
to test that various file test operators worked as expected. (Commit
42e55ab11744b52a in Oct 1998.) It used the file t/TEST and the directory
t/op for targets. To test that read-only files were detected correctly, it
would chmod 0555 TEST to set it read only.

The test would fail if run as root, because root can write to anything. So
logic was added to set the effective user ID to 1 by assigning to $> in an
eval (unconditionally), and restoring $> afterwards. (Commit 846f25a3508eb6a4
in Nov 1988.) Curiously, the restoration was done after the test for
C<-r op>, rather than before it.

Most strangely, a skip was then added for the C<-w op> test based on
$Config{d_seteuid}. The test runs after $> has been restored, so should have
nothing to do with setuid. It was added as part of the VMS-related changes of
commit 3eeba6fb8b434fcb in May 1999. As d_seteuid is not defined in VMS, this
makes the test skip on VMS.

Commit 15fe5983b126b2ad in July 1999 added a skip for the read-only file
test if d_seteuid is undefined. Which is actually the only test where having
a working seteuid() *might* matter (but only if running as root, so that $>
can be used to drop root privileges).

Commit fd1e013efb606b51 in August 1999 moved the restoration of $> earlier,
ahead of the test for C<-r op>, as that test could fail if run as root with
the source tree unpacked with a restrictive umask. (Bug ID 19990727.039)


index c47a857..7dda4f7 100644 (file)
@@ -46,20 +46,10 @@ SKIP: {
 eval '$> = $oldeuid';  # switch uid back (may not be implemented)
-# this would fail for the euid 1
+# these would fail for the euid 1
 # (unless we have unpacked the source code as uid 1...)
 ok( -r 'op' );
-# this would fail for the euid 1
-# (unless we have unpacked the source code as uid 1...)
-SKIP: {
-    if ($Config{d_seteuid}) {
-       ok( -w 'op' );
-    } else {
-       skip('no seteuid');
-    }
+ok( -w 'op' );
 ok( -x 'op' ); # Hohum.  Are directories -x everywhere?
 is( "@{[grep -r, qw(foo io noo op zoo)]}", "io op" );