use IPC::Open3 rather than IPC::Run3
[catagits/Catalyst-Devel.git] / t / generated_app.t
index 76a4222..2b50377 100644 (file)
@@ -4,13 +4,13 @@ use lib ();
 use Cwd qw( abs_path );
 use File::Spec::Functions qw( devnull catdir catfile updir rel2abs );
 use File::Temp qw( tempdir );
-use FindBin qw( $Bin );
+use File::Basename qw( dirname );
 use Catalyst::Helper;
 use Test::More;
 use Config;
+use IPC::Open3 qw( open3 );
 
-eval "use IPC::Run3";
-plan skip_all => 'These tests require IPC::Run3' if $@;
+my $helper_lib = abs_path(catdir(dirname($INC{'Catalyst/Helper.pm'}), updir));
 
 my $share_dir = abs_path('share');
 plan skip_all => "No share dir at $share_dir!"
@@ -19,8 +19,16 @@ plan skip_all => "No share dir at $share_dir!"
 $ENV{CATALYST_DEVEL_SHAREDIR} = $share_dir;
 my $instdir = tempdir(CLEANUP => 1);
 
-$ENV{PERL_MM_OPT} = "INSTALL_BASE=$instdir";
-$ENV{INSTALL_BASE} = $instdir;
+my $MAKE = $Config{make} || 'make';
+
+my $escaped_path = $instdir;
+$escaped_path =~ s/\\/\\\\/g;
+if ($escaped_path =~ s/ /\\ /g) {
+  $escaped_path = qq{"$escaped_path"};
+}
+
+$ENV{PERL_MM_OPT} = "INSTALL_BASE=$escaped_path";
+
 if ($ENV{MAKEFLAGS}) {
     $ENV{MAKEFLAGS} =~ s/PREFIX=[^\s]+//;
     $ENV{MAKEFLAGS} =~ s/INSTALL_BASE=[^\s]+//;
@@ -29,7 +37,7 @@ if ($ENV{MAKEFLAGS}) {
 my $dir = tempdir(CLEANUP => 1);
 my $devnull = devnull;
 
-diag "Generated app is in $dir";
+note "Generated app is in $dir";
 
 chdir $dir or die "Cannot chdir to $dir: $!";
 
@@ -87,8 +95,7 @@ create_ok($_, 'My' . $_) for qw/Model View Controller/;
 
 command_ok( [ $^X, 'Makefile.PL' ] );
 ok -e "Makefile", "Makefile generated";
-#NOTE: do not assume that 'make' is always 'make' as e.g. Win32/strawberry perl uses 'dmake'
-command_ok( [ ($Config{make} || 'make') ] );
+command_ok( [ $MAKE ] );
 
 run_generated_component_tests();
 
@@ -126,8 +133,8 @@ my $server_script_new = do {
 
 is $server_script, $server_script_new;
 
-diag "Installed app is in $instdir";
-command_ok( [ ($Config{make} || 'make', 'install') ] );
+note "Installed app is in $instdir";
+command_ok( [ $MAKE, 'install' ] );
 
 my $inst_app_dir = catdir($instdir);
 chdir($inst_app_dir) or die "Cannot chdir to $inst_app_dir: $!";
@@ -164,22 +171,26 @@ done_testing;
 
 sub command_ok {
     my $cmd = shift;
-    my $desc = shift;
+    my $desc = shift || "Exit status ok for '@{$cmd}'";
 
-    my $stdout;
-    my $stderr;
-    run3( $cmd, \undef, \$stdout, \$stderr );
+    open my $stdin, '<', $devnull
+        or die "Cannot read $devnull: $!";
 
-    $desc ||= "Exit status ok for '@{$cmd}'";
-    unless ( is $? >> 8, 0, $desc ) {
-        diag "STDOUT:\n$stdout" if defined $stdout;
-        diag "STDERR:\n$stderr" if defined $stderr;
-    }
+    my $pid = open3( $stdin, my $stdout, undef, @$cmd );
+    my $output = do { local $/; <$stdout> };
+    waitpid $pid, 0;
+
+    my $result = is $?, 0, $desc;
+
+    diag "output:\n$output"
+      if !$result;
+
+    return $result;
 }
 
 sub runperl {
     my $comment = pop @_;
-    command_ok( [ $^X, '-I', catdir($Bin, '..', 'lib'), @_ ], $comment );
+    command_ok( [ $^X, '-I', $helper_lib, @_ ], $comment );
 }
 
 my @generated_component_tests;