include test for failure mode
[catagits/Catalyst-Runtime.git] / t / optional_http-server-restart.t
index 10e8a60..39f475a 100644 (file)
@@ -1,19 +1,22 @@
-#!perl
-
 # This test tests the standalone server's auto-restart feature.
 
 use strict;
 use warnings;
 
+use Test::More;
+BEGIN {
+    plan skip_all => 'set TEST_HTTP to enable this test' unless $ENV{TEST_HTTP};
+}
+
 use File::Path;
 use FindBin;
 use LWP::Simple;
 use IO::Socket;
-use Test::More;
+use IPC::Open3;
+use Catalyst::Engine::HTTP::Restarter::Watcher;
 use Time::HiRes qw/sleep/;
 eval "use Catalyst::Devel 1.0;";
 
-plan skip_all => 'set TEST_HTTP to enable this test' unless $ENV{TEST_HTTP};
 plan skip_all => 'Catalyst::Devel required' if $@;
 plan skip_all => 'Catalyst::Devel >= 1.04 required' if $Catalyst::Devel::VERSION <= 1.03;
 eval "use File::Copy::Recursive";
@@ -21,14 +24,17 @@ plan skip_all => 'File::Copy::Recursive required' if $@;
 
 plan tests => 120;
 
+my $tmpdir = "$FindBin::Bin/../t/tmp";
+
 # clean up
-rmtree "$FindBin::Bin/../t/tmp" if -d "$FindBin::Bin/../t/tmp";
+rmtree $tmpdir if -d $tmpdir;
 
 # create a TestApp and copy the test libs into it
-mkdir "$FindBin::Bin/../t/tmp";
-chdir "$FindBin::Bin/../t/tmp";
-system
-  "perl -I$FindBin::Bin/../lib $FindBin::Bin/../script/catalyst.pl TestApp";
+mkdir $tmpdir;
+chdir $tmpdir;
+
+system( $^X, "-I$FindBin::Bin/../lib", "$FindBin::Bin/../script/catalyst.pl", 'TestApp' );
+
 chdir "$FindBin::Bin/..";
 File::Copy::Recursive::dircopy( 't/lib', 't/tmp/TestApp/lib' );
 
@@ -38,9 +44,12 @@ rmtree 't/tmp/TestApp/t';
 # spawn the standalone HTTP server
 my $port = 30000 + int rand( 1 + 10000 );
 
-my $pid  = open my $server,
-"perl -I$FindBin::Bin/../lib $FindBin::Bin/../t/tmp/TestApp/script/testapp_server.pl -port $port -restart 2>&1 |"
-  or die "Unable to spawn standalone HTTP server: $!";
+my( $server, $pid );
+$pid = open3( undef, $server, undef,
+  $^X, "-I$FindBin::Bin/../lib",
+  "$FindBin::Bin/../t/tmp/TestApp/script/testapp_server.pl", '-port',
+  $port, '-restart' )
+    or die "Unable to spawn standalone HTTP server: $!";
 
 # switch to non-blocking reads so we can fail
 # gracefully instead of just hanging forever
@@ -57,9 +66,12 @@ while ( check_port( 'localhost', $port ) != 1 ) {
 my @files = (
     "$FindBin::Bin/../t/tmp/TestApp/lib/TestApp.pm",
     "$FindBin::Bin/../t/tmp/TestApp/lib/TestApp/Controller/Action/Begin.pm",
-"$FindBin::Bin/../t/tmp/TestApp/lib/TestApp/Controller/Engine/Request/URI.pm",
+    "$FindBin::Bin/../t/tmp/TestApp/lib/TestApp/Controller/Immutable.pm",
 );
 
+push(@files, "$FindBin::Bin/../t/tmp/TestApp/lib/TestApp/Controller/Immutable/HardToReload.pm")
+    if Catalyst::Engine::HTTP::Restarter::Watcher::DETECT_PACKAGE_COMPILATION();
+
 # change some files and make sure the server restarts itself
 NON_ERROR_RESTART:
 for ( 1 .. 20 ) {
@@ -167,9 +179,11 @@ my $restartdirs = join ' ', map{
     "-restartdirectory $app_root/lib/TestApp/Controller/$_"
 } qw/Action Engine/;
 
-$pid  = open $server,
-"perl -I$FindBin::Bin/../lib $FindBin::Bin/../t/tmp/TestApp/script/testapp_server.pl -port $port -restart $restartdirs 2>&1 |"
-  or die "Unable to spawn standalone HTTP server: $!";
+$pid = open3( undef, $server, undef,
+  $^X, "-I$FindBin::Bin/../lib",
+  "$FindBin::Bin/../t/tmp/TestApp/script/testapp_server.pl", '-port',
+  $port, '-restart', $restartdirs )
+    or die "Unable to spawn standalone HTTP server: $!";
 $server->blocking( 0 );
 
 
@@ -197,7 +211,7 @@ for ( 1 .. 20 ) {
         sleep 0.1;
         if ( $count++ > 100 ) {
             fail "Server restarted";
-            SKIP_NO_RESTART_2: {
+            SKIP: {
                 skip "Server didn't restart, no sense in checking response", 1;
             }
             next MULTI_DIR_RESTART;