summaryrefslogtreecommitdiff
path: root/lib/File
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2012-06-13 16:45:40 +0200
committerNicholas Clark <nick@ccl4.org>2012-06-21 08:59:00 +0200
commit92508f95d17cda6a6995cd4650e72c3ac1187c37 (patch)
tree6fd2857e2b31b99af9c3cc02eb7832ce17876477 /lib/File
parent17c017a51cc9557d7d50c5113b67db8442762c56 (diff)
downloadperl-92508f95d17cda6a6995cd4650e72c3ac1187c37.tar.gz
*Actually* test that bug 20011110.104 is fixed.
Bug ID 20011110.104 (RT #7896) was fixed by commit 2f173a711df6278f in Nov 2001, but the test that commit added never actually tested this. The initial problem was that the new code, as written, used C<stat>, intending that to call File::stat::stat(). However the refactoring of the test script (all part of the same commit) from C<use File::stat;> to C<use_ok( 'File::stat' );> (not in a BEGIN block) intentionally eliminated the export of &File::stat::stat. This means that plain C<stat> is the core builtin. Fixing this as-is to File::stat::stat() won't help, as tests have subsequently been added earlier in the script that trigger the autoloading of Symbol by File::stat (commit 83716b1ec25b41f2 in Feb 2002). Moving the tests earlier won't help now that the test uses File::Temp, as that uses IO::Seekable which uses IO::Handle, which unconditionally loads Symbol. The simplest solution seems to be to move the test to its own file.
Diffstat (limited to 'lib/File')
-rw-r--r--lib/File/stat-7896.t28
-rw-r--r--lib/File/stat.t4
2 files changed, 28 insertions, 4 deletions
diff --git a/lib/File/stat-7896.t b/lib/File/stat-7896.t
new file mode 100644
index 0000000000..57b2685852
--- /dev/null
+++ b/lib/File/stat-7896.t
@@ -0,0 +1,28 @@
+#!./perl -w
+use strict;
+
+use Test::More;
+use File::stat;
+
+# This is possibly a bit black-box, but for now it works.
+# If (either) File::stat stops lazy loading Symbol, or Test::More starts, it
+# should be revisited
+is($INC{'Symbol.pm'}, undef, "Symbol isn't loaded yet");
+
+# ID 20011110.104 (RT #7896)
+$! = 0;
+is($!, '', '$! is empty');
+is(File::stat::stat('/notafile'), undef, 'invalid file should fail');
+isnt($!, '', 'should populate $!, given invalid file');
+my $e = $!;
+
+isnt($INC{'Symbol.pm'}, undef, "Symbol has been loaded");
+
+# Repeat twice
+is(File::stat::stat('/notafile'), undef, 'invalid file should fail again');
+is($!, $e, '$! should be consistent for an invalid file');
+$e = $!;
+is(File::stat::stat('/notafile'), undef, 'invalid file should fail again');
+is($!, $e, '$! should be consistent for an invalid file');
+
+done_testing();
diff --git a/lib/File/stat.t b/lib/File/stat.t
index 437078269c..105115b9fe 100644
--- a/lib/File/stat.t
+++ b/lib/File/stat.t
@@ -142,10 +142,6 @@ SKIP:
ok(-p($pstat), "check -p detects a pipe");
}
-local $!;
-$stat = stat '/notafile';
-isnt( $!, '', 'should populate $!, given invalid file' );
-
# Testing pretty much anything else is unportable.
done_testing;