This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
reorder 'struct block' fields.
[perl5.git] / cpan / IO-Socket-IP / t / 11sockopts.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use IO::Socket::IP;
9
10 use Errno qw( EACCES );
11 use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST );
12
13 TODO: {
14    local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin";
15    # I honestly have no idea why this fails, and people don't seem to be able
16    # to reproduce it on a development box. I'll mark it TODO for now until we
17    # can gain any more insight into it.
18
19    my $sock = IO::Socket::IP->new(
20       LocalHost => "127.0.0.1",
21       Type      => SOCK_STREAM,
22       Listen    => 1,
23       ReuseAddr => 1,
24    ) or die "Cannot socket() - $@";
25
26    ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' );
27 }
28
29 SKIP: {
30    # Some OSes don't implement SO_REUSEPORT
31    skip "No SO_REUSEPORT constant", 1 unless defined eval { SO_REUSEPORT };
32    skip "No support for SO_REUSEPORT", 1 unless defined eval {
33       my $s;
34       socket( $s, Socket::PF_INET, Socket::SOCK_STREAM, 0 ) and
35          setsockopt( $s, SOL_SOCKET, SO_REUSEPORT, 1 ) };
36
37    my $sock = IO::Socket::IP->new(
38       LocalHost => "127.0.0.1",
39       Type      => SOCK_STREAM,
40       Listen    => 1,
41       ReusePort => 1,
42    ) or die "Cannot socket() - $@";
43
44    ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' );
45 }
46
47 SKIP: {
48    # Some OSes need special privileges to set SO_BROADCAST
49    $! = 0;
50    my $sock = IO::Socket::IP->new(
51       LocalHost => "127.0.0.1",
52       Type      => SOCK_DGRAM,
53       Broadcast => 1,
54    );
55    skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES;
56    die "Cannot socket() - $@" unless $sock;
57
58    ok( $sock->getsockopt( SOL_SOCKET, SO_BROADCAST ), 'SO_BROADCAST set' );
59 }
60
61 done_testing;