diff options
-rw-r--r-- | t/op/while_readdir.t | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/t/op/while_readdir.t b/t/op/while_readdir.t index 3964158287..1473dada92 100644 --- a/t/op/while_readdir.t +++ b/t/op/while_readdir.t @@ -9,8 +9,49 @@ BEGIN { use strict; use warnings; -open my $fh, ">", "0" or die "Can't open '0' for writing: $!\n"; -print $fh <<'FILE0'; +plan 10; + +# Need to run this in a quiet private directory as it assumes that it can read +# the contents twice and get the same result. +my $tempdir = tempfile; + +mkdir $tempdir, 0700 or die "Can't mkdir '$tempdir': $!"; +chdir $tempdir or die die "Can't chdir '$tempdir': $!"; + +my $cleanup = 1; +my %tempfiles; + +END { + if ($cleanup) { + foreach my $file (keys %tempfiles) { + # We only wrote each of these once so 1 delete should work: + if (unlink $file) { + warn "unlink tempfile '$file' passed but it's still there" + if -e $file; + } else { + warn "Couldn't unlink tempfile '$file': $!"; + } + } + chdir '..' or die "Couldn't chdir .. for cleanup: $!"; + rmdir $tempdir or die "Couldn't unlink tempdir '$tempdir': $!"; + } +} + +# This is intentionally not random (per run), but intentionally will try to +# give different file names for different people running this test. +srand $< * $]; + +my @chars = ('A' .. 'Z', 'a' .. 'z', 0 .. 9); + +sub make_file { + my $name = shift; + + return if $tempfiles{$name}++; + + print "# Writing to $name in $tempdir\n"; + + open my $fh, '>', $name or die "Can't open '$name' for writing: $!\n"; + print $fh <<'FILE0'; This file is here for testing while(readdir $dir){...} @@ -18,9 +59,20 @@ while(readdir $dir){...} etc FILE0 -close $fh; + close $fh or die "Can't close '$name': $!"; +} -plan 10; +sub make_some_files { + for (1..int rand 10) { + my $name; + $name .= $chars[rand $#chars] for 1..int(1 + rand 5); + make_file($name); + } +} + +make_some_files(); +make_file('0'); +make_some_files(); ok(-f '0', "'0' file is here"); @@ -126,5 +178,3 @@ rewinddir $dirhandle; } closedir $dirhandle; - -END { 1 while unlink "0" } |