diff options
Diffstat (limited to 'ext/File-Glob/t/threads.t')
-rw-r--r-- | ext/File-Glob/t/threads.t | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/ext/File-Glob/t/threads.t b/ext/File-Glob/t/threads.t new file mode 100644 index 0000000000..141450ac7c --- /dev/null +++ b/ext/File-Glob/t/threads.t @@ -0,0 +1,71 @@ +#!./perl + +BEGIN { + chdir 't' if -d 't'; + @INC = '../lib'; + require Config; import Config; + if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) { + print "1..0\n"; + exit 0; + } +} +use strict; +use warnings; +# Test::More needs threads pre-loaded +use if $Config{useithreads}, 'threads'; +use Test::More; + +BEGIN { + if (! $Config{'useithreads'}) { + plan skip_all => "Perl not compiled with 'useithreads'"; + } +} + +use File::Temp qw(tempdir); +use File::Spec qw(); +use File::Glob qw(csh_glob); + +my($dir) = tempdir(CLEANUP => 1) + or die "Could not create temporary directory"; + +my @temp_files = qw(1_file 2_file 3_file); +for my $file (@temp_files) { + open my $fh, ">", File::Spec->catfile($dir, $file) + or die "Could not create file $dir/$file: $!"; + close $fh; +} +my $cwd = Cwd::cwd(); +chdir $dir + or die "Could not chdir to $dir: $!"; + +sub do_glob { scalar csh_glob("*") } +# Stablish some glob state +my $first_file = do_glob(); +is($first_file, $temp_files[0]); + +my @files; +push @files, threads->create(\&do_glob)->join() for 1..5; +is_deeply( + \@files, + [($temp_files[1]) x 5], + "glob() state is cloned for new threads" +); + +@files = threads->create({'context' => 'list'}, + sub { + return do_glob(), threads->create(\&do_glob)->join() + })->join(); + +is_deeply( + \@files, + [@temp_files[1,2]], + "..and for new threads inside threads" +); + +my $second_file = do_glob(); +is($second_file, $temp_files[1], "state doesn't leak from threads"); + +chdir $cwd + or die "Could not chdir back to $cwd: $!"; + +done_testing; |