#!perl
use warnings;
use strict;
use Test::More tests => 22;
use utf8;
use lib 't'; use Utils;
use Guard qw/guard/;
BEGIN { use_ok('Feersum') };
my ($socket,$port) = get_listen_socket();
ok $socket, "made listen socket";
ok $socket->fileno, "has a fileno";
my $guard_fired = 0;
my $cv;
my $endjinn = Feersum->new();
$endjinn->use_socket($socket);
$endjinn->request_handler(sub {
my $r = shift;
$r->response_guard(guard {
$guard_fired++;
fail "guard called (should get cancelled)";
});
$r->response_guard->cancel;
is $guard_fired, 0, "guard didn't fire yet (cancelled)";
$r->response_guard(guard {
$guard_fired++;
$cv->end;
pass "guard called";
});
$r->send_response(200,[],\"OK");
pass 'sent response';
});
$cv = AE::cv;
$guard_fired = 0;
$cv->begin;
$cv->begin; # for the guard
my $w1 = simple_client GET => '/simple',
timeout => 3,
sub {
my ($body, $hdr) = @_;
is $hdr->{Status}, 200, "client got 200";
is $body, 'OK', 'plain old body';
$cv->end;
};
$cv->recv;
is $guard_fired, 1, "guard fired only once";
pass 'done simple guard';
$endjinn->request_handler(sub {
my $r = shift;
my $env = $r->env;
ok $env->{'psgix.output.guard'}, 'env says the writer has this guard';
scope_for_writer: {
my $w = $r->start_streaming(200,[]);
$w->response_guard(guard {
$guard_fired++;
fail "guard called (should get cancelled)";
});
$w->response_guard->cancel;
is $guard_fired, 0, "guard didn't fire yet (cancelled)";
$w->response_guard(guard {
$guard_fired++;
pass "stream writer guard called";
});
$w->write("STREAM OK");
is $guard_fired, 0, "guard didn't fire yet (not closed)";
$w->close();
}
is $guard_fired, 0, "guard didn't fire yet (closed, not gc)";
pass 'sent response';
});
$cv = AE::cv;
$cv->begin;
$guard_fired = 0;
my $w2 = simple_client GET => '/streamer',
timeout => 3,
sub {
my ($body, $hdr) = @_;
is $hdr->{Status}, 200, "client got 200";
is $body, 'STREAM OK', 'plain old body';
$cv->end;
};
$cv->recv;
is $guard_fired, 1, "guard fired only once";
pass "all done";