sub run_connect_test { require IO::Socket::INET; my $serversock = IO::Socket::INET->new( Type => Socket::SOCK_STREAM(), LocalAddr => "localhost", LocalPort => 0, Listen => 1, ) or die "Cannot socket()/listen() - $@"; # Some platforms have assigned 127.0.0.1 here; others have left 0.0.0.0 # If it's still 0.0.0.0, then guess that maybe connecting to 127.0.0.1 will # work my $sockname = ( $serversock->sockhost ne "0.0.0.0" ) ? $serversock->sockname : pack_sockaddr_in( $serversock->sockport, INADDR_LOOPBACK ); # ->connect success { my $clientsock = IO::Socket::INET->new( Type => Socket::SOCK_STREAM(), ) or die "Cannot socket() - $@"; $clientsock->blocking( 0 ); my $f = Future::IO->connect( $clientsock, $sockname ); $f->get; my $acceptedsock = $serversock->accept; ok( $clientsock->peername eq $acceptedsock->sockname, 'Accepted socket address matches' ); } $serversock->close; undef $serversock; # I really hate this, but apparently Win32 testers will fail if we don't # do this. sleep 1 if $^O eq "MSWin32"; # ->connect fails { my $clientsock = IO::Socket::INET->new( Type => Socket::SOCK_STREAM(), ) or die "Cannot socket() - $@"; $clientsock->blocking( 0 ); my $f = Future::IO->connect( $clientsock, $sockname ); ok( !eval { $f->get; 1 }, 'Future::IO->connect fails on closed server' ); is( [ $f->failure ], [ "connect: $errstr_ECONNREFUSED\n", connect => $clientsock, $errstr_ECONNREFUSED ], 'Future::IO->connect failure' ); } }