while_readdir.t needs a private directory to run in.
authorNicholas Clark <nick@ccl4.org>
Fri, 20 Aug 2010 19:22:45 +0000 (21:22 +0200)
committerNicholas Clark <nick@ccl4.org>
Fri, 20 Aug 2010 19:22:45 +0000 (21:22 +0200)
It assumes that it can read the contents twice and get the same result.
It's running in parallel with tests which do sometimes write in t/ so if it
runs at that level, it will sometimes fail due to race conditions.

t/op/while_readdir.t

index 3964158..1473dad 100644 (file)
@@ -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" }