Net-QUIC

 view release on metacpan or  search on metacpan

t/19-local-address.t  view on Meta::CPAN

use strict;
use warnings;

use FindBin ();
use Socket qw(inet_aton pack_sockaddr_in);
use Test2::V0;

use Net::QUIC::Driver;
use Net::QUIC::Endpoint;

my $cert_file = "$FindBin::Bin/data/server-cert.pem";
my $key_file = "$FindBin::Bin/data/server-key.pem";

my $wildcard_v4 = pack_sockaddr_in(
    4433,
    inet_aton('0.0.0.0'),
);

my $loopback_v4 = pack_sockaddr_in(
    4433,
    inet_aton('127.0.0.1'),
);

like(
    dies {
        Net::QUIC::Endpoint->client(
            local       => $wildcard_v4,
            peer        => $loopback_v4,
            alpn        => 'local-address-test',
            server_name => 'localhost',
            ca_file     => $cert_file,
        );
    },
    qr/local must be a concrete IPv4 or IPv6 address/,
    'client rejects an IPv4 wildcard as its QUIC local path',
);

my $server = Net::QUIC::Endpoint->server(
    alpn             => 'local-address-test',
    certificate_file => $cert_file,
    private_key_file => $key_file,
);

like(
    dies {
        $server->receive_datagram(
            "not a QUIC packet",
            $wildcard_v4,
            $loopback_v4,
        );
    },
    qr/local must be a concrete IPv4 or IPv6 address/,
    'server receive rejects an IPv4 wildcard local path',
);

ok(
    !dies {
        $server->receive_datagram(
            "not a QUIC packet",
            $loopback_v4,
            $loopback_v4,
        );
    },
    'server receive accepts a concrete IPv4 local path',
);

my $driver = Net::QUIC::Driver->server(
    alpn             => 'local-address-test',
    certificate_file => $cert_file,
    private_key_file => $key_file,
    send             => sub { 1 },
    set_timeout      => sub { return },
);

$driver->start;

like(
    dies {
        $driver->receive(
            "not a QUIC packet",
            $wildcard_v4,
            $loopback_v4,
        );
    },
    qr/local must be a concrete IPv4 or IPv6 address/,
    'Driver receive exposes the same concrete-local contract',
);

SKIP: {
    skip 'Socket IPv6 packing is unavailable', 2
        if !Socket->can('pack_sockaddr_in6')
        || !Socket->can('inet_pton')
        || !Socket->can('AF_INET6');

    my $af_inet6 = Socket::AF_INET6();
    my $wildcard_v6 = Socket::pack_sockaddr_in6(
        4433,
        Socket::inet_pton($af_inet6, '::'),
    );
    my $loopback_v6 = Socket::pack_sockaddr_in6(
        4433,
        Socket::inet_pton($af_inet6, '::1'),
    );

    like(
        dies {
            Net::QUIC::Endpoint->client(
                local       => $wildcard_v6,
                peer        => $loopback_v6,
                alpn        => 'local-address-test',
                server_name => 'localhost',
                ca_file     => $cert_file,
            );
        },
        qr/local must be a concrete IPv4 or IPv6 address/,
        'client rejects an IPv6 wildcard as its QUIC local path',
    );

    ok(
        !dies {
            my $ipv6_server = Net::QUIC::Endpoint->server(
                alpn             => 'local-address-test',
                certificate_file => $cert_file,
                private_key_file => $key_file,
            );

            $ipv6_server->receive_datagram(
                "not a QUIC packet",
                $loopback_v6,
                $loopback_v6,
            );
        },
        'server receive accepts a concrete IPv6 local path',
    );
}

done_testing;



( run in 2.058 seconds using v1.01-cache-2.11-cpan-036bef1c656 )