xref: /openbsd-src/gnu/usr.bin/perl/ext/File-Glob/t/threads.t (revision 91f110e064cd7c194e59e019b83bb7496c1c84d4)
1*91f110e0Safresh1#!./perl
2*91f110e0Safresh1
3*91f110e0Safresh1BEGIN {
4*91f110e0Safresh1    chdir 't' if -d 't';
5*91f110e0Safresh1    @INC = '../lib';
6*91f110e0Safresh1    require Config; import Config;
7*91f110e0Safresh1    if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
8*91f110e0Safresh1        print "1..0\n";
9*91f110e0Safresh1        exit 0;
10*91f110e0Safresh1    }
11*91f110e0Safresh1}
12*91f110e0Safresh1use strict;
13*91f110e0Safresh1use warnings;
14*91f110e0Safresh1# Test::More needs threads pre-loaded
15*91f110e0Safresh1use if $Config{useithreads}, 'threads';
16*91f110e0Safresh1use Test::More;
17*91f110e0Safresh1
18*91f110e0Safresh1BEGIN {
19*91f110e0Safresh1    if (! $Config{'useithreads'}) {
20*91f110e0Safresh1        plan skip_all => "Perl not compiled with 'useithreads'";
21*91f110e0Safresh1    }
22*91f110e0Safresh1}
23*91f110e0Safresh1
24*91f110e0Safresh1use File::Temp qw(tempdir);
25*91f110e0Safresh1use File::Spec qw();
26*91f110e0Safresh1use File::Glob qw(csh_glob);
27*91f110e0Safresh1
28*91f110e0Safresh1my($dir) = tempdir(CLEANUP => 1)
29*91f110e0Safresh1    or die "Could not create temporary directory";
30*91f110e0Safresh1
31*91f110e0Safresh1my @temp_files = qw(1_file.tmp 2_file.tmp 3_file.tmp);
32*91f110e0Safresh1for my $file (@temp_files) {
33*91f110e0Safresh1    open my $fh, ">", File::Spec->catfile($dir, $file)
34*91f110e0Safresh1        or die "Could not create file $dir/$file: $!";
35*91f110e0Safresh1    close $fh;
36*91f110e0Safresh1}
37*91f110e0Safresh1my $cwd = Cwd::cwd();
38*91f110e0Safresh1chdir $dir
39*91f110e0Safresh1    or die "Could not chdir to $dir: $!";
40*91f110e0Safresh1
41*91f110e0Safresh1sub do_glob { scalar csh_glob("*") }
42*91f110e0Safresh1# Stablish some glob state
43*91f110e0Safresh1my $first_file = do_glob();
44*91f110e0Safresh1is($first_file, $temp_files[0]);
45*91f110e0Safresh1
46*91f110e0Safresh1my @files;
47*91f110e0Safresh1push @files, threads->create(\&do_glob)->join() for 1..5;
48*91f110e0Safresh1is_deeply(
49*91f110e0Safresh1    \@files,
50*91f110e0Safresh1    [($temp_files[1]) x 5],
51*91f110e0Safresh1    "glob() state is cloned for new threads"
52*91f110e0Safresh1);
53*91f110e0Safresh1
54*91f110e0Safresh1@files = threads->create({'context' => 'list'},
55*91f110e0Safresh1    sub {
56*91f110e0Safresh1        return do_glob(), threads->create(\&do_glob)->join()
57*91f110e0Safresh1    })->join();
58*91f110e0Safresh1
59*91f110e0Safresh1is_deeply(
60*91f110e0Safresh1    \@files,
61*91f110e0Safresh1    [@temp_files[1,2]],
62*91f110e0Safresh1    "..and for new threads inside threads"
63*91f110e0Safresh1);
64*91f110e0Safresh1
65*91f110e0Safresh1my $second_file = do_glob();
66*91f110e0Safresh1is($second_file, $temp_files[1], "state doesn't leak from threads");
67*91f110e0Safresh1
68*91f110e0Safresh1chdir $cwd
69*91f110e0Safresh1    or die "Could not chdir back to $cwd: $!";
70*91f110e0Safresh1
71*91f110e0Safresh1done_testing;
72