use Test::More;
eval "use GTop ()";
if ($@) {
plan skip_all => 'No GTop installed, no memory leak tests';
} else {
plan tests => 3;
}
use HTML::GenerateUtil qw(:consts escape_html generate_attributes generate_tag);
use strict;
my $NIter = 10000;
my $GTop = GTop->new;
TestLeak(\&escape_html_leak);
TestLeak(\&generate_attributes_leak);
TestLeak(\&generate_tag_leak);
sub escape_html_leak {
for (1 .. $NIter) {
my $a = escape_html('abc', 0);
my $b = escape_html('b"c&', 0);
my ($t1, $t2) = ('abc', 'b"c&');
my $c = escape_html($t1, EH_INPLACE);
my $d = escape_html($t2, EH_INPLACE);
$t1 = escape_html($t1, EH_INPLACE);
$t2 = escape_html($t2, EH_INPLACE);
my $e = escape_html('abc', EH_LFTOBR);
my $f = escape_html('b"c&' . "\n", EH_LFTOBR);
my $g = escape_html('abc' . "\x{1234}", 0);
my $h = escape_html('b"c&' . "\x{1234}", 0);
($t1, $t2) = ('abc' . "\x{1234}", 'b"c&' . "\x{1234}");
my $i = escape_html($t1, EH_INPLACE);
my $j = escape_html($t2, EH_INPLACE);
$t1 = escape_html($t1, EH_INPLACE);
$t2 = escape_html($t2, EH_INPLACE);
my $k = escape_html(' ', EH_SPTONBSP);
my $l = escape_html(' ', EH_SPTONBSP);
($t1, $t2) = (' ', ' ');
my $m = escape_html($t1, EH_INPLACE | EH_SPTONBSP);
my $n = escape_html($t2, EH_INPLACE | EH_SPTONBSP);
$t1 = escape_html($t1, EH_INPLACE | EH_SPTONBSP);
$t2 = escape_html($t2, EH_INPLACE | EH_SPTONBSP);
my $o = "<&1234;abc& &abc&xabc1;&asd";
$t1 = escape_html($o, EH_INPLACE | EH_LEAVEKNOWN);
}
}
sub generate_attributes_leak {
for (1 .. $NIter) {
my $a = generate_attributes({ a => 'abc' });
my $b = generate_attributes({ a => 'abc', d => 'efg' });
my $c = generate_attributes({ ALongerString => 'abc', AnotherLongerString => 'efg' });
my $d = generate_attributes({ ALongerString => 'And something with funnies <>&"', AnotherLongerString => 'something with funnies <>&" efg' });
my $i = generate_attributes({ a => 'abc' . "\x{1234}" });
my $k = generate_attributes({ ALongerString => 'abc', AnotherLongerString => 'efg' . "\x{1234}" });
}
}
sub generate_tag_leak {
for (1 .. $NIter) {
my $a = generate_tag('tag', undef, undef, 0);
my $b = generate_tag('tag', { a => 'abc' }, undef, 0);
my $d = generate_tag('tag', undef, 'some text', 0);
my $e = generate_tag('tag', { a => 'abc' }, 'some text', 0);
my $f = generate_tag('tag', { a => 'abc' }, 'some <>&; text', GT_ESCAPEVAL);
my $g = generate_tag('tag', { a => 'abc' }, 'some <>&; text' . "\x{1234}", GT_ESCAPEVAL);
my $h = generate_tag(123, { a => 'abc' }, 123, GT_ESCAPEVAL);
my $i = generate_tag(-123123123, { a => 'abc' }, -123123123, GT_ESCAPEVAL);
}
}
sub TestLeak {
my $Sub = shift;
my $Before = $GTop->proc_mem($$)->size;
eval {
$Sub->();
};
if ($@) {
ok(0, "leak test died: $@");
} else {
my $After = $GTop->proc_mem($$)->size;
my $Growth = ($After - $Before)/1024;
ok( $Growth < 20, "leak test > 20k? Growth=${Growth}k");
}
}