#!/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, "]; 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}; }