From 92508f95d17cda6a6995cd4650e72c3ac1187c37 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Wed, 13 Jun 2012 16:45:40 +0200 Subject: *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, intending that to call File::stat::stat(). However the refactoring of the test script (all part of the same commit) from C to C (not in a BEGIN block) intentionally eliminated the export of &File::stat::stat. This means that plain C 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. --- lib/File/stat-7896.t | 28 ++++++++++++++++++++++++++++ lib/File/stat.t | 4 ---- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 lib/File/stat-7896.t (limited to 'lib/File') 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; -- cgit v1.2.1