blob: be8945d403af5f7e77156a00c2690c962c6575e2 [file] [log] [blame]
#!/usr/bin/perl -T
use lib '.'; use lib 't';
use SATest; sa_t_init("recursion");
use Test::More tests => 10;
use IO::File;
# ---------------------------------------------------------------------------
%patterns = (
q{X-Spam-Status: }, 'headerfound',
);
# ---------------------------------------------------------------------------
my $msg1 = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion
Content-Type: multipart/report; report-type=delivery-status;
boundary="__BOUND__"
--__BOUND__
This is the report.
--__BOUND__
Content-Type: message/delivery-status
Reporting-MTA: dns; example.org
Diagnostic-Info: hi!
--__BOUND__
Content-Type: message/rfc822
__MSG__
--__BOUND__--
};
my $msg2 = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion 2
Content-Type: multipart/mixed; boundary="__BOUND__"
--__BOUND__
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hi!
--__BOUND__
Content-Type: message/rfc822
MIME-Version: 1.0
__MSG__
--__BOUND__--
};
# ---------------------------------------------------------------------------
sub create_test_message {
my $msg = shift;
my $boundstr = "AAAAAAAAAAAAAAAAAAA";
my $bound = $boundstr; $boundstr++;
my $text = $msg;
$text =~ s/__BOUND__/${bound}/g;
for my $i (1 .. 600) {
my $newmsg = $msg;
$bound = $boundstr; $boundstr++;
$newmsg =~ s/__BOUND__/${bound}/g;
$newmsg =~ s/__MSG__/${text}/g;
$text = $newmsg;
}
open (OUT, ">log/recurse.eml") or die;
print OUT $text;
close OUT or die;
}
sub create_test_message_3 {
my $boundstr = "AAAAAAAAAAAAAAAAAAA";
my $bound = $boundstr; $boundstr++;
my $text = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion 3
};
for my $i (1 .. 600) {
$text .= qq{Content-Type: multipart/mixed; boundary="$boundstr"
--$boundstr
};
$boundstr++;
}
open (OUT, ">log/recurse.eml") or die;
print OUT $text;
close OUT or die;
}
sub try_scan {
my $fh = IO::File->new_tmpfile();
ok($fh);
open(STDERR, ">&=".fileno($fh)) || die "Cannot reopen STDERR";
sarun("-D -L -t < log/recurse.eml",
\&patterns_run_cb);
seek($fh, 0, 0);
my $error = do {
local $/;
<$fh>;
};
print "# $error\n";
if ($error =~ /Deep recursion on subroutine/) { ok(0); }
else { ok(1); }
ok_all_patterns();
}
create_test_message($msg1);
try_scan();
create_test_message($msg2);
try_scan();
create_test_message_3();
try_scan();
ok(unlink 'log/recurse.eml');