Added a test for auto-restart feature
Andy Grundman [Tue, 18 Oct 2005 03:51:28 +0000 (03:51 +0000)]
t/optional/http-server-restart.t [new file with mode: 0644]

diff --git a/t/optional/http-server-restart.t b/t/optional/http-server-restart.t
new file mode 100644 (file)
index 0000000..da1b313
--- /dev/null
@@ -0,0 +1,114 @@
+#!perl\r
+\r
+# This test tests the standalone server's auto-restart feature.\r
+\r
+use strict;\r
+use warnings;\r
+\r
+use File::Path;\r
+use FindBin;\r
+use LWP::Simple;\r
+use IO::Socket;\r
+use Test::More;\r
+use Time::HiRes qw/sleep/;\r
+eval "use File::Copy::Recursive";\r
+\r
+plan skip_all => 'set TEST_HTTP to enable this test' unless $ENV{TEST_HTTP};\r
+plan skip_all => 'File::Copy::Recursive required' if $@;\r
+\r
+plan tests => 40;\r
+\r
+# clean up\r
+rmtree "$FindBin::Bin/../../t/var" if -d "$FindBin::Bin/../../t/var";\r
+\r
+# create a TestApp and copy the test libs into it\r
+mkdir "$FindBin::Bin/../../t/var";\r
+chdir "$FindBin::Bin/../../t/var";\r
+system "$FindBin::Bin/../../script/catalyst.pl TestApp";\r
+chdir "$FindBin::Bin/../..";\r
+File::Copy::Recursive::dircopy( 't/live/lib', 't/var/TestApp/lib' );\r
+\r
+# spawn the standalone HTTP server\r
+my $port = 30000 + int rand(1 + 10000);\r
+my $pid = open my $server, \r
+    "$FindBin::Bin/../../t/var/TestApp/script/testapp_server.pl -port $port -restart 2>&1 |"\r
+    or die "Unable to spawn standalone HTTP server: $!";\r
+\r
+# wait for it to start\r
+print "Waiting for server to start...\n";\r
+while ( check_port( 'localhost', $port ) != 1 ) {\r
+    sleep 1;\r
+}\r
+\r
+# change various files\r
+my @files = (\r
+    "$FindBin::Bin/../../t/var/TestApp/lib/TestApp.pm",\r
+    "$FindBin::Bin/../../t/var/TestApp/lib/TestApp/Controller/Action/Begin.pm",\r
+    "$FindBin::Bin/../../t/var/TestApp/lib/TestApp/Controller/Engine/Request/URI.pm",\r
+);\r
+\r
+# change some files and make sure the server restarts itself\r
+for ( 1..20 ) {\r
+    my $index = rand @files;\r
+    open my $pm, '>>', $files[$index]\r
+        or die "Unable to open $files[$index] for writing: $!";\r
+    print $pm "\n";\r
+    close $pm;\r
+    \r
+    # give the server time to notice the change and restart\r
+    my $count = 0;\r
+    sleep 1;\r
+    while ( check_port( 'localhost', $port ) != 1 ) {\r
+        # wait for it to restart\r
+        sleep 0.1;\r
+        die "Server appears to have died" if $count++ > 50;\r
+    }\r
+    my $response = get("http://localhost:$port/action/default");\r
+    like( $response, qr/Catalyst::Request/, 'Request OK' );\r
+    \r
+    #print $server->getline;\r
+}\r
+\r
+# add errors to the file and make sure server does not die or restart\r
+for ( 1..20 ) {\r
+    my $index = rand @files;\r
+    open my $pm, '>>', $files[$index]\r
+        or die "Unable to open $files[$index] for writing: $!";\r
+    print $pm "bleh";\r
+    close $pm;\r
+    \r
+    # give the server time to notice the change\r
+    my $count = 0;\r
+    sleep 1;\r
+    if ( check_port( 'localhost', $port ) != 1 ) {\r
+        die "Server appears to have died";\r
+    }\r
+    my $response = get("http://localhost:$port/action/default");\r
+    like( $response, qr/Catalyst::Request/, 'Request OK' );\r
+    \r
+    #print $server->getline;\r
+}\r
+\r
+# shut it down\r
+kill 2, $pid;\r
+close $server;\r
+\r
+# clean up\r
+rmtree "$FindBin::Bin/../../t/var" if -d "$FindBin::Bin/../../t/var";\r
+\r
+sub check_port {\r
+    my ( $host, $port ) = @_;\r
+\r
+    my $remote = IO::Socket::INET->new(\r
+        Proto    => "tcp",\r
+        PeerAddr => $host,\r
+        PeerPort => $port\r
+    );\r
+    if ($remote) {\r
+        close $remote;\r
+        return 1;\r
+    }\r
+    else {\r
+        return 0;\r
+    }\r
+}\r