From: Eden Cardim Date: Sat, 15 Oct 2011 22:44:56 +0000 (+0000) Subject: scanning for open port after failing to open server on the default test port X-Git-Tag: 0.57~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FTest-WWW-Mechanize-Catalyst.git;a=commitdiff_plain;h=6435acdcab63d866a5eba6d434b356cadba89588 scanning for open port after failing to open server on the default test port --- diff --git a/t/lib/ExternalCatty.pm b/t/lib/ExternalCatty.pm index e16cf60..9924cab 100644 --- a/t/lib/ExternalCatty.pm +++ b/t/lib/ExternalCatty.pm @@ -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; diff --git a/t/multi_content_type.t b/t/multi_content_type.t index 4fb0a25..f0bf615 100644 --- a/t/multi_content_type.t +++ b/t/multi_content_type.t @@ -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;