use strict;
use warnings;
use AnyEvent::HTTP qw(http_get);
use Plack::Builder;
use Plack::Loader;
use Test::More tests => 4;
use Test::TCP qw(test_tcp);
use Time::HiRes qw(time);
sub run_test {
my ( $app ) = @_;
test_tcp(
client => sub {
my ( $port ) = @_;
my $cond = AnyEvent->condvar;
my $nrequests = 2;
for(1..2) {
http_get "http://localhost:$port", sub {
my ( $data, $headers ) = @_;
$cond->send unless --$nrequests;
};
}
my $start = time;
$cond->recv;
my $end = time;
my $diff = $end - $start;
ok $diff >= 5, "Two concurrent requests with a delay of five seconds should take no fewer than five seconds...";
ok $diff <= 10, "...and no more than ten.";
},
server => sub {
my ( $port ) = @_;
Plack::Loader->load('Twiggy', port => $port)->run($app);
},
);
}
my $app = sub {
return [
200,
['Content-Type' => 'text/plain'],
['Ok!'],
];
};
my $wrapped = builder {
enable 'Delay', delay => 5, sleep_fn => sub {
my ( $delay, $invoke ) = @_;
my $timer;
$timer = AnyEvent->timer(
after => $delay,
cb => sub {
undef $timer;
$invoke->();
},
);
};
$app;
};
run_test $wrapped;
$app = sub {
return sub {
my ( $respond ) = @_;
$respond->([
200,
['Content-Type' => 'text/plain'],
['Ok!'],
]);
};
};
$wrapped = builder {
enable 'Delay', delay => 5, sleep_fn => sub {
my ( $delay, $invoke ) = @_;
my $timer;
$timer = AnyEvent->timer(
after => $delay,
cb => sub {
undef $timer;
$invoke->();
},
);
};
$app;
};
run_test $wrapped;