1package MyComponent;
2use strict;
3use warnings;
4use Test::More;
5use Scalar::Util qw/weaken/;
6use parent 'Plack::Component';
7
8sub call {
9    my $self = shift;
10    my $env = shift;
11
12    if( $env->{PATH_INFO} eq '/run_response_cb' ){
13        my $my;
14
15        # Record $res and $cb
16        $self->{res} = [200, ['Content-Type' => 'text/plain'], ['OK']];
17        $self->{cb}  = sub { $my }; # Contain $my to be regard as a closure.
18
19        return $self->response_cb($self->{res}, $self->{cb});
20    }else{
21        # Decrease REFCNT
22        weaken $self->{res};
23        weaken $self->{cb};
24
25        # Check if references are released.
26        return [ 200, [
27            'Content-Type' => 'text/plain',
28            'X-Res-Freed'  => ! $self->{res},
29            'X-Cb-Freed'   => ! $self->{cb},
30        ], ['HELLO'] ];
31    }
32}
33
34
35package main;
36use strict;
37use warnings;
38use Test::More;
39use Plack::Test;
40use HTTP::Request::Common;
41$Plack::Test::Impl = "Server";
42local $ENV{PLACK_SERVER} = "HTTP::Server::PSGI";
43
44my $app = MyComponent->new;
45test_psgi( $app->to_app, sub {
46    my $cb = shift;
47    $cb->(GET '/run_response_cb');
48
49    my $req = $cb->(GET '/check');
50    ok $req->header('X-Res-Freed'), '$res has been released.';
51    ok $req->header('X-Cb-Freed') , '$cb has been released.';
52} );
53
54done_testing;
55