Net-QUIC

 view release on metacpan or  search on metacpan

t/28-ecn.t  view on Meta::CPAN

use strict;
use warnings;

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

use Net::QUIC::Endpoint;

my $cert_file = "$FindBin::Bin/data/server-cert.pem";
my $key_file = "$FindBin::Bin/data/server-key.pem";
my $alpn = 'net-quic-ecn-test';

sub make_pair {
    my ($client_port, $server_port) = @_;

    my $client_local = pack_sockaddr_in(
        $client_port,
        inet_aton('127.0.0.1'),
    );
    my $server_local = pack_sockaddr_in(
        $server_port,
        inet_aton('127.0.0.1'),
    );

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

    my $client = Net::QUIC::Endpoint->client(
        local       => $client_local,
        peer        => $server_local,
        alpn        => $alpn,
        server_name => 'localhost',
        ca_file     => $cert_file,
    );

    return ($client, $server);
}

sub pump {
    my ($client, $server, %args) = @_;
    my $progress = 0;
    my $accepted = $args{accepted};
    my $client_marks = $args{client_marks};
    my $server_marks = $args{server_marks};
    my $strip = $args{strip} ? 1 : 0;

    while (my $datagram = $server->next_datagram) {
        ++$progress;
        push @$server_marks, $datagram->ecn if $server_marks;

        $client->receive_datagram(
            $datagram->data,
            $datagram->peer,
            $datagram->local,
            $strip ? 0 : $datagram->ecn,
        );
    }

    while (my $datagram = $client->next_datagram) {
        ++$progress;
        push @$client_marks, $datagram->ecn if $client_marks;

        $server->receive_datagram(
            $datagram->data,
            $datagram->peer,
            $datagram->local,
            $strip ? 0 : $datagram->ecn,
        );
    }

    $$accepted ||= $server->next_connection if $accepted;

    my @wait;

    my $client_after = $client->timeout_after;
    if (defined($client_after) && $client_after <= 0) {
        ++$progress;
        $client->handle_timeout;
    } elsif (defined($client_after) && $client_after > 0) {
        push @wait, $client_after;
    }

    my $server_after = $server->timeout_after;
    if (defined($server_after) && $server_after <= 0) {
        ++$progress;



( run in 0.657 second using v1.01-cache-2.11-cpan-036bef1c656 )