X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FVPIT%2FTestHelpers.pm;h=01aff874a8f7a8563554437cf3aee322870b405a;hb=c9ae9f1b1179b6241fed5883450f6a39a88ef5e7;hp=f00b94df47198bf8656af87751e160fe9af369b5;hpb=bf66cc32470cb5983fd445961530652826b9ed02;p=perl%2Fmodules%2FVPIT-TestHelpers.git diff --git a/lib/VPIT/TestHelpers.pm b/lib/VPIT/TestHelpers.pm index f00b94d..01aff87 100644 --- a/lib/VPIT/TestHelpers.pm +++ b/lib/VPIT/TestHelpers.pm @@ -29,6 +29,20 @@ sub export_to_pkg { return 1; } +sub sanitize_prefix { + my $prefix = shift; + + if (defined $prefix) { + if (length $prefix and $prefix !~ /_$/) { + $prefix .= '_'; + } + } else { + $prefix = ''; + } + + return $prefix; +} + my %default_exports = ( load_or_skip => \&load_or_skip, load_or_skip_all => \&load_or_skip_all, @@ -225,17 +239,7 @@ sub fresh_perl_env (&) { } sub init_run_perl { - my $prefix = shift; - - if (defined $prefix) { - if (length $prefix and $prefix !~ /_$/) { - $prefix .= '_'; - } - } else { - $prefix = ''; - } - - my $p = $prefix; + my $p = sanitize_prefix(shift); return ( run_perl => \&run_perl, @@ -264,7 +268,17 @@ sub run_perl { Import : - use VPIT::TestHelpers 'capture' + use VPIT::TestHelpers capture => [ $p ]; + +where : + +=over 8 + +=item - + +C<$p> is prefixed to the constants exported by this feature (defaults to C<''>). + +=back =item * @@ -298,8 +312,16 @@ C =item - +C (possibly prefixed by C<$p>) + +=item - + C +=item - + +C (possibly prefixed by C<$p>) + =back =back @@ -307,6 +329,8 @@ C =cut sub init_capture { + my $p = sanitize_prefix(shift); + skip_all 'Cannot capture output on VMS' if $^O eq 'VMS'; load_or_skip_all 'IO::Handle', '0', [ ]; @@ -317,8 +341,10 @@ sub init_capture { } return ( - capture => \&capture, - capture_perl => \&capture_perl, + capture => \&capture, + "${p}CAPTURE_FAILED" => \&capture_failed_msg, + capture_perl => \&capture_perl, + "${p}CAPTURE_PERL_FAILED" => \&capture_perl_failed_msg, ); } @@ -459,6 +485,15 @@ sub capture { } } +sub capture_failed_msg { + my $details = shift; + + my $msg = 'Could not capture command output'; + $msg .= " ($details)" if defined $details; + + return $msg; +} + sub capture_perl { my $code = shift; @@ -472,6 +507,15 @@ sub capture_perl { }; } +sub capture_perl_failed_msg { + my $details = shift; + + my $msg = 'Could not capture perl output'; + $msg .= " ($details)" if defined $details; + + return $msg; +} + =head2 C =over 4 @@ -481,7 +525,7 @@ sub capture_perl { Import : use VPIT::TestHelpers threads => [ - $pkg, $is_threadsafe, $force_var + $pkg, $threadsafe_var, $force_var ]; where : @@ -490,11 +534,11 @@ 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) ; +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) ; =item - @@ -514,6 +558,10 @@ C 5.13.4 =item - +L + +=item - + L 1.67 =item - @@ -543,21 +591,43 @@ C =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', [ ]; @@ -622,7 +692,7 @@ sub init_usleep { } else { diag 'Using fallback usleep()'; $usleep = sub { - my $s = int($_[0] / 2.5e5); + my $s = int($_[0] / 1e6); sleep $s if $s; }; }