scanning for open port after failing to open server on the default test port
Eden Cardim [Sat, 15 Oct 2011 22:44:56 +0000 (22:44 +0000)]
t/lib/ExternalCatty.pm
t/multi_content_type.t

index e16cf60..9924cab 100644 (file)
@@ -2,26 +2,44 @@ package ExternalCatty;
 use strict;
 use warnings;
 use Catalyst;
+use IO::Socket::INET;
 
 __PACKAGE__->config( name => 'ExternalCatty' );
 __PACKAGE__->setup;
 __PACKAGE__->setup_engine('HTTP');
 
+sub MAX_PORT_TRIES() { 5 }
+
 # The Cat HTTP server background option is useless here :-(
 # Thus we have to provide our own background method.
 sub background {
     my $self  = shift;
     my $port  = shift;
+    $port = $self->assert_or_find_available_port($port);
     my $child = fork;
     die "Can't fork Cat HTTP server: $!" unless defined $child;
-    return $child if $child;
+    return($child, $port) if $child;
 
     if ( $^O !~ /MSWin32/ ) {
         require POSIX;
         POSIX::setsid() or die "Can't start a new session: $!";
     }
 
-    $self->run($port);
+    return($self->run($port), $port);
+}
+
+sub assert_or_find_available_port {
+    my($self, $port) = @_;
+    for my $i (1..MAX_PORT_TRIES) {
+        IO::Socket::INET->new(
+            LocalAddr => 'localhost',
+            LocalPort => $port,
+            Proto     => 'tcp'
+        ) and return $port;
+        $port += int(rand 100) + 1;
+    }
+    die q{Can't find an open port to run external server on after }
+        . MAX_PORT_TRIES . q{tries};
 }
 
 1;
index 4fb0a25..f0bf615 100644 (file)
@@ -7,7 +7,6 @@ my $PORT;
 
 BEGIN {
     $PORT = $ENV{TWMC_TEST_PORT} || 7357;
-    $ENV{CATALYST_SERVER} ||= "http://localhost:$PORT";
 }
 
 use Test::More tests => 9;
@@ -27,7 +26,9 @@ BEGIN {
 $SIG{INT} = sub { warn "INT:$$"; exit };
 
 use_ok 'ExternalCatty';
-my $pid = ExternalCatty->background($PORT);
+my $pid;
+($pid, $PORT) = ExternalCatty->background($PORT);
+$ENV{CATALYST_SERVER} ||= "http://localhost:$PORT";
 
 use Test::WWW::Mechanize::Catalyst;
 my $m = Test::WWW::Mechanize::Catalyst->new;