File: component-leak.t

package info (click to toggle)
libplack-perl 0.9989-1%2Bdeb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,556 kB
  • sloc: perl: 6,890; python: 6; makefile: 2
file content (54 lines) | stat: -rw-r--r-- 1,297 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package MyComponent;
use strict;
use warnings;
use Test::More;
use Scalar::Util qw/weaken/;
use parent 'Plack::Component';

sub call {
    my $self = shift;
    my $env = shift;

    if( $env->{PATH_INFO} eq '/run_response_cb' ){
        my $my;

        # Record $res and $cb
        $self->{res} = [200, ['Content-Type' => 'text/plain'], ['OK']];
        $self->{cb}  = sub { $my }; # Contain $my to be regard as a closure.

        return $self->response_cb($self->{res}, $self->{cb});
    }else{
        # Decrease REFCNT
        weaken $self->{res};
        weaken $self->{cb};

        # Check if references are released.
        return [ 200, [
            'Content-Type' => 'text/plain',
            'X-Res-Freed'  => ! $self->{res},
            'X-Cb-Freed'   => ! $self->{cb},
        ], ['HELLO'] ];
    }
}


package main;
use strict;
use warnings;
use Test::More;
use Plack::Test;
use HTTP::Request::Common;
$Plack::Test::Impl = "Server";
local $ENV{PLACK_SERVER} = "HTTP::Server::PSGI";

my $app = MyComponent->new;
test_psgi( $app->to_app, sub {
    my $cb = shift;
    $cb->(GET '/run_response_cb');

    my $req = $cb->(GET '/check');
    ok $req->header('X-Res-Freed'), '$res has been released.';
    ok $req->header('X-Cb-Freed') , '$cb has been released.';
} );

done_testing;