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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
#!/usr/bin/perl -w
use HTML::Mason::Tests;
use strict;
BEGIN
{
if ($] < 5.006)
{
print "1..0\n";
exit;
}
else
{
require Scalar::Util;
unless ( defined &Scalar::Util::weaken )
{
print "Your installation of Scalar::Util does not include the weaken subroutine\n";
print "1..0\n";
exit;
}
}
}
my $tests = make_tests();
$tests->run;
{
package InterpWatcher;
my $destroy_count = 0;
use base qw(HTML::Mason::Interp);
sub DESTROY { $destroy_count++ }
sub destroy_count { $destroy_count }
}
{
package RequestWatcher;
my $destroy_count = 0;
use base qw(HTML::Mason::Request);
sub DESTROY { $destroy_count++ }
sub destroy_count { $destroy_count }
}
sub make_tests
{
my $group = HTML::Mason::Tests->tests_class->new( name => '18-leak.t',
description => 'Tests that various memory leaks are no longer with us' );
$group->add_test( name => 'interp_destroy',
description => 'Test that interps with components in cache still get destroyed',
component => <<'EOF',
<%perl>
{
my $interp = InterpWatcher->new();
my $comp = $interp->make_component( comp_source => 'foo' );
}
$m->print("destroy_count = " . InterpWatcher->destroy_count . "\n");
{
my $interp = InterpWatcher->new();
my $comp = $interp->make_component( comp_source => 'foo' );
}
$m->print("destroy_count = " . InterpWatcher->destroy_count . "\n");
</%perl>
EOF
expect => <<'EOF',
destroy_count = 1
destroy_count = 2
EOF
);
#------------------------------------------------------------
$group->add_support( path => '/support/no_error_comp',
component => <<'EOF',
No error here.
EOF
);
#------------------------------------------------------------
$group->add_support( path => '/support/error_comp',
component => <<'EOF',
<%
EOF
);
#------------------------------------------------------------
$group->add_test( name => 'request_destroy',
description => 'Test that requests get destroyed after top-level component error',
interp_params => { request_class => 'RequestWatcher' },
component => <<'EOF',
<%perl>
eval { $m->subexec('support/no_error_comp') };
$m->print("destroy_count = " . RequestWatcher->destroy_count . "\n");
eval { $m->subexec('support/error_comp') };
$m->print("destroy_count = " . RequestWatcher->destroy_count . "\n");
eval { $m->subexec('support/not_found_comp') };
$m->print("destroy_count = " . RequestWatcher->destroy_count . "\n");
</%perl>
EOF
expect => <<'EOF',
No error here.
destroy_count = 1
destroy_count = 2
destroy_count = 3
EOF
);
#------------------------------------------------------------
return $group;
}
|