Blame t/11sockopts.t

Packit 8bbd3c
#!/usr/bin/perl
Packit 8bbd3c
Packit 8bbd3c
use strict;
Packit 8bbd3c
use warnings;
Packit 8bbd3c
Packit 8bbd3c
use Test::More;
Packit 8bbd3c
Packit 8bbd3c
use IO::Socket::IP;
Packit 8bbd3c
Packit 8bbd3c
use Errno qw( EACCES );
Packit 8bbd3c
use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST );
Packit 8bbd3c
Packit 8bbd3c
TODO: {
Packit 8bbd3c
   local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin";
Packit 8bbd3c
   # I honestly have no idea why this fails, and people don't seem to be able
Packit 8bbd3c
   # to reproduce it on a development box. I'll mark it TODO for now until we
Packit 8bbd3c
   # can gain any more insight into it.
Packit 8bbd3c
Packit 8bbd3c
   my $sock = IO::Socket::IP->new(
Packit 8bbd3c
      LocalHost => "127.0.0.1",
Packit 8bbd3c
      Type      => SOCK_STREAM,
Packit 8bbd3c
      Listen    => 1,
Packit 8bbd3c
      ReuseAddr => 1,
Packit 8bbd3c
   ) or die "Cannot socket() - $@";
Packit 8bbd3c
Packit 8bbd3c
   ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' );
Packit 8bbd3c
Packit 8bbd3c
   $sock = IO::Socket::IP->new(
Packit 8bbd3c
      LocalHost => "127.0.0.1",
Packit 8bbd3c
      Type      => SOCK_STREAM,
Packit 8bbd3c
      Listen    => 1,
Packit 8bbd3c
      Sockopts  => [
Packit 8bbd3c
         [ SOL_SOCKET, SO_REUSEADDR ],
Packit 8bbd3c
      ],
Packit 8bbd3c
   ) or die "Cannot socket() - $@";
Packit 8bbd3c
Packit 8bbd3c
   ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set via Sockopts' );
Packit 8bbd3c
}
Packit 8bbd3c
Packit 8bbd3c
SKIP: {
Packit 8bbd3c
   # Some OSes don't implement SO_REUSEPORT
Packit 8bbd3c
   skip "No SO_REUSEPORT constant", 1 unless defined eval { SO_REUSEPORT };
Packit 8bbd3c
   skip "No support for SO_REUSEPORT", 1 unless defined eval {
Packit 8bbd3c
      my $s;
Packit 8bbd3c
      socket( $s, Socket::PF_INET, Socket::SOCK_STREAM, 0 ) and
Packit 8bbd3c
         setsockopt( $s, SOL_SOCKET, SO_REUSEPORT, 1 ) };
Packit 8bbd3c
Packit 8bbd3c
   my $sock = IO::Socket::IP->new(
Packit 8bbd3c
      LocalHost => "127.0.0.1",
Packit 8bbd3c
      Type      => SOCK_STREAM,
Packit 8bbd3c
      Listen    => 1,
Packit 8bbd3c
      ReusePort => 1,
Packit 8bbd3c
   ) or die "Cannot socket() - $@";
Packit 8bbd3c
Packit 8bbd3c
   ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' );
Packit 8bbd3c
}
Packit 8bbd3c
Packit 8bbd3c
SKIP: {
Packit 8bbd3c
   # Some OSes need special privileges to set SO_BROADCAST
Packit 8bbd3c
   $! = 0;
Packit 8bbd3c
   my $sock = IO::Socket::IP->new(
Packit 8bbd3c
      LocalHost => "127.0.0.1",
Packit 8bbd3c
      Type      => SOCK_DGRAM,
Packit 8bbd3c
      Broadcast => 1,
Packit 8bbd3c
   );
Packit 8bbd3c
   skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES;
Packit 8bbd3c
   die "Cannot socket() - $@" unless $sock;
Packit 8bbd3c
Packit 8bbd3c
   ok( $sock->getsockopt( SOL_SOCKET, SO_BROADCAST ), 'SO_BROADCAST set' );
Packit 8bbd3c
}
Packit 8bbd3c
Packit 8bbd3c
done_testing;