The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use warnings;
use strict;
use constant CLIENTS => 10;
use Test::More;

BEGIN {
    if (eval q{
        require Test::LeakTrace; $Test::LeakTrace::VERSION >= 0.13
    }) {
        plan tests => 7 + 4*CLIENTS;
    }
    else {
        plan skip_all => "Need Test::LeakTrace >= 0.13 to run this test"
    }
}

use lib 't'; use Utils;
use Test::LeakTrace;
BEGIN { use_ok('Feersum') };

my ($socket,$port) = get_listen_socket();
ok $socket, "made listen socket";

my $evh = Feersum->new();
{
    no warnings 'redefine';
    *Feersum::DIED = sub {
        my $err = shift;
        fail "Died during request handler: $err";
    };
}
$evh->use_socket($socket);

my $APP = <<'EOAPP';
    my $app = sub {
        return [200, ['Content-Type' => 'text/plain'], ['Hello ','World']];
    };
EOAPP

my $app = eval $APP;
ok $app, 'got an app' || diag $@;
$evh->psgi_request_handler($app);


my $cv = AE::cv;
no_leaks_ok {
    return unless $cv;

    for my $n (1 .. CLIENTS) {
        $cv->begin;
        my $h; $h = simple_client GET => '/',
            name => "($n)",
        sub {
            my ($body, $headers) = @_;
            is $headers->{'Status'}, 200, "($n) Response OK";
            is $headers->{'content-type'}, 'text/plain', "... ($n) is text";
            is $body, 'Hello World', "... ($n) correct body";
            $cv->end;
            undef $h;
        };

    }

    $cv->recv;
    pass "done requests";
    $cv = undef;
} 'request leaks';

$cv = AE::cv;
no_leaks_ok {
    return unless $cv;
    $evh->graceful_shutdown(sub { $cv->send });
    $cv->recv;
    pass "done graceful shutdown";
    undef $cv;
    undef $evh;
} 'graceful shutdown leaks';