]> git.vpit.fr Git - perl/modules/VPIT-TestHelpers.git/blobdiff - lib/VPIT/TestHelpers.pm
Turn run_perl() into a feature
[perl/modules/VPIT-TestHelpers.git] / lib / VPIT / TestHelpers.pm
index 9054314e3be4a04356cadac696e7f8ddd88f2d9d..a6ca51908cc9f3398a125f93a7353844dbc6043c 100644 (file)
@@ -19,14 +19,14 @@ sub export_to_pkg {
 my %default_exports = (
  load_or_skip     => \&load_or_skip,
  load_or_skip_all => \&load_or_skip_all,
- run_perl         => \&run_perl,
  skip_all         => \&skip_all,
 );
 
 my %features = (
- threads => \&init_threads,
- usleep  => \&init_usleep,
- capture => \&init_capture,
+ threads  => \&init_threads,
+ usleep   => \&init_usleep,
+ run_perl => \&init_run_perl,
+ capture  => \&init_capture,
 );
 
 sub import {
@@ -142,12 +142,8 @@ sub load_or_skip_all {
  return $loaded;
 }
 
-sub run_perl {
- my $code = shift;
-
- if ($code =~ /"/) {
-  die 'Double quotes in evaluated code are not portable';
- }
+sub fresh_perl_env (&) {
+ my $handler = shift;
 
  my ($SystemRoot, $PATH) = @ENV{qw<SystemRoot PATH>};
  my $ld_name  = $Config::Config{ldlibpthname};
@@ -166,7 +162,39 @@ sub run_perl {
   }
  }
 
- system { $perl } $perl, '-T', map("-I$_", @INC), '-e', $code;
+ return $handler->($perl, '-T', map("-I$_", @INC));
+}
+
+sub init_run_perl {
+ my $prefix = shift;
+
+ if (defined $prefix) {
+  if (length $prefix and $prefix !~ /_$/) {
+   $prefix .= '_';
+  }
+ } else {
+  $prefix = '';
+ }
+
+ my $p = $prefix;
+
+ return (
+  run_perl              => \&run_perl,
+  "${p}RUN_PERL_FAILED" => sub () { 'Could not execute perl subprocess' },
+ );
+}
+
+sub run_perl {
+ my $code = shift;
+
+ if ($code =~ /"/) {
+  die 'Double quotes in evaluated code are not portable';
+ }
+
+ fresh_perl_env {
+  my ($perl, @perl_args) = @_;
+  system { $perl } $perl, @perl_args, '-e', $code;
+ };
 }
 
 sub init_capture {
@@ -179,7 +207,10 @@ sub init_capture {
   load_or_skip_all 'Socket', '0', [ ];
  }
 
- return capture => \&capture;
+ return (
+  capture      => \&capture,
+  capture_perl => \&capture_perl,
+ );
 }
 
 # Inspired from IPC::Cmd
@@ -319,6 +350,19 @@ sub capture {
  }
 }
 
+sub capture_perl {
+ my $code = shift;
+
+ if ($code =~ /"/) {
+  die 'Double quotes in evaluated code are not portable';
+ }
+
+ fresh_perl_env {
+  my @perl = @_;
+  capture @perl, '-e', $code;
+ };
+}
+
 sub init_threads {
  my ($pkg, $threadsafe, $force_var) = @_;