blob: 5819d9c3d4348c1b2af1d833cb57e2b3e0baacc3 [file] [log] [blame]
#!/usr/bin/perl -T
# bug 6241
use lib '.'; use lib 't';
use SATest; sa_t_init("mkrules_else");
use Test::More tests => 18;
use File::Copy;
use File::Path;
# ---------------------------------------------------------------------------
print "\n rule with 'else'\n\n";
my $tdir = "$workdir/mkrules_else_t";
mkdir($tdir);
%patterns = (
# ensure these have the appropriate conditional attached
"/(?s)ifplugin Mail::SpamAssassin::Plugin::WhateverNonExistent".
"[^\\n]*\\n".
"die_with_a_syntax_error/" => die_with_a_syntax_error_found,
"/(?s)if !plugin\\(Mail::SpamAssassin::Plugin::WhateverNonExistent\\)".
"[^\\n]*\\n".
"body GOOD \\/foo\\//" => rule_GOOD,
);
%anti_patterns = (
"ERROR" => ERROR_in_stdout,
"WARNING" => WARNING_in_stdout,
);
mkpath ([ "$tdir/rulesrc/sandbox/foo", "$tdir/rules" ]);
write_file("$tdir/MANIFEST", [ "$tdir/rules/70_sandbox.cf\n", "$tdir/rules/72_active.cf\n" ]);
write_file("$tdir/rules/active.list", [ "GOOD\n" ]);
write_file("$tdir/rulesrc/sandbox/foo/20_foo.cf", [
"ifplugin Mail::SpamAssassin::Plugin::WhateverNonExistent\n",
"die_with_a_syntax_error\n", # shouldn't get here
"else\n",
"body GOOD /foo/\n",
"describe GOOD desc_found\n",
"endif\n",
]);
ok (mkrun ("--src $tdir/rulesrc --out $tdir/rules --manifest $tdir/MANIFEST --manifestskip $tdir/MANIFEST.SKIP --active $tdir/rules/active.list 2>&1", \&patterns_run_cb));
checkfile("$tdir/rules/72_active.cf", \&patterns_run_cb);
checkfile("$tdir/rules/70_sandbox.cf", \&patterns_run_cb);
ok ok_all_patterns();
save_tdir();
# ---------------------------------------------------------------------------
print "\n rule with 2 nested 'else's\n\n";
rmtree([ $tdir ]);
%patterns = (
);
%anti_patterns = (
"/(?s)meta\\s+T_B1\\s+\\S+\\n".
"meta\\s+T_B1\\s+\\S+/" => two_metas_in_one_ifplugin_scope,
"ERROR" => ERROR_in_stdout,
"WARNING" => WARNING_in_stdout,
);
mkpath ([ "$tdir/rulesrc/sandbox/foo", "$tdir/rules" ]);
write_file("$tdir/rules/active.list", [ "A1\n", "A2\n" ]);
write_file("$tdir/MANIFEST", [ "$tdir/rules/70_sandbox.cf\n", "$tdir/rules/72_active.cf\n" ]);
write_file("$tdir/rulesrc/sandbox/foo/20_foo.cf", [
"body A1 /foo/\n",
"body A2 /foo/\n",
"ifplugin Mail::SpamAssassin::Plugin::SPF\n",
"ifplugin Mail::SpamAssassin::Plugin::DKIM\n",
"meta B1 A1\n",
"else\n",
"meta B1 A2\n",
"endif\n",
"else\n",
"ifplugin Mail::SpamAssassin::Plugin::DKIM\n",
"meta B1 !A1\n",
"else\n",
"meta B1 !A2\n",
"endif\n",
"endif\n",
]);
ok (mkrun ("--src $tdir/rulesrc --out $tdir/rules --manifest $tdir/MANIFEST --manifestskip $tdir/MANIFEST.SKIP --active $tdir/rules/active.list 2>&1", \&patterns_run_cb));
checkfile("$tdir/rules/72_active.cf", \&patterns_run_cb);
checkfile("$tdir/rules/70_sandbox.cf", \&patterns_run_cb);
ok ok_all_patterns();
save_tdir();
# ---------------------------------------------------------------------------
print "\n rule with 2 nested 'else's, with promoted meta rule from sandbox subrule\n\n";
rmtree([ $tdir ]);
%patterns = (
);
%anti_patterns = (
"/(?s)meta\\s+__B1\\s+\\S+\\n".
"meta\\s+__B1\\s+\\S+/" => two_metas_in_one_ifplugin_scope,
"ERROR" => ERROR_in_stdout,
"WARNING" => WARNING_in_stdout,
);
mkpath ([ "$tdir/rulesrc/sandbox/foo", "$tdir/rules" ]);
write_file("$tdir/rules/active.list", [ "C1\n" ]);
write_file("$tdir/MANIFEST", [ "$tdir/rules/70_sandbox.cf\n", "$tdir/rules/72_active.cf\n" ]);
write_file("$tdir/rulesrc/sandbox/foo/20_foo.cf", [
"body A1 /foo/\n",
"body A2 /foo/\n",
"meta C1 __B1\n",
"ifplugin Mail::SpamAssassin::Plugin::SPF\n",
"ifplugin Mail::SpamAssassin::Plugin::DKIM\n",
"meta __B1 A1\n",
"else\n",
"meta __B1 A2\n",
"endif\n",
"else\n",
"ifplugin Mail::SpamAssassin::Plugin::DKIM\n",
"meta __B1 !A1\n",
"else\n",
"meta __B1 !A2\n",
"endif\n",
"endif\n",
]);
ok (mkrun ("--src $tdir/rulesrc --out $tdir/rules --manifest $tdir/MANIFEST --manifestskip $tdir/MANIFEST.SKIP --active $tdir/rules/active.list 2>&1", \&patterns_run_cb));
checkfile("$tdir/rules/70_sandbox.cf", \&patterns_run_cb);
%patterns = (
"body T_A1" => T_A1_defined,
"meta __B1" => __B1_defined,
);
checkfile("$tdir/rules/72_active.cf", \&patterns_run_cb);
ok ok_all_patterns();
save_tdir();
# ---------------------------------------------------------------------------
exit;
sub write_file {
my $file = shift;
my $linesref = shift;
open (O, ">$file") or die "cannot write to $file";
print O @$linesref;
close O or die "cannot save $file";
}
sub mkrun {
my $args = shift;
my $read_sub = shift;
my $post_redir = '';
$args =~ s/ 2\>\&1$// and $post_redir = ' 2>&1';
rmtree ("$workdir/outputdir.tmp"); # some tests use this
mkdir ("$workdir/outputdir.tmp", 0755);
clear_pattern_counters();
my $scrargs = "$perl_path -I../lib ../build/mkrules $args";
print ("\t$scrargs\n");
my $test_number = test_number();
untaint_system ("$scrargs > $workdir/$testname.$test_number $post_redir");
$mk_exitcode = ($?>>8);
if ($mk_exitcode != 0) { return undef; }
&checkfile ("$testname.$test_number", $read_sub) if (defined $read_sub);
1;
}
sub save_tdir {
my $test_number = test_number();
rmtree("$tdir.$test_number");
if (move( "$tdir", "$tdir.$test_number")) {
print "\ttest output tree copied to $tdir.$test_number\n";
}
}