blob: 816b23c8e6ba948f7b578e6e29847c65d60924f7 [file] [log] [blame]
#!/usr/bin/perl -T
use constant HAVE_DEVEL_CYCLE => eval { require Devel::Cycle; };
BEGIN {
if (-e 't/test_dir') { # if we are running "t/rule_tests.t", kluge around ...
chdir 't';
}
if (-e 'test_dir') { # running from test directory, not ..
unshift(@INC, '../blib/lib');
}
}
my $prefix = '.';
if (-e 'test_dir') { # running from test directory, not ..
$prefix = '..';
}
use lib '.'; use lib 't';
use SATest; sa_t_init("memory_cycles");
use Test::More;
plan skip_all => "Devel::Cycle module required for this test" unless HAVE_DEVEL_CYCLE;
plan tests => 4;
use strict;
use Mail::SpamAssassin;
# ---------------------------------------------------------------------------
my $spamtest = Mail::SpamAssassin->new({
rules_filename => "$prefix/t/log/test_rules_copy",
site_rules_filename => "$prefix/t/log/test_default.cf",
userprefs_filename => "$prefix/masses/spamassassin/user_prefs",
local_tests_only => 1,
debug => 0,
dont_copy_prefs => 1,
});
$spamtest->init(0); # parse rules
ok($spamtest);
open (IN, "<data/spam/009");
my $dataref = [<IN>];
close IN;
my $mail = $spamtest->parse($dataref);
my $status = $spamtest->check($mail);
my $output = $status->get_report();
$status->finish();
ok (check_for_cycles($status));
$mail->finish();
ok (check_for_cycles($mail));
$spamtest->finish();
ok (check_for_cycles($spamtest));
exit;
############################################################################
# Test::Memory::Cycle would be a nice way to do this -- but it relies
# on Test::More. so just do it ourselves.
our $cycles;
sub check_for_cycles {
my $obj = shift;
$cycles = 0;
Devel::Cycle::find_cycle ($obj, \&cyclecb);
if ($cycles) {
print "found $cycles cycles! dump to follow:\n";
Devel::Cycle::find_cycle ($obj); # with default output-to-stdout callback
return 0;
} else {
return 1;
}
}
sub cyclecb {
my $aryref = shift;
$cycles += scalar @{$aryref};
}