This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update IO-Socket-IP to CPAN version 0.32
[perl5.git] / cpan / IO-Socket-IP / t / 16v6only.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use Socket qw(PF_INET6 PF_INET IPPROTO_IPV6 IPV6_V6ONLY);
9 use IO::Socket::IP;
10
11 eval { IO::Socket::IP->new( LocalHost => "::1" ) } or
12    plan skip_all => "Unable to bind to ::1";
13
14 eval { defined IPV6_V6ONLY } or
15    plan skip_all => "IPV6_V6ONLY not available";
16
17 # Don't be locale-sensitive
18 $! = Errno::ECONNREFUSED;
19 my $ECONNREFUSED_STR = "$!";
20
21 {
22    my $listensock = IO::Socket::IP->new(
23       Listen    => 1,
24       Family    => PF_INET6,
25       LocalPort => 0,
26       Type      => SOCK_STREAM,
27       V6Only    => 1,
28       GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
29    ) or die "Cannot listen on PF_INET6 - $@";
30
31    is( $listensock->getsockopt( IPPROTO_IPV6, IPV6_V6ONLY ), 1, 'IPV6_V6ONLY is 1 on $listensock' );
32
33    my $testsock = IO::Socket::IP->new(
34       Family   => PF_INET,
35       PeerHost => "127.0.0.1",
36       PeerPort => $listensock->sockport,
37       Type     => SOCK_STREAM,
38       GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
39    );
40    my $err = "$@";
41
42    ok( !defined $testsock, 'Unable to connect PF_INET socket to PF_INET6 socket with V6Only true' );
43    like( $err, qr/\Q$ECONNREFUSED_STR/, 'Socket creation fails with connection refused' );
44 }
45
46 SKIP: {
47    skip "This platform does not allow turning IPV6_V6ONLY off", 3 unless IO::Socket::IP->CAN_DISABLE_V6ONLY;
48
49    local $ENV{LANG} = "C"; # avoid locale-dependent error messages
50
51    my $listensock = IO::Socket::IP->new(
52       Listen    => 1,
53       Family    => PF_INET6,
54       LocalPort => 0,
55       Type      => SOCK_STREAM,
56       V6Only    => 0,
57       GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
58    ) or die "Cannot listen on PF_INET6 - $@";
59
60    is( $listensock->getsockopt( IPPROTO_IPV6, IPV6_V6ONLY ), 0, 'IPV6_V6ONLY is 0 on $listensock' );
61
62    my $testsock = IO::Socket::IP->new(
63       Family   => PF_INET,
64       PeerHost => "127.0.0.1",
65       PeerPort => $listensock->sockport,
66       Type     => SOCK_STREAM,
67       GetAddrInfoFlags => 0, # disable AI_ADDRCONFIG
68    );
69    my $err = "$@";
70
71    ok( defined $testsock, 'Connected PF_INET socket to PF_INET6 socket with V6Only false' ) or
72       diag( "IO::Socket::IP->new failed - $err" );
73    is( $testsock->peerport, $listensock->sockport, 'Test socket connected to correct peer port' );
74 }
75
76 done_testing;