use strict;
use warnings;
-use lib 't/lib';
-use VPIT::TestHelpers 'run_perl';
-
my ($module, $thread_safe_var);
BEGIN {
$module = 'Variable::Magic';
# Keep the rest of the file untouched
-BEGIN {
- my $is_threadsafe;
-
- if (defined $thread_safe_var) {
- my $stat = run_perl "require POSIX; require $module; exit($thread_safe_var ? POSIX::EXIT_SUCCESS() : POSIX::EXIT_FAILURE())";
- if (defined $stat) {
- require POSIX;
- my $res = $stat >> 8;
- if ($res == POSIX::EXIT_SUCCESS()) {
- $is_threadsafe = 1;
- } elsif ($res == POSIX::EXIT_FAILURE()) {
- $is_threadsafe = !1;
- }
- }
- if (not defined $is_threadsafe) {
- skip_all "Could not detect if $module is thread safe or not";
- }
- }
-
- VPIT::TestHelpers->import(
- threads => [ $module => $is_threadsafe ],
- )
-}
+use lib 't/lib';
+use VPIT::TestHelpers threads => [ $module, $thread_safe_var ];
my $could_not_create_thread = 'Could not create thread';
1;
};
+ if ("$]" < 5.014 and $ok and ($status >> 8) == 255 and defined $content_err
+ and $content_err =~ /^open3/) {
+ # Before perl commit 8960aa87 (between 5.12 and 5.14), exceptions in open3
+ # could be reported to STDERR instead of being propagated, so work around
+ # this.
+ $ok = 0;
+ $@ = $content_err;
+ }
+
if ($ok) {
return ($status, $content_out, $content_err);
} else {
Import :
use VPIT::TestHelpers threads => [
- $pkg, $is_threadsafe, $force_var
+ $pkg, $threadsafe_var, $force_var
];
where :
=item -
-C<$pkg> is the target package name to be used in error messages (defaults to C<'package'>) ;
+C<$pkg> is the target package name that will be exercised by this test ;
=item -
-C<$is_threadsafe> is a boolean telling whether the target module is thread-safe (not tested if C<undef>) ;
+C<$threadsafe_var> is the name of an optional variable in C<$pkg> that evaluates to true if and only if the module claims to be thread safe (not checked if either C<$threadsafe_var> or C<$pkg> is C<undef>) ;
=item -
=item -
-L<threads> 1.67
+L<POSIX>
=item -
-L<threads::shared> 1.14
+L<threads> 1.67
=item -
-L<Test::Leaner>
+L<threads::shared> 1.14
=back
=cut
sub init_threads {
- my ($pkg, $threadsafe, $force_var) = @_;
+ my ($pkg, $threadsafe_var, $force_var) = @_;
skip_all 'This perl wasn\'t built to support threads'
unless $Config::Config{useithreads};
- $pkg = 'package' unless defined $pkg;
- skip_all "This $pkg isn't thread safe" if defined $threadsafe and !$threadsafe;
+ if (defined $pkg and defined $threadsafe_var) {
+ my $threadsafe;
+ my $stat = run_perl("require POSIX; require $pkg; exit($threadsafe_var ? POSIX::EXIT_SUCCESS() : POSIX::EXIT_FAILURE())");
+ if (defined $stat) {
+ require POSIX;
+ my $res = $stat >> 8;
+ if ($res == POSIX::EXIT_SUCCESS()) {
+ $threadsafe = 1;
+ } elsif ($res == POSIX::EXIT_FAILURE()) {
+ $threadsafe = !1;
+ }
+ }
+ if (not defined $threadsafe) {
+ skip_all "Could not detect if $pkg is thread safe or not";
+ } elsif (not $threadsafe) {
+ skip_all "This $pkg is not thread safe";
+ }
+ }
$force_var = 'PERL_FORCE_TEST_THREADS' unless defined $force_var;
my $force = $ENV{$force_var} ? 1 : !1;
skip_all 'perl 5.13.4 required to test thread safety'
unless $force or "$]" >= 5.013_004;
- if (($INC{'Test/More.pm'} || $INC{'Test/Leaner.pm'}) && !$INC{'threads.pm'}) {
- die 'Test::More/Test::Leaner was loaded too soon';
+ unless ($INC{'threads.pm'}) {
+ my $test_module;
+ if ($INC{'Test/Leaner.pm'}) {
+ $test_module = 'Test::Leaner';
+ } elsif ($INC{'Test/More.pm'}) {
+ $test_module = 'Test::More';
+ }
+ die "$test_module was loaded too soon" if defined $test_module;
}
load_or_skip_all 'threads', $force ? '0' : '1.67', [ ];
load_or_skip_all 'threads::shared', $force ? '0' : '1.14', [ ];
- require Test::Leaner;
-
diag "Threads testing forced by \$ENV{$force_var}" if $force;
return spawn => \&spawn;