You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2021/04/12 07:43:14 UTC

svn commit: r1888649 [1/4] - in /spamassassin/trunk: ./ t/ t/data/

Author: hege
Date: Mon Apr 12 07:43:12 2021
New Revision: 1888649

URL: http://svn.apache.org/viewvc?rev=1888649&view=rev
Log:
Major test cleanups. Parallel testing supported (HARNESS_OPTIONS=j8 make test), configuration t/testrules.yml.

Added:
    spamassassin/trunk/t/askdns.t   (with props)
    spamassassin/trunk/t/basic_lint_net.t   (with props)
    spamassassin/trunk/t/testrules.yml
Removed:
    spamassassin/trunk/t/zz_cleanup.t
Modified:
    spamassassin/trunk/MANIFEST
    spamassassin/trunk/t/SATest.pm
    spamassassin/trunk/t/all_modules.t
    spamassassin/trunk/t/authres.t
    spamassassin/trunk/t/autolearn.t
    spamassassin/trunk/t/autolearn_force.t
    spamassassin/trunk/t/autolearn_force_fail.t
    spamassassin/trunk/t/basic_lint.t
    spamassassin/trunk/t/basic_lint_without_sandbox.t
    spamassassin/trunk/t/basic_meta.t
    spamassassin/trunk/t/basic_meta2.t
    spamassassin/trunk/t/basic_obj_api.t
    spamassassin/trunk/t/bayesbdb.t
    spamassassin/trunk/t/bayesdbm.t
    spamassassin/trunk/t/bayesdbm_flock.t
    spamassassin/trunk/t/bayessdbm.t
    spamassassin/trunk/t/bayessdbm_seen_delete.t
    spamassassin/trunk/t/bayessql.t
    spamassassin/trunk/t/blacklist_autolearn.t
    spamassassin/trunk/t/blocklist_autolearn.t
    spamassassin/trunk/t/body_mod.t
    spamassassin/trunk/t/body_str.t
    spamassassin/trunk/t/check_implemented.t
    spamassassin/trunk/t/cidrs.t
    spamassassin/trunk/t/config_errs.t
    spamassassin/trunk/t/config_tree_recurse.t
    spamassassin/trunk/t/cross_user_config_leak.t   (contents, props changed)
    spamassassin/trunk/t/data/01_test_rules.cf
    spamassassin/trunk/t/data/01_test_rules.pre
    spamassassin/trunk/t/date.t
    spamassassin/trunk/t/db_awl_path.t
    spamassassin/trunk/t/db_awl_perms.t
    spamassassin/trunk/t/db_based_whitelist.t
    spamassassin/trunk/t/db_based_whitelist_ips.t
    spamassassin/trunk/t/dcc.t
    spamassassin/trunk/t/debug.t
    spamassassin/trunk/t/desc_wrap.t
    spamassassin/trunk/t/dkim.t
    spamassassin/trunk/t/dnsbl.t
    spamassassin/trunk/t/dnsbl_subtests.t
    spamassassin/trunk/t/duplicates.t
    spamassassin/trunk/t/esp.t
    spamassassin/trunk/t/extracttext.t
    spamassassin/trunk/t/freemail.t
    spamassassin/trunk/t/freemail_welcome_block.t
    spamassassin/trunk/t/get_all_headers.t
    spamassassin/trunk/t/get_headers.t
    spamassassin/trunk/t/gtube.t
    spamassassin/trunk/t/header_utf8.t
    spamassassin/trunk/t/html_colors.t
    spamassassin/trunk/t/html_obfu.t
    spamassassin/trunk/t/html_utf8.t
    spamassassin/trunk/t/idn_dots.t
    spamassassin/trunk/t/if_can.t   (contents, props changed)
    spamassassin/trunk/t/ifversion.t
    spamassassin/trunk/t/ip_addrs.t
    spamassassin/trunk/t/lang_lint.t
    spamassassin/trunk/t/lang_pl_tests.t
    spamassassin/trunk/t/line_endings.t
    spamassassin/trunk/t/lint_nocreate_prefs.t
    spamassassin/trunk/t/local_tests_only.t   (props changed)
    spamassassin/trunk/t/make_install.t   (contents, props changed)
    spamassassin/trunk/t/mass_check.t
    spamassassin/trunk/t/memory_cycles.t
    spamassassin/trunk/t/metadata.t
    spamassassin/trunk/t/mimeheader.t
    spamassassin/trunk/t/mimeparse.t
    spamassassin/trunk/t/missing_hb_separator.t
    spamassassin/trunk/t/mkrules.t
    spamassassin/trunk/t/mkrules_else.t
    spamassassin/trunk/t/nonspam.t
    spamassassin/trunk/t/olevbmacro.t
    spamassassin/trunk/t/originating_ip_hdr.t   (props changed)
    spamassassin/trunk/t/phishing.t
    spamassassin/trunk/t/plugin.t
    spamassassin/trunk/t/plugin_file.t
    spamassassin/trunk/t/plugin_priorities.t
    spamassassin/trunk/t/prefs_include.t
    spamassassin/trunk/t/priorities.t   (contents, props changed)
    spamassassin/trunk/t/pyzor.t
    spamassassin/trunk/t/razor2.t
    spamassassin/trunk/t/rcvd_parser.t
    spamassassin/trunk/t/re_base_extraction.t
    spamassassin/trunk/t/recreate.t
    spamassassin/trunk/t/recursion.t
    spamassassin/trunk/t/regexp_valid.t
    spamassassin/trunk/t/relative_scores.t
    spamassassin/trunk/t/relaycountry.t   (contents, props changed)
    spamassassin/trunk/t/report_safe.t
    spamassassin/trunk/t/reportheader.t
    spamassassin/trunk/t/reportheader_8bit.t
    spamassassin/trunk/t/reuse.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_tell.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_tell_paranoid.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_tell_x.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_tell_x_paranoid.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_u.t
    spamassassin/trunk/t/root_spamd_u_dcc.t
    spamassassin/trunk/t/root_spamd_virtual.t
    spamassassin/trunk/t/root_spamd_x.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_x_paranoid.t   (contents, props changed)
    spamassassin/trunk/t/root_spamd_x_u.t
    spamassassin/trunk/t/rule_multiple.t
    spamassassin/trunk/t/rule_names.t
    spamassassin/trunk/t/rule_tests.t
    spamassassin/trunk/t/rule_types.t
    spamassassin/trunk/t/sa_awl.t
    spamassassin/trunk/t/sa_check_spamd.t
    spamassassin/trunk/t/sa_compile.t   (contents, props changed)
    spamassassin/trunk/t/sha1.t
    spamassassin/trunk/t/shortcircuit.t   (contents, props changed)
    spamassassin/trunk/t/shortcircuit_before_dns.t   (props changed)
    spamassassin/trunk/t/spam.t
    spamassassin/trunk/t/spamc.t
    spamassassin/trunk/t/spamc_H.t
    spamassassin/trunk/t/spamc_bug6176.t
    spamassassin/trunk/t/spamc_cf.t
    spamassassin/trunk/t/spamc_headers.t
    spamassassin/trunk/t/spamc_l.t
    spamassassin/trunk/t/spamc_optC.t
    spamassassin/trunk/t/spamc_optL.t
    spamassassin/trunk/t/spamc_x_E_R.t
    spamassassin/trunk/t/spamc_x_e.t
    spamassassin/trunk/t/spamc_y.t
    spamassassin/trunk/t/spamc_z.t   (contents, props changed)
    spamassassin/trunk/t/spamd.t
    spamassassin/trunk/t/spamd_allow_user_rules.t
    spamassassin/trunk/t/spamd_client.t
    spamassassin/trunk/t/spamd_hup.t
    spamassassin/trunk/t/spamd_kill_restart.t
    spamassassin/trunk/t/spamd_kill_restart_rr.t
    spamassassin/trunk/t/spamd_ldap.t
    spamassassin/trunk/t/spamd_maxchildren.t
    spamassassin/trunk/t/spamd_maxsize.t
    spamassassin/trunk/t/spamd_parallel.t
    spamassassin/trunk/t/spamd_plugin.t
    spamassassin/trunk/t/spamd_port.t
    spamassassin/trunk/t/spamd_prefork_stress.t
    spamassassin/trunk/t/spamd_prefork_stress_2.t
    spamassassin/trunk/t/spamd_prefork_stress_3.t
    spamassassin/trunk/t/spamd_prefork_stress_4.t
    spamassassin/trunk/t/spamd_protocol_10.t
    spamassassin/trunk/t/spamd_report.t
    spamassassin/trunk/t/spamd_report_ifspam.t
    spamassassin/trunk/t/spamd_sql_prefs.t
    spamassassin/trunk/t/spamd_ssl.t
    spamassassin/trunk/t/spamd_ssl_accept_fail.t
    spamassassin/trunk/t/spamd_stop.t
    spamassassin/trunk/t/spamd_symbols.t
    spamassassin/trunk/t/spamd_syslog.t
    spamassassin/trunk/t/spamd_unix.t
    spamassassin/trunk/t/spamd_user_rules_leak.t
    spamassassin/trunk/t/spamd_utf8.t
    spamassassin/trunk/t/spamd_welcomelist_leak.t
    spamassassin/trunk/t/spamd_whitelist_leak.t
    spamassassin/trunk/t/spf_welcome_block.t
    spamassassin/trunk/t/sql_based_whitelist.t
    spamassassin/trunk/t/stop_always_matching_regexps.t   (contents, props changed)
    spamassassin/trunk/t/strip2.t
    spamassassin/trunk/t/strip_no_subject.t
    spamassassin/trunk/t/stripmarkup.t
    spamassassin/trunk/t/tainted_msg.t
    spamassassin/trunk/t/text_bad_ctype.t
    spamassassin/trunk/t/timeout.t
    spamassassin/trunk/t/trust_path.t
    spamassassin/trunk/t/uri.t
    spamassassin/trunk/t/uri_html.t
    spamassassin/trunk/t/uri_list.t   (contents, props changed)
    spamassassin/trunk/t/uri_saferedirect.t
    spamassassin/trunk/t/uri_text.t
    spamassassin/trunk/t/uribl_all_types.t   (contents, props changed)
    spamassassin/trunk/t/uribl_domains_only.t   (contents, props changed)
    spamassassin/trunk/t/uribl_ips_only.t   (contents, props changed)
    spamassassin/trunk/t/urilocalbl.t   (contents, props changed)
    spamassassin/trunk/t/utf8.t
    spamassassin/trunk/t/util_wrap.t
    spamassassin/trunk/t/welcomelist_from.t   (contents, props changed)
    spamassassin/trunk/t/welcomelist_to.t   (contents, props changed)
    spamassassin/trunk/t/whitelist_addrs.t
    spamassassin/trunk/t/whitelist_from.t
    spamassassin/trunk/t/whitelist_subject.t
    spamassassin/trunk/t/whitelist_to.t

Modified: spamassassin/trunk/MANIFEST
URL: http://svn.apache.org/viewvc/spamassassin/trunk/MANIFEST?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/MANIFEST (original)
+++ spamassassin/trunk/MANIFEST Mon Apr 12 07:43:12 2021
@@ -233,16 +233,16 @@ sql/txrep_mysql.sql
 sql/txrep_pg.sql
 sql/txrep_sqlite.sql
 t/README
-t/esp.t
-t/uri_saferedirect.t
 t/SATest.pl
 t/SATest.pm
 t/all_modules.t
+t/askdns.t
 t/authres.t
 t/autolearn.t
 t/autolearn_force.t
 t/autolearn_force_fail.t
 t/basic_lint.t
+t/basic_lint_net.t
 t/basic_lint_without_sandbox.t
 t/basic_meta.t
 t/basic_meta2.t
@@ -265,7 +265,6 @@ t/config_text.t
 t/config_tree_recurse.t
 t/cpp_comments_in_spamc.t
 t/cross_user_config_leak.t
-t/olevbmacro.t
 t/data/01_test_rules.cf
 t/data/01_test_rules.pre
 t/data/Dumpheaders.pm
@@ -313,21 +312,17 @@ t/data/dkim/test-pass-20.msg
 t/data/dkim/test-pass-21.msg
 t/data/dkim/test-pass-22.msg
 t/data/dkim/test-pass-23.msg
-t/data/spam/esp/mailchimp.eml
-t/data/spam/esp/mailchimp.txt
-t/data/spam/esp/sendgrid_id.eml
-t/data/spam/esp/sendgrid_id.txt
 t/data/etc/hello.txt
 t/data/etc/testhost.cert
 t/data/etc/testhost.key
-t/data/geodb/create_GeoIPCity.README
-t/data/geodb/create_GeoIPISP.README
-t/data/geodb/create_ipcc.sh
 t/data/geodb/GeoIP2-City.mmdb
 t/data/geodb/GeoIP2-Country.mmdb
 t/data/geodb/GeoIP2-ISP.mmdb
 t/data/geodb/GeoIPCity.dat
 t/data/geodb/GeoIPISP.dat
+t/data/geodb/create_GeoIPCity.README
+t/data/geodb/create_GeoIPISP.README
+t/data/geodb/create_ipcc.sh
 t/data/geodb/ipcc.db
 t/data/mime-subject.txt
 t/data/nice/001
@@ -381,6 +376,8 @@ t/data/nice/spf5-received-spf-crlf
 t/data/nice/spf6-received-spf-crlf2
 t/data/nice/unicode1
 t/data/nice/unicode2
+t/data/phishing/openphish-feed.txt
+t/data/phishing/phishtank-feed.csv
 t/data/reporterplugin.pm
 t/data/spam/001
 t/data/spam/002
@@ -409,6 +406,14 @@ t/data/spam/base64.txt
 t/data/spam/bsmtp
 t/data/spam/bsmtpnull
 t/data/spam/dnsbl.eml
+t/data/spam/dnsbl_domsonly.eml
+t/data/spam/dnsbl_ipsonly.eml
+t/data/spam/esp/mailchimp.eml
+t/data/spam/esp/mailchimp.txt
+t/data/spam/esp/sendgrid_id.eml
+t/data/spam/esp/sendgrid_id.txt
+t/data/spam/extracttext/gtube_jpg.eml
+t/data/spam/extracttext/gtube_pdf.eml
 t/data/spam/gtube.eml
 t/data/spam/gtubedcc.eml
 t/data/spam/gtubedcc_crlf.eml
@@ -419,13 +424,15 @@ t/data/spam/olevbmacro/malicemacro.eml
 t/data/spam/olevbmacro/nomacro.eml
 t/data/spam/olevbmacro/renamedmacro.eml
 t/data/spam/olevbmacro/zippwmacro.eml
+t/data/spam/phishing_openphish.eml
+t/data/spam/phishing_phishtank.eml
 t/data/spam/pyzor
 t/data/spam/razor2
 t/data/spam/relayUS.eml
-t/data/spam/urilocalbl_net.eml
 t/data/spam/spf1
 t/data/spam/spf2
 t/data/spam/spf3
+t/data/spam/urilocalbl_net.eml
 t/data/spamc_blank.cf
 t/data/taintcheckplugin.pm
 t/data/testplugin.pm
@@ -456,13 +463,6 @@ t/data/whitelists/ryanairmail.com
 t/data/whitelists/sf.net
 t/data/whitelists/winxpnews.com
 t/data/whitelists/yahoo-inc.com
-t/data/phishing/openphish-feed.txt
-t/data/phishing/phishtank-feed.csv
-t/data/spam/phishing_openphish.eml
-t/data/spam/phishing_phishtank.eml
-t/welcomelist_to.t
-t/welcomelist_from.t
-t/phishing.t
 t/date.t
 t/db_awl_path.t
 t/db_awl_perms.t
@@ -474,8 +474,12 @@ t/desc_wrap.t
 t/dkim.t
 t/dnsbl.t
 t/dnsbl_sc_meta.t
+t/dnsbl_subtests.t
 t/duplicates.t
+t/esp.t
+t/extracttext.t
 t/freemail.t
+t/freemail_welcome_block.t
 t/get_all_headers.t
 t/get_headers.t
 t/gtube.t
@@ -500,7 +504,9 @@ t/missing_hb_separator.t
 t/mkrules.t
 t/mkrules_else.t
 t/nonspam.t
+t/olevbmacro.t
 t/originating_ip_hdr.t
+t/phishing.t
 t/plugin.t
 t/plugin_file.t
 t/plugin_priorities.t
@@ -514,8 +520,8 @@ t/recips.t
 t/recreate.t
 t/recursion.t
 t/regexp_valid.t
-t/relaycountry.t
 t/relative_scores.t
+t/relaycountry.t
 t/report_safe.t
 t/reportheader.t
 t/reportheader_8bit.t
@@ -537,8 +543,6 @@ t/rule_types.t
 t/sa_awl.t
 t/sa_check_spamd.t
 t/sa_compile.t
-t/freemail_welcome_block.t
-t/spf_welcome_block.t
 t/sha1.t
 t/shortcircuit.t
 t/shortcircuit_before_dns.t
@@ -547,6 +551,7 @@ t/spamc.t
 t/spamc_B.t
 t/spamc_E.t
 t/spamc_H.t
+t/spamc_bug6176.t
 t/spamc_c.t
 t/spamc_c_stdout_closed.t
 t/spamc_cf.t
@@ -587,9 +592,10 @@ t/spamd_unix.t
 t/spamd_unix_and_tcp.t
 t/spamd_user_rules_leak.t
 t/spamd_utf8.t
-t/spamd_whitelist_leak.t
 t/spamd_welcomelist_leak.t
+t/spamd_whitelist_leak.t
 t/spf.t
+t/spf_welcome_block.t
 t/sql_based_whitelist.t
 t/stop_always_matching_regexps.t
 t/strip2.t
@@ -597,29 +603,28 @@ t/strip_no_subject.t
 t/stripmarkup.t
 t/tainted_msg.t
 t/test_dir
+t/testrules.yml
 t/text_bad_ctype.t
 t/timeout.t
 t/trust_path.t
 t/uri.t
 t/uri_html.t
 t/uri_list.t
+t/uri_saferedirect.t
 t/uri_text.t
 t/uribl.t
+t/uribl_all_types.t
+t/uribl_domains_only.t
+t/uribl_ips_only.t
 t/urilocalbl.t
 t/utf8.t
 t/util_wrap.t
+t/welcomelist_from.t
+t/welcomelist_to.t
 t/whitelist_addrs.t
 t/whitelist_from.t
 t/whitelist_subject.t
 t/whitelist_to.t
-t/zz_cleanup.t
-t/spamc_bug6176.t
-t/data/spam/dnsbl_domsonly.eml
-t/uribl_domains_only.t
-t/data/spam/dnsbl_ipsonly.eml
-t/uribl_all_types.t
-t/uribl_ips_only.t
-t/dnsbl_subtests.t
 powered_by/128-powered-by-spamassassin.png
 powered_by/256-powered-by-spamassassin.png
 powered_by/512-powered-by-spamassassin.png

Modified: spamassassin/trunk/t/SATest.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/SATest.pm?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/SATest.pm (original)
+++ spamassassin/trunk/t/SATest.pm Mon Apr 12 07:43:12 2021
@@ -12,6 +12,7 @@ use File::Basename;
 use File::Copy;
 use File::Path;
 use File::Spec;
+use File::Temp qw(tempdir);
 
 use Test::Builder ();
 use Test::More    ();
@@ -21,7 +22,9 @@ use POSIX qw(WIFEXITED WIFSIGNALED WIFST
 use vars qw($RUNNING_ON_WINDOWS $SSL_AVAILABLE
             $SKIP_SPAMD_TESTS $SKIP_SPAMC_TESTS $NO_SPAMC_EXE
             $SKIP_SETUID_NOBODY_TESTS $SKIP_DNSBL_TESTS
-            $have_inet4 $have_inet6 $spamdhost $spamdport);
+            $have_inet4 $have_inet6 $spamdhost $spamdport
+            $workdir $siterules $localrules $userrules $userstate
+            $keep_workdir $mainpid);
 
 BEGIN {
   require Exporter;
@@ -72,6 +75,7 @@ BEGIN {
 #
 sub sa_t_init {
   my $tname = shift;
+  $mainpid = $$;
 
   if ($config{PERL_PATH}) {
     $perl_path = $config{PERL_PATH};
@@ -124,8 +128,6 @@ sub sa_t_init {
   }
   $spamdhost = $ENV{'SPAMD_HOST'};
   $spamdhost ||= $spamdlocalhost;
-  $spamdport = $ENV{'SPAMD_PORT'};
-  $spamdport ||= probably_unused_spamd_port();
 
   # optimisation -- don't setup spamd test parameters unless we're
   # not skipping all spamd tests and this particular test is called
@@ -133,27 +135,66 @@ sub sa_t_init {
   # We still run spamc tests when there is an external SPAMD_HOST, but don't have to set up the spamd parameters for it
   if ($SKIP_SPAMD_TESTS or ($tname !~ /spam[cd]/)) {
     $NO_SPAMD_REQUIRED = 1;
+  } else {
+    $spamdport = $ENV{'SPAMD_PORT'};
+    $spamdport ||= probably_unused_spamd_port();
   }
 
-  $spamd_cf_args = "-C log/test_rules_copy";
-  $spamd_localrules_args = " --siteconfigpath log/localrules.tmp";
-  $scr_localrules_args =   " --siteconfigpath log/localrules.tmp";
-  $salearn_localrules_args =   " --siteconfigpath log/localrules.tmp";
-
-  $scr_cf_args = "-C log/test_rules_copy";
-  $scr_pref_args = "-p log/test_default.cf";
-  $salearn_cf_args = "-C log/test_rules_copy";
-  $salearn_pref_args = "-p log/test_default.cf";
+  (-f "t/test_dir") && chdir("t");        # run from ..
+  -f "test_dir"  or die "FATAL: not in test directory?\n";
+
+  unless (-d "log") {
+    mkdir ("log", 0755) or die ("Error creating log dir: $!");
+  }
+  chmod (0755, "log"); # set in case log already exists with wrong permissions
+
+  if (!$RUNNING_ON_WINDOWS) {
+    untaint_system("chacl -B log 2>/dev/null || setfacl -b log 2>/dev/null"); # remove acls that confuse test
+  }
+
+  # clean old workdir if sa_t_init called multiple times
+  if (defined $workdir) {
+    if (!$keep_workdir) {
+      rmtree($workdir);
+    }
+  }
+
+  # individual work directory to make parallel tests possible
+  $workdir = tempdir("$tname.XXXXXX", DIR => "log");
+  die "FATAL: failed to create workdir: $!" unless -d $workdir;
+  $keep_workdir = 0;
+  # $siterules contains all stock *.pre files
+  $siterules = "$workdir/siterules";
+  # $localrules contains all stock *.cf files
+  $localrules = "$workdir/localrules";
+  # $userrules contains user rules
+  $userrules = "$workdir/user.cf";
+  # user_state directory
+  $userstate = "$workdir/user_state";
+
+  mkdir($siterules) or die "FATAL: failed to create $siterules\n";
+  mkdir($localrules) or die "FATAL: failed to create $localrules\n";
+  open(OUT, ">$userrules") or die "FATAL: failed to create $userrules\n";
+  close(OUT);
+  mkdir($userstate) or die "FATAL: failed to create $userstate\n";
+
+  $spamd_cf_args = "-C $localrules";
+  $spamd_localrules_args = " --siteconfigpath $siterules";
+  $scr_localrules_args =   " --siteconfigpath $siterules";
+  $salearn_localrules_args =   " --siteconfigpath $siterules";
+
+  $scr_cf_args = "-C $localrules";
+  $scr_pref_args = "-p $userrules";
+  $salearn_cf_args = "-C $localrules";
+  $salearn_pref_args = "-p $userrules";
   $scr_test_args = "";
   $salearn_test_args = "";
-  $set_test_prefs = 0;
+  $set_user_prefs = 0;
   $default_cf_lines = "
-    bayes_path ./log/user_state/bayes
-    auto_whitelist_path ./log/user_state/auto-whitelist
+    bayes_path ./$userstate/bayes
+    auto_whitelist_path ./$userstate/auto-whitelist
   ";
 
-  (-f "t/test_dir") && chdir("t");        # run from ..
-
   read_config();
 
   # if running as root, ensure "nobody" can write to it too
@@ -179,66 +220,34 @@ sub sa_t_init {
                     (untaint_cmd("$spamc -V") =~ /with SSL support/) &&
                     (untaint_cmd("$spamd --version") =~ /with SSL support/));
   }
-  # do not remove prior test results!
-  # rmtree ("log");
-
-  unless (-d "log") {
-    mkdir ("log", 0755) or die ("Error creating log dir: $!");
-  }
-  chmod (0755, "log"); # set in case log already exists with wrong permissions
 
-  if (!$RUNNING_ON_WINDOWS) {
-    untaint_system("chacl -B log 2>/dev/null || setfacl -b log 2>/dev/null"); # remove acls that confuse test
-  }
-
-  rmtree ("log/user_state");
-  rmtree ("log/outputdir.tmp");
-
-  rmtree ("log/test_rules_copy");
-  mkdir ("log/test_rules_copy", 0755);
-
-  for $tainted (<../rules/*.cf>, <../rules/*.pm>, <../rules/*.pre>, <../rules/languages>) {
+  for $tainted (<../rules/*.pm>, <../rules/*.pre>, <../rules/languages>) {
     $tainted =~ /(.*)/;
     my $file = $1;
     $base = basename $file;
-    copy ($file, "log/test_rules_copy/$base")
-      or warn "cannot copy $file to log/test_rules_copy/$base: $!";
+    copy ($file, "$siterules/$base")
+      or warn "cannot copy $file to $siterules/$base: $!";
   }
 
-  copy ("data/01_test_rules.pre", "log/test_rules_copy/01_test_rules.pre")
-    or warn "cannot copy data/01_test_rules.cf to log/test_rules_copy/01_test_rules.pre: $!";
-  copy ("data/01_test_rules.cf", "log/test_rules_copy/01_test_rules.cf")
-    or warn "cannot copy data/01_test_rules.cf to log/test_rules_copy/01_test_rules.cf: $!";
-
-  rmtree ("log/localrules.tmp");
-  mkdir ("log/localrules.tmp", 0755);
-
-  for $tainted (<../rules/*.pm>, <../rules/*.pre>, <../rules/languages>) {
+  for $tainted (<../rules/*.cf>) {
     $tainted =~ /(.*)/;
     my $file = $1;
     $base = basename $file;
-    copy ($file, "log/localrules.tmp/$base")
-      or warn "cannot copy $file to log/localrules.tmp/$base: $!";
+    copy ($file, "$localrules/$base")
+      or warn "cannot copy $file to $localrules/$base: $!";
   }
 
-  copy ("../rules/user_prefs.template", "log/test_rules_copy/99_test_default.cf")
-    or die "user prefs copy failed: $!";
+  copy ("data/01_test_rules.pre", "$localrules/01_test_rules.pre")
+    or warn "cannot copy data/01_test_rules.cf to $localrules/01_test_rules.pre: $!";
+  copy ("data/01_test_rules.cf", "$localrules/01_test_rules.cf")
+    or warn "cannot copy data/01_test_rules.cf to $localrules/01_test_rules.cf: $!";
 
-  open (PREFS, ">>log/test_rules_copy/99_test_default.cf")
-    or die "cannot append to log/test_rules_copy/99_test_default.cf: $!";
+  open (PREFS, ">>$localrules/99_test_default.cf")
+    or die "cannot append to $localrules/99_test_default.cf: $!";
   print PREFS $default_cf_lines
-    or die "error writing to log/test_rules_copy/99_test_default.cf: $!";
-  close PREFS
-    or die "error closing log/test_rules_copy/99_test_default.cf: $!";
-
-  # create an empty .prefs file
-  open (PREFS, ">>log/test_default.cf")
-    or die "cannot append to log/test_default.cf: $!";
+    or die "error writing to $localrules/99_test_default.cf: $!";
   close PREFS
-    or die "error closing log/test_default.cf: $!";
-
-  mkdir("log/user_state",$tmp_dir_mode);
-  chmod ($tmp_dir_mode, "log/user_state");  # unaffected by umask
+    or die "error closing $localrules/99_test_default.cf: $!";
 
   $home = $ENV{'HOME'};
   $home ||= $ENV{'WINDIR'} if (defined $ENV{'WINDIR'});
@@ -250,7 +259,7 @@ sub sa_t_init {
   $spamd_run_as_user = ($RUNNING_ON_WINDOWS || ($> == 0)) ? "nobody" : (getpwuid($>))[0] ;
 }
 
-# a port number between 32768 and 65535; used to allow multiple test
+# a port number between 40000 and 65520; used to allow multiple test
 # suite runs on the same machine simultaneously
 sub probably_unused_spamd_port {
   return 0 if $NO_SPAMD_REQUIRED;
@@ -263,11 +272,9 @@ sub probably_unused_spamd_port {
     @nstat = grep(/^\s*tcp/i, <NSTAT>);
     close(NSTAT);
   }
-  my $delta = ($$ % 32768) || int(rand(32768));
-  for (1..10) {
-    $port = 32768 + $delta;
+  for (1..20) {
+    $port = 40000 + int(rand(65500-40000));
     last unless (getservbyport($port, "tcp") || grep(/[:.]$port\s/, @nstat));
-    $delta = int(rand(32768));
   }
   return $port;
 }
@@ -291,31 +298,35 @@ sub sa_t_finish {
 
 sub tstfile {
   my $file = shift;
-  open (OUT, ">log/mail.txt") or die;
+  open (OUT, ">$workdir/mail.txt") or die;
   print OUT $file; close OUT;
 }
 
-sub tstlocalrules {
+sub tstprefs {
   my $lines = shift;
 
-  $set_local_rules = 1;
+  open (OUT, ">$localrules/99_test_prefs.cf") or die;
+  print OUT $lines; close OUT;
+}
+
+sub tstlocalrules {
+  my $lines = shift;
 
-  open (OUT, ">log/localrules.tmp/00test.cf") or die;
+  open (OUT, ">$localrules/99_test_rules.cf") or die;
   print OUT $lines; close OUT;
 }
 
-sub tstprefs {
+sub tstuserprefs {
   my $lines = shift;
 
-  $set_test_prefs = 1;
+  $set_user_prefs = 1;
 
   # TODO: should we use -p, or modify the test_rules_copy/99_test_default.cf?
   # for now, I'm taking the -p route, since we have to be able to test
   # the operation of user-prefs in general, itself.
 
-  open (OUT, ">log/tst.cf") or die;
+  open (OUT, ">$userrules") or die;
   print OUT $lines; close OUT;
-  $scr_pref_args = "-p log/tst.cf";
 }
 
 # creates a .pre file in the localrules dir to be parsed alongside init.pre
@@ -324,7 +335,7 @@ sub tstprefs {
 sub tstpre {
   my $lines = shift;
 
-  open (OUT, ">log/localrules.tmp/zz_tst.pre") or die;
+  open (OUT, ">$siterules/zz_test.pre") or die;
   print OUT $lines; close OUT;
 }
 
@@ -355,14 +366,14 @@ sub sarun {
   my $scrargs = "$scr $args";
   $scrargs =~ s!/!\\!g if ($^O =~ /^MS(DOS|Win)/i);
   print ("\t$scrargs\n");
-  (-d "log/d.$testname") or mkdir ("log/d.$testname", 0755);
+  (-d "$workdir/d.$testname") or mkdir ("$workdir/d.$testname", 0755);
   
   my $test_number = test_number();
-
-  untaint_system("$scrargs > log/d.$testname/$test_number $post_redir");
+#print STDERR "RUN: $scrargs\n";
+  untaint_system("$scrargs > $workdir/d.$testname/$test_number $post_redir");
   $sa_exitcode = ($?>>8);
   if ($sa_exitcode != 0) { return undef; }
-  &checkfile ("d.$testname/$test_number", $read_sub) if (defined $read_sub);
+  &checkfile ("$workdir/d.$testname/$test_number", $read_sub) if (defined $read_sub);
   1;
 }
 
@@ -392,14 +403,14 @@ sub salearnrun {
   my $salearnargs = "$salearn $args";
   $salearnargs =~ s!/!\\!g if ($^O =~ /^MS(DOS|Win)/i);
   print ("\t$salearnargs\n");
-  (-d "log/d.$testname") or mkdir ("log/d.$testname", 0755);
+  (-d "$workdir/d.$testname") or mkdir ("$workdir/d.$testname", 0755);
 
   my $test_number = test_number();
 
-  untaint_system("$salearnargs > log/d.$testname/$test_number");
+  untaint_system("$salearnargs > $workdir/d.$testname/$test_number");
   $salearn_exitcode = ($?>>8);
   if ($salearn_exitcode != 0) { return undef; }
-  &checkfile ("d.$testname/$test_number", $read_sub) if (defined $read_sub);
+  &checkfile ("$workdir/d.$testname/$test_number", $read_sub) if (defined $read_sub);
   1;
 }
 
@@ -451,14 +462,14 @@ sub spamcrun {
   $spamcargs =~ s!/!\\!g if ($^O =~ /^MS(DOS|Win)/i);
 
   print ("\t$spamcargs\n");
-  (-d "log/d.$testname") or mkdir ("log/d.$testname", 0755);
+  (-d "$workdir/d.$testname") or mkdir ("$workdir/d.$testname", 0755);
 
   my $test_number = test_number();
 
   if ($capture_stderr) {
-    untaint_system ("$spamcargs > log/d.$testname/out.$test_number 2>&1");
+    untaint_system ("$spamcargs > $workdir/d.$testname/out.$test_number 2>&1");
   } else {
-    untaint_system ("$spamcargs > log/d.$testname/out.$test_number");
+    untaint_system ("$spamcargs > $workdir/d.$testname/out.$test_number");
   }
 
   $sa_exitcode = ($?>>8);
@@ -468,7 +479,7 @@ sub spamcrun {
 
   %found = ();
   %found_anti = ();
-  &checkfile ("d.$testname/out.$test_number", $read_sub) if (defined $read_sub);
+  &checkfile ("$workdir/d.$testname/out.$test_number", $read_sub) if (defined $read_sub);
 
   if ($expect_failure) {
     ($sa_exitcode != 0);
@@ -497,10 +508,10 @@ sub spamcrun_background {
   $spamcargs =~ s!/!\\!g if ($^O =~ /^MS(DOS|Win)/i);
 
   print ("\t$spamcargs &\n");
-  (-d "log/d.$testname") or mkdir ("log/d.$testname", 0755);
+  (-d "$workdir/d.$testname") or mkdir ("$workdir/d.$testname", 0755);
   
   my $test_number = test_number();
-  untaint_system ("$spamcargs > log/d.$testname/bg.$test_number &") and return 0;
+  untaint_system ("$spamcargs > $workdir/d.$testname/bg.$test_number &") and return 0;
 
   1;
 }
@@ -518,9 +529,9 @@ sub sdrun {
 }
 
 sub recreate_outputdir_tmp {
-  rmtree ("log/outputdir.tmp"); # some tests use this
-  mkdir ("log/outputdir.tmp", $tmp_dir_mode);
-  chmod ($tmp_dir_mode, "log/outputdir.tmp");  # unaffected by umask
+  rmtree ("$workdir/outputdir.tmp"); # some tests use this
+  mkdir ("$workdir/outputdir.tmp", $tmp_dir_mode);
+  chmod ($tmp_dir_mode, "$workdir/outputdir.tmp");  # unaffected by umask
 }
 
 # out: $spamd_stderr
@@ -571,13 +582,13 @@ sub start_spamd {
     warn "oops! SATest.pm: a test prefs file was created, but spamd isn't reading it\n";
   }
 
-  (-d "log/d.$testname") or mkdir ("log/d.$testname", 0755);
+  (-d "$workdir/d.$testname") or mkdir ("$workdir/d.$testname", 0755);
   
   my $test_number = test_number();
-  my $spamd_stdout = "log/d.$testname/spamd.out.$test_number";
-     $spamd_stderr = "log/d.$testname/spamd.err.$test_number";    #  global
-  my $spamd_stdlog = "log/d.$testname/spamd.log.$test_number";
-  my $spamd_pidfile = "log/spamd.pid";
+  my $spamd_stdout = "$workdir/d.$testname/spamd.out.$test_number";
+     $spamd_stderr = "$workdir/d.$testname/spamd.err.$test_number";    #  global
+  my $spamd_stdlog = "$workdir/d.$testname/spamd.log.$test_number";
+  my $spamd_pidfile = "$workdir/spamd.pid";
   my $spamd_forker = $ENV{'SPAMD_FORKER'}   ?
                        $ENV{'SPAMD_FORKER'} :
                      $RUNNING_ON_WINDOWS    ?
@@ -599,7 +610,7 @@ sub start_spamd {
 
   # DEBUG instrumentation to trace spamd processes. See bug 5731 for history
   # if (-f "/home/jm/capture_spamd_straces") {
-  # $spamd_cmd = "strace -ttt -fo log/d.$testname/spamd.strace.$test_number $spamd_cmd";
+  # $spamd_cmd = "strace -ttt -fo $workdir/d.$testname/spamd.strace.$test_number $spamd_cmd";
   # }
 
   unlink ($spamd_stdout, $spamd_stderr, $spamd_stdlog, $spamd_pidfile);
@@ -688,10 +699,10 @@ sub create_saobj {
 
   # YUCK, these file/dir names should be some sort of variable, at
   # least we keep their definition in the same file for the moment.
-  my %setup_args = ( rules_filename => 'log/test_rules_copy',
-		     site_rules_filename => 'log/localrules.tmp',
-		     userprefs_filename => 'log/test_default.cf',
-		     userstate_dir => 'log/user_state',
+  my %setup_args = ( rules_filename => $localrules,
+		     site_rules_filename => $siterules,
+		     userprefs_filename => $userrules,
+		     userstate_dir => $userstate,
 		     local_tests_only => 1,
                      # debug => 'all',
 		   );
@@ -727,15 +738,11 @@ sub checkfile {
   my $read_sub = shift;
 
   # print "Checking $filename\n";
-  if (!open (IN, "< log/$filename")) {
-    # could be it already contains the "log/" prefix?
-    if (!open (IN, "< $filename")) {
-      warn "cannot open log/$filename or $filename"; return undef;
-    } else {
-      push @files_checked, "$filename";
-    }
+  if (!open (IN, "< $filename")) {
+    warn "cannot open $filename";
+    return undef;
   } else {
-    push @files_checked, "log/$filename";
+    push @files_checked, "$filename";
   }
   &$read_sub();
   close IN;
@@ -808,6 +815,7 @@ sub ok_all_patterns {
     } else {
       warn "\tNot found: $type = $pat at $file line $line.\n";
       if (!$dont_ok) {
+        $keep_workdir = 1;
         ok (0);                     # keep the right # of tests
       }
       $wasfailure++;
@@ -830,6 +838,7 @@ sub ok_all_patterns {
   if ($wasfailure) {
     warn "Output can be examined in: ".
          join(' ', @files_checked)."\n"  if @files_checked;
+    $keep_workdir = 1;
     return 0;
   } else {
     return 1;
@@ -940,7 +949,7 @@ sub conf_bool {
 sub mk_safe_tmpdir {
   return $safe_tmpdir if defined($safe_tmpdir);
 
-  my $dir = File::Spec->tmpdir() || 'log';
+  my $dir = $workdir || File::Spec->tmpdir();
 
   # be a little paranoid, since we're using a public tmp dir and
   # are exposed to race conditions
@@ -1157,4 +1166,11 @@ sub untaint_cmd {
     }
 }
 
+END {
+  # Cleanup workdir (but not if inside forked process)
+  if (defined $workdir && !$keep_workdir && $$ == $mainpid) {
+    rmtree($workdir);
+  }
+}
+
 1;

Modified: spamassassin/trunk/t/all_modules.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/all_modules.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/all_modules.t (original)
+++ spamassassin/trunk/t/all_modules.t Mon Apr 12 07:43:12 2021
@@ -1,12 +1,10 @@
 #!/usr/bin/perl -T
 
-use lib '.'; 
-use lib 't';
-use SATest; 
-sa_t_init("all_modules");
+use lib '.'; use lib 't';
+use SATest; sa_t_init("all_modules");
 
 use Test::More;
-plan tests => 5;
+plan tests => 6;
 
 # ---------------------------------------------------------------------------
 
@@ -17,59 +15,65 @@ if (eval { require BSD::Resource; }) {
 }
 
 tstpre ("
-loadplugin Mail::SpamAssassin::Plugin::RelayCountry
-loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
-loadplugin Mail::SpamAssassin::Plugin::SPF
-loadplugin Mail::SpamAssassin::Plugin::DCC
-loadplugin Mail::SpamAssassin::Plugin::Pyzor
-loadplugin Mail::SpamAssassin::Plugin::Razor2
-loadplugin Mail::SpamAssassin::Plugin::SpamCop
-loadplugin Mail::SpamAssassin::Plugin::AntiVirus
-loadplugin Mail::SpamAssassin::Plugin::AWL
-loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
-# TODO fix finding languages file..
-#loadplugin Mail::SpamAssassin::Plugin::TextCat
-loadplugin Mail::SpamAssassin::Plugin::AccessDB
-loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
-loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
-loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
-loadplugin Mail::SpamAssassin::Plugin::DKIM
-loadplugin Mail::SpamAssassin::Plugin::Check
-loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
-loadplugin Mail::SpamAssassin::Plugin::URIDetail
-loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
-loadplugin Mail::SpamAssassin::Plugin::Bayes
-loadplugin Mail::SpamAssassin::Plugin::BodyEval
-loadplugin Mail::SpamAssassin::Plugin::DNSEval
-loadplugin Mail::SpamAssassin::Plugin::HTMLEval
-loadplugin Mail::SpamAssassin::Plugin::HeaderEval
-loadplugin Mail::SpamAssassin::Plugin::MIMEEval
-loadplugin Mail::SpamAssassin::Plugin::RelayEval
-loadplugin Mail::SpamAssassin::Plugin::URIEval
-loadplugin Mail::SpamAssassin::Plugin::WLBLEval
-loadplugin Mail::SpamAssassin::Plugin::VBounce
-loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody
-loadplugin Mail::SpamAssassin::Plugin::ASN
-loadplugin Mail::SpamAssassin::Plugin::ImageInfo
-loadplugin Mail::SpamAssassin::Plugin::PhishTag
-loadplugin Mail::SpamAssassin::Plugin::FreeMail
-loadplugin Mail::SpamAssassin::Plugin::AskDNS
-loadplugin Mail::SpamAssassin::Plugin::TxRep
-loadplugin Mail::SpamAssassin::Plugin::URILocalBL
-loadplugin Mail::SpamAssassin::Plugin::PDFInfo
-loadplugin Mail::SpamAssassin::Plugin::HashBL
-loadplugin Mail::SpamAssassin::Plugin::FromNameSpoof
-loadplugin Mail::SpamAssassin::Plugin::Phishing
-loadplugin Mail::SpamAssassin::Plugin::AuthRes
-loadplugin Mail::SpamAssassin::Plugin::ExtractText
-$plugins
+  loadplugin Mail::SpamAssassin::Plugin::RelayCountry
+  loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
+  loadplugin Mail::SpamAssassin::Plugin::SPF
+  loadplugin Mail::SpamAssassin::Plugin::DCC
+  loadplugin Mail::SpamAssassin::Plugin::Pyzor
+  loadplugin Mail::SpamAssassin::Plugin::Razor2
+  loadplugin Mail::SpamAssassin::Plugin::SpamCop
+  loadplugin Mail::SpamAssassin::Plugin::AntiVirus
+  loadplugin Mail::SpamAssassin::Plugin::AWL
+  loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
+  loadplugin Mail::SpamAssassin::Plugin::TextCat
+  loadplugin Mail::SpamAssassin::Plugin::AccessDB
+  loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
+  loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
+  loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
+  loadplugin Mail::SpamAssassin::Plugin::DKIM
+  loadplugin Mail::SpamAssassin::Plugin::Check
+  loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
+  loadplugin Mail::SpamAssassin::Plugin::URIDetail
+  loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
+  loadplugin Mail::SpamAssassin::Plugin::Bayes
+  loadplugin Mail::SpamAssassin::Plugin::BodyEval
+  loadplugin Mail::SpamAssassin::Plugin::DNSEval
+  loadplugin Mail::SpamAssassin::Plugin::HTMLEval
+  loadplugin Mail::SpamAssassin::Plugin::HeaderEval
+  loadplugin Mail::SpamAssassin::Plugin::MIMEEval
+  loadplugin Mail::SpamAssassin::Plugin::RelayEval
+  loadplugin Mail::SpamAssassin::Plugin::URIEval
+  loadplugin Mail::SpamAssassin::Plugin::WLBLEval
+  loadplugin Mail::SpamAssassin::Plugin::VBounce
+  loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody
+  loadplugin Mail::SpamAssassin::Plugin::ASN
+  loadplugin Mail::SpamAssassin::Plugin::ImageInfo
+  loadplugin Mail::SpamAssassin::Plugin::PhishTag
+  loadplugin Mail::SpamAssassin::Plugin::FreeMail
+  loadplugin Mail::SpamAssassin::Plugin::AskDNS
+  loadplugin Mail::SpamAssassin::Plugin::TxRep
+  loadplugin Mail::SpamAssassin::Plugin::URILocalBL
+  loadplugin Mail::SpamAssassin::Plugin::PDFInfo
+  loadplugin Mail::SpamAssassin::Plugin::HashBL
+  loadplugin Mail::SpamAssassin::Plugin::FromNameSpoof
+  loadplugin Mail::SpamAssassin::Plugin::Phishing
+  loadplugin Mail::SpamAssassin::Plugin::AuthRes
+  loadplugin Mail::SpamAssassin::Plugin::Esp
+  loadplugin Mail::SpamAssassin::Plugin::ExtractText
+  $plugins
 ");
 
 tstprefs("
-use_razor2 1
-use_dcc 1
-use_pyzor 1
-use_bayes 1
+  use_bayes 1
+  spf_timeout 2
+  use_razor2 1
+  razor_timeout 2
+  razor_fork 1
+  use_dcc 1
+  dcc_timeout 2
+  use_pyzor 1
+  pyzor_timeout 2
+  pyzor_fork 1
 ");
 
 %patterns = (
@@ -81,6 +85,7 @@ use_bayes 1
         q{ Syntax error }, 'syntax',
         q{ Use of uninitialized }, 'uninitialized',
         q{ warn: }, 'warn',
+        q{ SpamAssassin failed to parse line }, 'parse',
             );
 
 if (conf_bool('run_net_tests')) {

Added: spamassassin/trunk/t/askdns.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/askdns.t?rev=1888649&view=auto
==============================================================================
--- spamassassin/trunk/t/askdns.t (added)
+++ spamassassin/trunk/t/askdns.t Mon Apr 12 07:43:12 2021
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -T
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("askdns");
+
+use constant HAS_DKIM_VERIFIER => eval {
+  require Mail::DKIM::Verifier;
+  version->parse(Mail::DKIM::Verifier->VERSION) >= version->parse(0.31);
+};
+
+use Test::More;
+plan skip_all => "Net tests disabled"          unless conf_bool('run_net_tests');
+plan skip_all => "Can't use Net::DNS Safely"   unless can_use_net_dns_safely();
+
+my $tests = 4;
+$tests += 3 if (HAS_DKIM_VERIFIER);
+
+plan tests => $tests;
+
+# ---------------------------------------------------------------------------
+
+#
+# some DKIM stuff
+#
+
+if (HAS_DKIM_VERIFIER) {
+  tstlocalrules(q{
+    askdns  ASKDNS_DKIM_AUTHORDOMAIN  _AUTHORDOMAIN_.askdnstest.spamassassin.org. A /^127\.0\.0\.8$/
+    askdns  ASKDNS_DKIM_DKIMDOMAIN  _DKIMDOMAIN_.askdnstest.spamassassin.org. A /^127\.0\.0\.8$/
+    # Bug 7897 - test that meta rules depending on net rules hit
+    meta ASKDNS_META_AUTHORDOMAIN ASKDNS_DKIM_AUTHORDOMAIN
+  });
+  %patterns = (
+    q{ ASKDNS_DKIM_AUTHORDOMAIN } => 'ASKDNS_DKIM_AUTHORDOMAIN',
+    q{ ASKDNS_DKIM_DKIMDOMAIN } => 'ASKDNS_DKIM_DKIMDOMAIN',
+    q{ ASKDNS_META_AUTHORDOMAIN } => 'ASKDNS_META_AUTHORDOMAIN',
+  );
+  ok sarun ("-t < data/dkim/test-pass-01.msg 2>&1", \&patterns_run_cb);
+  ok_all_patterns();
+  clear_pattern_counters();
+}
+
+#
+# TXT
+#
+
+tstlocalrules(q{
+  askdns  ASKDNS_TXT_SPF spamassassin.org TXT /^v=spf1 -all$/
+});
+%patterns = (
+  q{ ASKDNS_TXT_SPF } => 'ASKDNS_TXT_SPF',
+  '[spamassassin.org TXT:v=spf1 -all]' => 'ASKDNS_TXT_SPF_LOG',
+);
+ok sarun ("-t -D < data/nice/001 2>&1", \&patterns_run_cb);
+ok_all_patterns();
+clear_pattern_counters();
+

Propchange: spamassassin/trunk/t/askdns.t
------------------------------------------------------------------------------
    svn:executable = *

Modified: spamassassin/trunk/t/authres.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/authres.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/authres.t (original)
+++ spamassassin/trunk/t/authres.t Mon Apr 12 07:43:12 2021
@@ -1,9 +1,7 @@
 #!/usr/bin/perl -T
 
-use lib '.'; 
-use lib 't';
-use SATest; 
-sa_t_init("authres");
+use lib '.'; use lib 't';
+use SATest; sa_t_init("authres");
 
 use Test::More;
 plan tests => 44;
@@ -17,11 +15,11 @@ loadplugin Mail::SpamAssassin::Plugin::A
 ## with internal networks
 
 tstprefs("
-clear_internal_networks
-clear_trusted_networks
-internal_networks 212.17.35.15
-trusted_networks 212.17.35.15
-trusted_networks 141.154.95.22
+  clear_internal_networks
+  clear_trusted_networks
+  internal_networks 212.17.35.15
+  trusted_networks 212.17.35.15
+  trusted_networks 141.154.95.22
 ");
 
 %patterns = (
@@ -48,13 +46,13 @@ ok_all_patterns();
 ## with trusted networks included
 
 tstprefs("
-clear_internal_networks
-clear_trusted_networks
-internal_networks 212.17.35.15
-trusted_networks 212.17.35.15
-trusted_networks 141.154.95.22
+  clear_internal_networks
+  clear_trusted_networks
+  internal_networks 212.17.35.15
+  trusted_networks 212.17.35.15
+  trusted_networks 141.154.95.22
 
-authres_networks trusted
+  authres_networks trusted
 ");
 
 %patterns = (
@@ -81,14 +79,14 @@ ok_all_patterns();
 ## with all networks (test ignore also)
 
 tstprefs("
-clear_internal_networks
-clear_trusted_networks
-internal_networks 212.17.35.15
-trusted_networks 212.17.35.15
-trusted_networks 141.154.95.22
+  clear_internal_networks
+  clear_trusted_networks
+  internal_networks 212.17.35.15
+  trusted_networks 212.17.35.15
+  trusted_networks 141.154.95.22
 
-authres_networks all
-authres_ignored_authserv authrestest3int authrestest4int
+  authres_networks all
+  authres_ignored_authserv authrestest3int authrestest4int
 ");
 
 %patterns = (
@@ -115,14 +113,14 @@ ok_all_patterns();
 ## with all networks (test trusted also)
 
 tstprefs("
-clear_internal_networks
-clear_trusted_networks
-internal_networks 212.17.35.15
-trusted_networks 212.17.35.15
-trusted_networks 141.154.95.22
+  clear_internal_networks
+  clear_trusted_networks
+  internal_networks 212.17.35.15
+  trusted_networks 212.17.35.15
+  trusted_networks 141.154.95.22
 
-authres_networks all
-authres_trusted_authserv authrestest6int
+  authres_networks all
+  authres_trusted_authserv authrestest6int
 ");
 
 %patterns = (

Modified: spamassassin/trunk/t/autolearn.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/autolearn.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/autolearn.t (original)
+++ spamassassin/trunk/t/autolearn.t Mon Apr 12 07:43:12 2021
@@ -13,15 +13,13 @@ plan tests => 2;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{ autolearn=spam } => 'autolearned as spam'
-
+  q{ autolearn=spam } => 'autolearned as spam'
 );
 
 %anti_patterns = (
 );
 
-tstprefs ('
+tstprefs ("
 
 body	AUTOLEARNTEST_BODY	/EVOLUTION PREVIEW RELEASE/
 score	AUTOLEARNTEST_BODY	1.5
@@ -45,7 +43,8 @@ use_bayes 1
 bayes_auto_learn 1
 bayes_auto_learn_threshold_spam 6.0
 
-');
+");
 
 ok (sarun ("-L -t < data/nice/001", \&patterns_run_cb));
 ok_all_patterns();
+

Modified: spamassassin/trunk/t/autolearn_force.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/autolearn_force.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/autolearn_force.t (original)
+++ spamassassin/trunk/t/autolearn_force.t Mon Apr 12 07:43:12 2021
@@ -13,15 +13,13 @@ plan tests => 2;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{ autolearn=spam autolearn_force=yes } => 'autolearned as spam with autolearn_force'
-
+  q{ autolearn=spam autolearn_force=yes } => 'autolearned as spam with autolearn_force'
 );
 
 %anti_patterns = (
 );
 
-tstprefs ('
+tstprefs ("
 
 body	AUTOLEARNTEST_BODY	/EVOLUTION PREVIEW RELEASE/
 score	AUTOLEARNTEST_BODY	7.0
@@ -31,7 +29,8 @@ use_bayes 1
 bayes_auto_learn 1
 bayes_auto_learn_threshold_spam 6.0
 
-');
+");
 
 ok (sarun ("-L -t < data/nice/001", \&patterns_run_cb));
 ok_all_patterns();
+

Modified: spamassassin/trunk/t/autolearn_force_fail.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/autolearn_force_fail.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/autolearn_force_fail.t (original)
+++ spamassassin/trunk/t/autolearn_force_fail.t Mon Apr 12 07:43:12 2021
@@ -13,14 +13,14 @@ plan tests => 3;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-q{ autolearn=no } => 'autolearn no',
+  q{ autolearn=no } => 'autolearn no',
 );
 
 %anti_patterns = (
-q{ autolearn=spam } => 'autolearned as spam',
+  q{ autolearn=spam } => 'autolearned as spam',
 );
 
-tstprefs ('
+tstprefs ("
 
 header	 AUTOLEARNTEST_FROM_HEADER	From =~ /@/
 score	 AUTOLEARNTEST_FROM_HEADER	13.0
@@ -30,7 +30,7 @@ use_bayes 1
 bayes_auto_learn 1
 bayes_auto_learn_threshold_spam 12.0
 
-');
+");
 
 ok (sarun ("-L -t < data/nice/001", \&patterns_run_cb));
 ok_all_patterns();

Modified: spamassassin/trunk/t/basic_lint.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_lint.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/basic_lint.t (original)
+++ spamassassin/trunk/t/basic_lint.t Mon Apr 12 07:43:12 2021
@@ -7,9 +7,7 @@ use Test::More tests => 1;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{  }, 'anything',
-
+  q{  }, 'anything',
 );
 
 # override locale for this test!
@@ -17,3 +15,4 @@ $ENV{'LANGUAGE'} = $ENV{'LC_ALL'} = 'C';
 
 sarun ("-L --lint", \&patterns_run_cb);
 ok_all_patterns();
+

Added: spamassassin/trunk/t/basic_lint_net.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_lint_net.t?rev=1888649&view=auto
==============================================================================
--- spamassassin/trunk/t/basic_lint_net.t (added)
+++ spamassassin/trunk/t/basic_lint_net.t Mon Apr 12 07:43:12 2021
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -T
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("basic_lint_net");
+use Test::More;
+
+plan skip_all => "Net tests disabled" unless conf_bool('run_net_tests');
+
+plan tests => 1;
+
+# ---------------------------------------------------------------------------
+
+%patterns = (
+  q{  }, 'anything',
+);
+
+# override locale for this test!
+$ENV{'LANGUAGE'} = $ENV{'LC_ALL'} = 'C';
+
+sarun ("--lint", \&patterns_run_cb);
+ok_all_patterns();
+

Propchange: spamassassin/trunk/t/basic_lint_net.t
------------------------------------------------------------------------------
    svn:executable = *

Modified: spamassassin/trunk/t/basic_lint_without_sandbox.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_lint_without_sandbox.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/basic_lint_without_sandbox.t (original)
+++ spamassassin/trunk/t/basic_lint_without_sandbox.t Mon Apr 12 07:43:12 2021
@@ -9,16 +9,14 @@ use Test::More tests => 3;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{  }, 'anything',
-
+  q{  }, 'anything',
 );
 
 # override locale for this test!
 $ENV{'LANGUAGE'} = $ENV{'LC_ALL'} = 'C';
 
-my $scoresfile  = "log/test_rules_copy/50_scores.cf";
-my $sandboxfile = "log/test_rules_copy/70_sandbox.cf";
+my $scoresfile  = "$localrules/50_scores.cf";
+my $sandboxfile = "$localrules/70_sandbox.cf";
 
 # when running from the built tarball or make disttest, we will not have a full
 # rules dir -- therefore no 70_sandbox.cf.  We will also have no 50_scores.cf,
@@ -32,3 +30,4 @@ SKIP: {
 
 sarun ("-L --lint", \&patterns_run_cb);
 ok_all_patterns();
+

Modified: spamassassin/trunk/t/basic_meta.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_meta.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/basic_meta.t (original)
+++ spamassassin/trunk/t/basic_meta.t Mon Apr 12 07:43:12 2021
@@ -1,23 +1,8 @@
 #!/usr/bin/perl -w -T
 
-BEGIN {
-  if (-e 't/test_dir') { # if we are running "t/rule_names.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 strict;
 use lib '.'; use lib 't';
-use SATest; sa_t_init("meta");
+use SATest; sa_t_init("basic_meta");
 
 use Mail::SpamAssassin;
 
@@ -37,18 +22,18 @@ my $meta_dependency_disabled = 0;
 my $meta_dependency_nonexistent = 0;
 
 for (my $scoreset = 0; $scoreset < 4; $scoreset++) {
-  my $output = "log/rules-$scoreset.pl";
+  my $output = "$workdir/rules-$scoreset.pl";
   unlink $output || die;
   %rules = ();
   %scores = ();
-  if (untaint_system("$perl_path $prefix/build/parse-rules-for-masses -o $output -d \"$prefix/rules\" -s $scoreset -x")) {
+  if (untaint_system("$perl_path ../build/parse-rules-for-masses -o $output -d \"../rules\" -s $scoreset -x")) {
     warn "parse-rules-for-masses failed!";
   }
   eval {
-    require "log/rules-$scoreset.pl";
+    require "$workdir/rules-$scoreset.pl";
   };
   if ($@) {
-    warn "log/rules-$scoreset.pl is unparseable: $@";
+    warn "$workdir/rules-$scoreset.pl is unparseable: $@";
     warn "giving up on test.";
     ok(1);
     ok(1);

Modified: spamassassin/trunk/t/basic_meta2.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_meta2.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/basic_meta2.t (original)
+++ spamassassin/trunk/t/basic_meta2.t Mon Apr 12 07:43:12 2021
@@ -2,8 +2,7 @@
 
 use lib '.'; 
 use lib 't';
-use SATest; 
-sa_t_init("meta2");
+use SATest; sa_t_init("basic_meta2");
 
 use Test::More;
 plan tests => 5;
@@ -25,7 +24,7 @@ plan tests => 5;
 
 );
 
-tstprefs (qq{
+tstlocalrules (qq{
 
    body __FOO_1 /a/
    body __FOO_2 /b/

Modified: spamassassin/trunk/t/basic_obj_api.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/basic_obj_api.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/basic_obj_api.t (original)
+++ spamassassin/trunk/t/basic_obj_api.t Mon Apr 12 07:43:12 2021
@@ -1,21 +1,5 @@
 #!/usr/bin/perl -T
 
-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');
-    unshift(@INC, '../lib');
-  }
-}
-
-my $prefix = '.';
-if (-e 'test_dir') {            # running from test directory, not ..
-  $prefix = '..';
-}
-
 use lib '.'; use lib 't';
 use SATest; sa_t_init("basic_obj_api");
 use Test::More tests => 4;

Modified: spamassassin/trunk/t/bayesbdb.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayesbdb.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayesbdb.t (original)
+++ spamassassin/trunk/t/bayesbdb.t Mon Apr 12 07:43:12 2021
@@ -2,20 +2,11 @@
 
 use Data::Dumper;
 use lib '.'; use lib 't';
-use SATest; sa_t_init("bayes");
+use SATest; sa_t_init("bayesbdb");
 
 use constant HAS_BDB => eval { require BerkeleyDB };
 
 use Test::More;
-BEGIN { 
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
 
 plan skip_all => "Long running tests disabled" unless conf_bool('run_long_tests');
 plan skip_all => "BerkeleyDB is unavailable" unless HAS_BDB;
@@ -28,8 +19,8 @@ plan skip_all => "BerkeleyDB is unavaila
 plan tests => 42;
 
 
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::BDB
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::BDB
 ");
 
 use Mail::SpamAssassin;
@@ -151,13 +142,13 @@ getimpl->{store}->untie_db();
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayesbdb'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-bayes_store_module Mail::SpamAssassin::BayesStore::BDB
-bayes_min_spam_num 10
-bayes_min_ham_num 10
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::BDB
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide
@@ -238,9 +229,9 @@ ok($score =~ /\d/ && $score <= 1.0 && $s
 
 ok(getimpl->{store}->clear_database());
 
-ok(!-e 'log/user_state/bayes/vars.db');
-ok(!-e 'log/user_state/bayes/seen.db');
-ok(!-e 'log/user_state/bayes/toks.db');
+ok(!-e "$userstate/bayes/vars.db");
+ok(!-e "$userstate/bayes/seen.db");
+ok(!-e "$userstate/bayes/toks.db");
 
 sub check_examined {
   local ($_);

Modified: spamassassin/trunk/t/bayesdbm.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayesdbm.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayesdbm.t (original)
+++ spamassassin/trunk/t/bayesdbm.t Mon Apr 12 07:43:12 2021
@@ -2,27 +2,18 @@
 
 use Data::Dumper;
 use lib '.'; use lib 't';
-use SATest; sa_t_init("bayes");
+use SATest; sa_t_init("bayesdbm");
 
 use constant HAS_DB_FILE => eval { require DB_File };
  
 use Test::More;
-BEGIN { 
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
 
 plan skip_all => "Long running tests disabled" unless conf_bool('run_long_tests');
 plan skip_all => "DB_File is unavailable" unless HAS_DB_FILE;
 plan tests => 48;
 
-tstlocalrules ("
-        bayes_learn_to_journal 0
+tstprefs ("
+  bayes_learn_to_journal 0
 ");
 
 use Mail::SpamAssassin;
@@ -144,40 +135,40 @@ getimpl->{store}->untie_db();
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayesdbm'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_learn_to_journal 1
+tstprefs ("
+  bayes_learn_to_journal 1
 ");
 
 $sa = create_saobj();
 
 $sa->init();
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
 ok($sa->{bayes_scanner}->learn(1, $mail));
 
-ok(-e 'log/user_state/bayes_journal');
+ok(-e "$userstate/bayes_journal");
 
 $sa->{bayes_scanner}->sync(1); # always returns 0, so no need to check return
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
-ok(-e 'log/user_state/bayes_seen');
+ok(-e "$userstate/bayes_seen");
 
-ok(-e 'log/user_state/bayes_toks');
+ok(-e "$userstate/bayes_toks");
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayesdbm'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-bayes_learn_to_journal 0
-bayes_min_spam_num 10
-bayes_min_ham_num 10
+tstprefs ("
+  bayes_learn_to_journal 0
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide
@@ -258,9 +249,9 @@ ok($score =~ /\d/ && $score <= 1.0 && $s
 
 ok(getimpl->{store}->clear_database());
 
-ok(!-e 'log/user_state/bayes_journal');
-ok(!-e 'log/user_state/bayes_seen');
-ok(!-e 'log/user_state/bayes_toks');
+ok(!-e "$userstate/bayes_journal");
+ok(!-e "$userstate/bayes_seen");
+ok(!-e "$userstate/bayes_toks");
 
 sub check_examined {
   local ($_);

Modified: spamassassin/trunk/t/bayesdbm_flock.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayesdbm_flock.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayesdbm_flock.t (original)
+++ spamassassin/trunk/t/bayesdbm_flock.t Mon Apr 12 07:43:12 2021
@@ -7,24 +7,15 @@ use SATest; sa_t_init("bayesdbm_flock");
 use constant HAS_DB_FILE => eval { require DB_File };
 
 use Test::More;
-BEGIN { 
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
 
 plan skip_all => "Long running tests disabled" unless conf_bool('run_long_tests');
 plan skip_all => "Tests don't work on windows" if $RUNNING_ON_WINDOWS;
 plan skip_all => "DB_File is unavailable" unless HAS_DB_FILE;
 plan tests => 48;
 
-tstlocalrules ("
-        bayes_learn_to_journal 0
-        lock_method flock
+tstprefs ("
+  bayes_learn_to_journal 0
+  lock_method flock
 ");
 
 use Mail::SpamAssassin;
@@ -152,42 +143,42 @@ alarm(0);
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayesdbm_flock'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_learn_to_journal 1
+tstprefs ("
+  bayes_learn_to_journal 1
 ");
 
 $sa = create_saobj();
 
 $sa->init();
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
 ok($sa->{bayes_scanner}->learn(1, $mail));
 
-ok(-e 'log/user_state/bayes_journal');
+ok(-e "$userstate/bayes_journal");
 
 $sa->{bayes_scanner}->sync(1); # always returns 0, so no need to check return
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
-ok(-e 'log/user_state/bayes_seen');
+ok(-e "$userstate/bayes_seen");
 
-ok(-e 'log/user_state/bayes_toks');
+ok(-e "$userstate/bayes_toks");
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayesdbm_flock'); # this wipes out what is there and begins anew
 
 alarm(0);  # cancel timer - make sure that alarm is off
 
 # make sure we learn to a journal
-tstlocalrules ("
-bayes_learn_to_journal 0
-bayes_min_spam_num 10
-bayes_min_ham_num 10
+tstprefs ("
+  bayes_learn_to_journal 0
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide
@@ -268,9 +259,9 @@ ok($score =~ /\d/ && $score <= 1.0 && $s
 
 ok(getimpl->{store}->clear_database());
 
-ok(!-e 'log/user_state/bayes_journal');
-ok(!-e 'log/user_state/bayes_seen');
-ok(!-e 'log/user_state/bayes_toks');
+ok(!-e "$userstate/bayes_journal");
+ok(!-e "$userstate/bayes_seen");
+ok(!-e "$userstate/bayes_toks");
 
 sub check_examined {
   local ($_);

Modified: spamassassin/trunk/t/bayessdbm.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayessdbm.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayessdbm.t (original)
+++ spamassassin/trunk/t/bayessdbm.t Mon Apr 12 07:43:12 2021
@@ -2,28 +2,19 @@
 
 use Data::Dumper;
 use lib '.'; use lib 't';
-use SATest; sa_t_init("bayes");
+use SATest; sa_t_init("bayessdbm");
 
 use constant HAS_SDBM_FILE => eval { require SDBM_File };
 
 use Test::More;
-BEGIN {
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
 
 plan skip_all => "Long running tests disabled" unless conf_bool('run_long_tests');
 plan skip_all => "No SDBM_File" unless HAS_SDBM_FILE;
 plan tests => 52;
 
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-        bayes_learn_to_journal 0
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 0
 ");
 
 use Mail::SpamAssassin;
@@ -145,44 +136,44 @@ getimpl->{store}->untie_db();
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayessdbm'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-        bayes_learn_to_journal 1
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 1
 ");
 
 $sa = create_saobj();
 
 $sa->init();
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
 ok($sa->{bayes_scanner}->learn(1, $mail));
 
-ok(-e 'log/user_state/bayes_journal');
+ok(-e "$userstate/bayes_journal");
 
 $sa->{bayes_scanner}->sync(1); # always returns 0, so no need to check return
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
-ok(-e 'log/user_state/bayes_seen.pag');
-ok(-e 'log/user_state/bayes_seen.dir');
+ok(-e "$userstate/bayes_seen.pag");
+ok(-e "$userstate/bayes_seen.dir");
 
-ok(-e 'log/user_state/bayes_toks.pag');
-ok(-e 'log/user_state/bayes_toks.dir');
+ok(-e "$userstate/bayes_toks.pag");
+ok(-e "$userstate/bayes_toks.dir");
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayessdbm'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-bayes_learn_to_journal 0
-bayes_min_spam_num 10
-bayes_min_ham_num 10
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 0
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide
@@ -263,11 +254,11 @@ ok($score =~ /\d/ && $score <= 1.0 && $s
 
 ok(getimpl->{store}->clear_database());
 
-ok(!-e 'log/user_state/bayes_journal');
-ok(!-e 'log/user_state/bayes_seen.pag');
-ok(!-e 'log/user_state/bayes_seen.dir');
-ok(!-e 'log/user_state/bayes_toks.pag');
-ok(!-e 'log/user_state/bayes_toks.dir');
+ok(!-e "$userstate/bayes_journal");
+ok(!-e "$userstate/bayes_seen.pag");
+ok(!-e "$userstate/bayes_seen.dir");
+ok(!-e "$userstate/bayes_toks.pag");
+ok(!-e "$userstate/bayes_toks.dir");
 
 sub check_examined {
   local ($_);

Modified: spamassassin/trunk/t/bayessdbm_seen_delete.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayessdbm_seen_delete.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayessdbm_seen_delete.t (original)
+++ spamassassin/trunk/t/bayessdbm_seen_delete.t Mon Apr 12 07:43:12 2021
@@ -11,19 +11,9 @@ plan skip_all => "Long running tests dis
 plan skip_all => "No SDBM_File" unless HAS_SDBM_FILE;
 plan tests => 54;
 
-BEGIN {
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
-
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-        bayes_learn_to_journal 0
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 0
 ");
 
 use Mail::SpamAssassin;
@@ -145,44 +135,44 @@ getimpl->{store}->untie_db();
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayessdbm_seen_delete'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-        bayes_learn_to_journal 1
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 1
 ");
 
 $sa = create_saobj();
 
 $sa->init();
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
 ok($sa->{bayes_scanner}->learn(1, $mail));
 
-ok(-e 'log/user_state/bayes_journal');
+ok(-e "$userstate/bayes_journal");
 
 $sa->{bayes_scanner}->sync(1); # always returns 0, so no need to check return
 
-ok(!-e 'log/user_state/bayes_journal');
+ok(!-e "$userstate/bayes_journal");
 
-ok(-e 'log/user_state/bayes_seen.pag');
-ok(-e 'log/user_state/bayes_seen.dir');
+ok(-e "$userstate/bayes_seen.pag");
+ok(-e "$userstate/bayes_seen.dir");
 
-ok(-e 'log/user_state/bayes_toks.pag');
-ok(-e 'log/user_state/bayes_toks.dir');
+ok(-e "$userstate/bayes_toks.pag");
+ok(-e "$userstate/bayes_toks.dir");
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init('bayessdbm_seen_delete'); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-        bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
-bayes_learn_to_journal 0
-bayes_min_spam_num 10
-bayes_min_ham_num 10
+tstprefs ("
+  bayes_store_module Mail::SpamAssassin::BayesStore::SDBM
+  bayes_learn_to_journal 0
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide
@@ -204,9 +194,9 @@ ok_all_patterns();
 
 # now delete the journal and bayes_seen -- should still be possible
 # for Bayes to continue...
-unlink 'log/user_state/bayes_journal';
-ok(unlink 'log/user_state/bayes_seen.pag');
-ok(unlink 'log/user_state/bayes_seen.dir');
+unlink "$userstate/bayes_journal";
+ok(unlink "$userstate/bayes_seen.pag");
+ok(unlink "$userstate/bayes_seen.dir");
 
 use constant SCAN_USING_PERL_CODE_TEST => 1;
 
@@ -267,11 +257,11 @@ ok($score =~ /\d/ && $score <= 1.0 && $s
 
 ok(getimpl->{store}->clear_database());
 
-ok(!-e 'log/user_state/bayes_journal');
-ok(!-e 'log/user_state/bayes_seen.pag');
-ok(!-e 'log/user_state/bayes_seen.dir');
-ok(!-e 'log/user_state/bayes_toks.pag');
-ok(!-e 'log/user_state/bayes_toks.dir');
+ok(!-e "$userstate/bayes_journal");
+ok(!-e "$userstate/bayes_seen.pag");
+ok(!-e "$userstate/bayes_seen.dir");
+ok(!-e "$userstate/bayes_toks.pag");
+ok(!-e "$userstate/bayes_toks.dir");
 
 sub check_examined {
   local ($_);

Modified: spamassassin/trunk/t/bayessql.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/bayessql.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/bayessql.t (original)
+++ spamassassin/trunk/t/bayessql.t Mon Apr 12 07:43:12 2021
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -T
 
 use lib '.'; use lib 't';
-use SATest;
+use SATest; sa_t_init("bayessql");
 
 use constant HAS_DBI => eval { require DBI; }; # for our cleanup stuff
 
@@ -10,16 +10,6 @@ plan skip_all => "Bayes SQL tests are di
 plan skip_all => "DBI is unavailable on this system" unless HAS_DBI;
 plan tests => 53;
 
-BEGIN {
-  if (-e 't/test_dir') {
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {
-    unshift(@INC, '../blib/lib');
-  }
-}
-
 diag "Note: Failure may be due to an incorrect config.";
 
 my $dbdsn = conf('bayes_sql_dsn');
@@ -40,13 +30,11 @@ foreach my $setting (qw(
 
 my $testuser = 'tstusr.'.$$.'.'.time();
 
-sa_t_init("bayes");
-
-tstlocalrules ("
-$dbconfig
-bayes_sql_override_username $testuser
-loadplugin validuserplugin ../../data/validuserplugin.pm
-bayes_sql_username_authorized 1
+tstprefs ("
+  $dbconfig
+  bayes_sql_override_username $testuser
+  loadplugin validuserplugin ../../../data/validuserplugin.pm
+  bayes_sql_username_authorized 1
 ");
 
 use Mail::SpamAssassin;
@@ -79,13 +67,13 @@ $sa->finish_learner();
 
 undef $sa;
 
-sa_t_init("bayes");
+sa_t_init("bayessql");
 
-tstlocalrules ("
-$dbconfig
-bayes_sql_override_username iwillfail
-loadplugin validuserplugin ../../data/validuserplugin.pm
-bayes_sql_username_authorized 1
+tstprefs ("
+  $dbconfig
+  bayes_sql_override_username iwillfail
+  loadplugin validuserplugin ../../data/validuserplugin.pm
+  bayes_sql_username_authorized 1
 ");
 
 $sa = create_saobj();
@@ -102,11 +90,11 @@ $sa->finish_learner();
 
 undef $sa;
 
-sa_t_init("bayes");
+sa_t_init("bayessql");
 
-tstlocalrules ("
-$dbconfig
-bayes_sql_override_username $testuser
+tstprefs ("
+  $dbconfig
+  bayes_sql_override_username $testuser
 ");
 
 $sa = create_saobj();
@@ -241,14 +229,14 @@ $sa->finish_learner();
 
 undef $sa;
 
-sa_t_init('bayes'); # this wipes out what is there and begins anew
+sa_t_init("bayessql"); # this wipes out what is there and begins anew
 
 # make sure we learn to a journal
-tstlocalrules ("
-$dbconfig
-bayes_min_spam_num 10
-bayes_min_ham_num 10
-bayes_sql_override_username $testuser
+tstprefs ("
+  $dbconfig
+  bayes_min_spam_num 10
+  bayes_min_ham_num 10
+  bayes_sql_override_username $testuser
 ");
 
 # we get to bastardize the existing pattern matching code here.  It lets us provide

Modified: spamassassin/trunk/t/blacklist_autolearn.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/blacklist_autolearn.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/blacklist_autolearn.t (original)
+++ spamassassin/trunk/t/blacklist_autolearn.t Mon Apr 12 07:43:12 2021
@@ -7,21 +7,17 @@ use Test::More tests => 3;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{ USER_IN_BLACKLIST }, 'blacklisted',
-
-
+  q{ USER_IN_BLACKLIST }, 'blacklisted',
 );
 
 %anti_patterns = (
-q{ autolearn=ham } => 'autolearned as ham'
+  q{ autolearn=ham } => 'autolearned as ham'
 );
 
 tstprefs ('
-
-blacklist_from *@ximian.com
-
+  blacklist_from *@ximian.com
 ');
 
 ok (sarun ("-L -t < data/nice/001", \&patterns_run_cb));
 ok_all_patterns();
+

Modified: spamassassin/trunk/t/blocklist_autolearn.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/blocklist_autolearn.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/blocklist_autolearn.t (original)
+++ spamassassin/trunk/t/blocklist_autolearn.t Mon Apr 12 07:43:12 2021
@@ -7,21 +7,17 @@ use Test::More tests => 3;
 # ---------------------------------------------------------------------------
 
 %patterns = (
-
-q{ USER_IN_BLOCKLIST }, 'blocklisted',
-
-
+  q{ USER_IN_BLOCKLIST }, 'blocklisted',
 );
 
 %anti_patterns = (
-q{ autolearn=ham } => 'autolearned as ham'
+  q{ autolearn=ham } => 'autolearned as ham'
 );
 
 tstprefs ('
-
-blacklist_from *@ximian.com
-
+  blacklist_from *@ximian.com
 ');
 
 ok (sarun ("-L -t < data/nice/001", \&patterns_run_cb));
 ok_all_patterns();
+

Modified: spamassassin/trunk/t/body_mod.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/body_mod.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/body_mod.t (original)
+++ spamassassin/trunk/t/body_mod.t Mon Apr 12 07:43:12 2021
@@ -1,20 +1,5 @@
 #!/usr/bin/perl -w -T
 
-BEGIN {
-  if (-e 't/test_dir') { # if we are running "t/body_mod.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 strict;
 use lib '.'; use lib 't';
 use SATest; sa_t_init("body_mod");

Modified: spamassassin/trunk/t/body_str.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/body_str.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/body_str.t (original)
+++ spamassassin/trunk/t/body_str.t Mon Apr 12 07:43:12 2021
@@ -2,21 +2,6 @@
 
 # test URIs with UTF8 IDNA-equivalent dots between domains instead of ordinary '.'
 
-BEGIN {
-  if (-e 't/test_dir') { # if we are running "t/rule_names.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 strict;
 use lib '.'; use lib 't';
 use SATest; sa_t_init("body_str.t");

Modified: spamassassin/trunk/t/check_implemented.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/check_implemented.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/check_implemented.t (original)
+++ spamassassin/trunk/t/check_implemented.t Mon Apr 12 07:43:12 2021
@@ -1,24 +1,5 @@
 #!/usr/bin/perl -T
 
-# detect use of dollar-ampersand somewhere in the perl interpreter;
-# once it is used once, it slows down every regexp match thereafter.
-
-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');
-    unshift(@INC, '../lib');
-  }
-}
-
-my $prefix = '.';
-if (-e 'test_dir') {            # running from test directory, not ..
-  $prefix = '..';
-}
-
 use lib '.'; use lib 't';
 use SATest; sa_t_init("check_implemented");
 
@@ -33,14 +14,14 @@ require Mail::SpamAssassin;
 
 # kill all 'loadplugin' lines
 foreach my $file 
-        (<log/localrules.tmp/*.pre>, <log/test_rules_copy/*.pre>) #*/
+        (<$localrules/*.pre>, <$siterules/*.pre>) #*/
 {
   $file = main::untaint_var($file);
   rename $file, "$file.bak" or die "rename $file failed";
   open IN, "<$file.bak" or die "cannot read $file.bak";
   open OUT, ">$file" or die "cannot write $file";
   while (<IN>) {
-    s/^loadplugin/###loadplugin/g;
+    s/^\s*loadplugin/###loadplugin/g;
     print OUT;
   }
   close IN;

Modified: spamassassin/trunk/t/cidrs.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/cidrs.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/cidrs.t (original)
+++ spamassassin/trunk/t/cidrs.t Mon Apr 12 07:43:12 2021
@@ -1,19 +1,7 @@
 #!/usr/bin/perl -T
 
-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("cidrs");
 
 use strict;
 
@@ -23,7 +11,7 @@ use Mail::SpamAssassin;
 use Mail::SpamAssassin::NetSet;
 
 my $sa = Mail::SpamAssassin->new({
-    rules_filename => "$prefix/rules",
+    rules_filename => $localrules,
 });
 
 sub tryone ($@) {

Modified: spamassassin/trunk/t/config_errs.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/config_errs.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/config_errs.t (original)
+++ spamassassin/trunk/t/config_errs.t Mon Apr 12 07:43:12 2021
@@ -22,21 +22,6 @@ $/ox;
 
 # ---------------------------------------------------------------------------
 
-BEGIN {
-  if (-e 't/test_dir') { # if we are running "t/rule_names.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 strict;
 use lib '.'; use lib 't';
 use SATest; sa_t_init("config_errs");

Modified: spamassassin/trunk/t/config_tree_recurse.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/config_tree_recurse.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/config_tree_recurse.t (original)
+++ spamassassin/trunk/t/config_tree_recurse.t Mon Apr 12 07:43:12 2021
@@ -5,24 +5,8 @@
 delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
 $ENV{PATH}='/bin:/usr/bin:/usr/local/bin';
 
-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');
-    unshift(@INC, '../lib');
-  }
-}
-
-my $prefix = '.';
-if (-e 'test_dir') {            # running from test directory, not ..
-  $prefix = '..';
-}
-
 use lib '.'; use lib 't';
-use SATest; sa_t_init("basic_obj_api");
+use SATest; sa_t_init("config_tree_recurse.t");
 use Test::More tests => 4;
 
 # ---------------------------------------------------------------------------

Modified: spamassassin/trunk/t/cross_user_config_leak.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/cross_user_config_leak.t?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/cross_user_config_leak.t (original)
+++ spamassassin/trunk/t/cross_user_config_leak.t Mon Apr 12 07:43:12 2021
@@ -1,21 +1,5 @@
 #!/usr/bin/perl -T
 
-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');
-    unshift(@INC, '../lib');
-  }
-}
-
-my $prefix = '.';
-if (-e 'test_dir') {            # running from test directory, not ..
-  $prefix = '..';
-}
-
 use lib '.'; use lib 't';
 use SATest; sa_t_init("cross_user_config_leak");
 use Test::More tests => 6;
@@ -43,6 +27,9 @@ use warnings;
 require Mail::SpamAssassin;
 
 my $sa = create_saobj({
+    rules_filename => $localrules,
+    site_rules_filename => $siterules,
+    userprefs_filename  => $userrules,
     require_rules        => 1,
     local_tests_only     => 1,
     dont_copy_prefs      => 1,
@@ -77,11 +64,11 @@ my %expected_val;
 my %ignored_command;
 foreach my $k (@ignored_commands) { $ignored_command{$k}++; }
 
-print "Reading log/user_prefs1\n";
-$sa->read_scoreonly_config("log/user_prefs1");
+print "Reading $workdir/user_prefs1\n";
+$sa->read_scoreonly_config("$workdir/user_prefs1");
 set_all_confs($sa->{conf});
 
-$sa->signal_user_changed( { username => "user1", user_dir => "log/user1" });
+$sa->signal_user_changed( { username => "user1", user_dir => "$workdir/user1" });
 ok validate_all_confs($sa->{conf}, 1, 'after first user config read');
 
 print "Restoring config from backup\n";
@@ -89,9 +76,9 @@ $sa->copy_config(\%conf_backup, undef) o
 ok validate_all_confs($sa->{conf}, 0, 'after restoring from backup');
 
 
-print "Reading log/user_prefs2\n";
-$sa->read_scoreonly_config("log/user_prefs2");
-$sa->signal_user_changed( { username => "user2", user_dir => "log/user2" });
+print "Reading $workdir/user_prefs2\n";
+$sa->read_scoreonly_config("$workdir/user_prefs2");
+$sa->signal_user_changed( { username => "user2", user_dir => "$workdir/user2" });
 ok validate_all_confs($sa->{conf}, 0, 'after second user config read');
 
 print "Restoring config from backup, second time\n";
@@ -205,6 +192,9 @@ sub validate_all_confs {
     # if the default value is undef, it's a permitted value, obvs
     next if ($settings_should_exist && !defined $cmd->{default});
 
+    # ignore use_dcc etc changed default from data/01_test_rules.cf
+    next if $k =~ /^use_(?:dcc|razor2|pyzor)$/;
+
     $setting_details = "key='$k' when=$stage";
     if (!defined $cmd->{type}) {
       # warn "undef config type for $k";                # already done this
@@ -261,10 +251,12 @@ sub assert_validation {
         " wanted=".(defined $expected_val ? "'$expected_val'" : "(none)").
         " $setting_details";
     $validation_passed = 0;
+    $keep_workdir = 1;
   }
   if (!$settings_should_exist && defined($val) && "".$val eq "".$expected_val) {
     warn "found=".(defined $val ? "'$val'" : "(none)")." wanted=(none)".
         " $setting_details";
     $validation_passed = 0;
+    $keep_workdir = 1;
   }
 }

Propchange: spamassassin/trunk/t/cross_user_config_leak.t
------------------------------------------------------------------------------
    svn:executable = *

Modified: spamassassin/trunk/t/data/01_test_rules.cf
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/data/01_test_rules.cf?rev=1888649&r1=1888648&r2=1888649&view=diff
==============================================================================
--- spamassassin/trunk/t/data/01_test_rules.cf (original)
+++ spamassassin/trunk/t/data/01_test_rules.cf Mon Apr 12 07:43:12 2021
@@ -18,55 +18,16 @@
 # limitations under the License.
 # </...@LICENSE>
 
-# copied from 10_default_prefs.cf
-clear_report_template
-report Spam detection software, running on the system "_HOSTNAME_", has
-report identified this incoming email as possible spam.  The original message
-report has been attached to this so you can view it (if it isn't spam) or label
-report similar future email.  If you have any questions, see
-report _CONTACTADDRESS_ for details.
-report
-report Content preview:  _PREVIEW_
-report
-report Content analysis details:   (_SCORE_ points, _REQD_ required)
-report
-report " pts rule name              description"
-report  ---- ---------------------- --------------------------------------------------
-report _SUMMARY_
-
-report_contact  @@CONTACT_ADDRESS@@
-
-clear_unsafe_report_template
-unsafe_report The original message was not completely plain text, and may be unsafe to
-unsafe_report open with some email clients; in particular, it may contain a virus,
-unsafe_report or confirm that your address can receive spam.  If you wish to view
-unsafe_report it, it may be safer to save it to a file and open it with an editor.
-
-clear_headers
-add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_
-add_header spam Flag _YESNOCAPS_
-add_header all Level _STARS(*)_
-add_header all Status "_YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_"
-
-clear_originating_ip_headers
-originating_ip_headers X-Yahoo-Post-IP X-Originating-IP X-Apparently-From
-originating_ip_headers X-SenderIP
-
-required_score           5
-ok_locales              all
-ifplugin Mail::SpamAssassin::Plugin::TextCat
-ok_languages            all
-endif # Mail::SpamAssassin::Plugin::TextCat
-
-ifplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
-bayes_auto_learn_threshold_nonspam      0.1
-bayes_auto_learn_threshold_spam         12.0
-endif # Mail::SpamAssassin::Plugin::AutoLearnThreshold
-
-bayes_auto_learn                        1
-
-report_safe           1
-
+# Disable dcc/razor/pyzor by default
+ifplugin Mail::SpamAssassin::Plugin::DCC
+use_dcc 0
+endif
+ifplugin Mail::SpamAssassin::Plugin::Razor2
+use_razor2 0
+endif
+ifplugin Mail::SpamAssassin::Plugin::Pyzor
+use_pyzor 0
+endif
 
 header TEST_NOREALNAME  From =~ /^["\s]*\<?\S+\@\S+\>?\s*$/
 describe TEST_NOREALNAME From: does not include a real name
@@ -118,38 +79,6 @@ describe GTUBE           Generic Test fo
 score GTUBE              1000
 tflags GTUBE             userconf noautolearn
 
-body BAYES_99         eval:check_bayes('0.99', '1.00')
-tflags BAYES_99               learn
-describe BAYES_99     Bayes spam probability is 99 to 100%
-score BAYES_99 0 0 3.5 3.5
-
-ifplugin Mail::SpamAssassin::Plugin::WLBLEval
-#header USER_IN_WHITELIST	eval:check_from_in_whitelist()
-#tflags USER_IN_WHITELIST	userconf nice noautolearn
-#score  USER_IN_WHITELIST -100.000
-#header USER_IN_DEF_WHITELIST	eval:check_from_in_default_whitelist()
-#tflags USER_IN_DEF_WHITELIST	userconf nice noautolearn
-#score  USER_IN_DEF_WHITELIST -15.000
-#header USER_IN_WHITELIST_TO     eval:check_to_in_whitelist()
-#tflags USER_IN_WHITELIST_TO     userconf nice noautolearn
-#score  USER_IN_WHITELIST_TO -6.000
-#header USER_IN_BLACKLIST	eval:check_from_in_blacklist()
-#tflags USER_IN_BLACKLIST	userconf noautolearn
-#score  USER_IN_BLACKLIST 100.000
-#header USER_IN_BLACKLIST_TO     eval:check_to_in_blacklist()
-#tflags USER_IN_BLACKLIST_TO     userconf noautolearn
-#score  USER_IN_BLACKLIST_TO 10.000
-endif # Mail::SpamAssassin::Plugin::WLBLEval
-
-ifplugin Mail::SpamAssassin::Plugin::WhiteListSubject
-header SUBJECT_IN_WHITELIST	eval:check_subject_in_whitelist()
-tflags SUBJECT_IN_WHITELIST	userconf nice noautolearn
-header SUBJECT_IN_BLACKLIST	eval:check_subject_in_blacklist()
-tflags SUBJECT_IN_BLACKLIST	userconf noautolearn
-score  SUBJECT_IN_BLACKLIST 100
-score  SUBJECT_IN_WHITELIST -100
-endif # Mail::SpamAssassin::Plugin::WhiteListSubject
-
 header __HAS_MSGID               MESSAGEID =~ /\S/
 header __SANE_MSGID              MESSAGEID =~ /^<[^<>\\ \t\n\r\x0b\x80-\xff]+\@[^<>\\ \t\n\r\x0b\x80-\xff]+>\s*$/m
 header __MSGID_COMMENT           MESSAGEID =~ /\(.*\)/m
@@ -164,36 +93,6 @@ header INVALID_DATE              Date !~
 describe INVALID_DATE            Invalid Date: header (not RFC 2822)
 score INVALID_DATE               2.303 1.651 1.329 1.245
 
-ifplugin Mail::SpamAssassin::Plugin::SPF
-header SPF_PASS			eval:check_for_spf_pass()
-header SPF_NEUTRAL		eval:check_for_spf_neutral()
-header SPF_FAIL			eval:check_for_spf_fail()
-header SPF_SOFTFAIL		eval:check_for_spf_softfail()
-header SPF_HELO_PASS		eval:check_for_spf_helo_pass()
-header SPF_HELO_NEUTRAL		eval:check_for_spf_helo_neutral()
-header SPF_HELO_FAIL		eval:check_for_spf_helo_fail()
-header SPF_HELO_SOFTFAIL	eval:check_for_spf_helo_softfail()
-tflags SPF_PASS			nice userconf net
-tflags SPF_HELO_PASS		nice userconf net
-tflags SPF_NEUTRAL		net
-tflags SPF_FAIL		        net
-tflags SPF_SOFTFAIL		net
-tflags SPF_HELO_NEUTRAL	        net
-tflags SPF_HELO_FAIL		net
-tflags SPF_HELO_SOFTFAIL	net
-header USER_IN_SPF_WHITELIST	eval:check_for_spf_whitelist_from()
-tflags USER_IN_SPF_WHITELIST	userconf nice noautolearn
-header USER_IN_DEF_SPF_WL	eval:check_for_def_spf_whitelist_from()
-tflags USER_IN_DEF_SPF_WL	userconf nice noautolearn
-endif # Mail::SpamAssassin::Plugin::SPF
-
-ifplugin Mail::SpamAssassin::Plugin::AWL
-header AWL                   eval:check_from_in_auto_whitelist()
-describe AWL                 From: address is in the auto white-list
-tflags AWL                   userconf noautolearn
-priority AWL                    1000
-endif # Mail::SpamAssassin::Plugin::AWL
-
 redirector_pattern      /^http:\/\/chkpt\.zdnet\.com\/chkpt\/\w+\/(.*)$/i
 redirector_pattern      /^http:\/\/www(?:\d+)?\.nate\.com\/r\/\w+\/(.*)$/i
 redirector_pattern      /^http:\/\/.+\.gov\/(?:.*\/)?externalLink\.jhtml\?.*url=(.*?)(?:&.*)?$/i
@@ -202,23 +101,7 @@ redirector_pattern      /^http:\/\/(?:.*
 redirector_pattern      m'^http.*?/redirect\.php\?.*(?<=[?&])goto=(.*?)(?:$|[&\#])'i
 redirector_pattern      m'^https?:/*(?:[^/]+\.)?emf\d\.com/r\.cfm.*?&r=(.*)'i
 
-ifplugin Mail::SpamAssassin::Plugin::DCC
-full DCC_CHECK          eval:check_dcc()
-describe DCC_CHECK      Detected as bulk mail by DCC (dcc-servers.net)
-tflags DCC_CHECK        net
-reuse DCC_CHECK
-endif
-
 ifplugin Mail::SpamAssassin::Plugin::DKIM
-full   DKIM_SIGNED           eval:check_dkim_signed()
-full   DKIM_VALID            eval:check_dkim_valid()
-full   DKIM_VALID_AU         eval:check_dkim_valid_author_sig()
-header DKIM_ADSP_NXDOMAIN    eval:check_dkim_adsp('N')
-header DKIM_ADSP_DISCARD     eval:check_dkim_adsp('D')
-header DKIM_ADSP_ALL         eval:check_dkim_adsp('A')
-header DKIM_ADSP_CUSTOM_LOW  eval:check_dkim_adsp('1')
-header DKIM_ADSP_CUSTOM_MED  eval:check_dkim_adsp('2')
-header DKIM_ADSP_CUSTOM_HIGH eval:check_dkim_adsp('3')
 adsp_override sa-test-nxd.spamassassin.org  nxdomain
 adsp_override sa-test-unk.spamassassin.org  unknown
 adsp_override sa-test-all.spamassassin.org  all
@@ -226,17 +109,3 @@ adsp_override sa-test-dis.spamassassin.o
 adsp_override sa-test-di2.spamassassin.org
 endif
 
-ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
-header SHORTCIRCUIT             eval:check_shortcircuit()
-describe SHORTCIRCUIT           Not all rules were run, due to a shortcircuited rule
-tflags SHORTCIRCUIT             userconf noautolearn
-endif
-
-
-ifplugin Mail::SpamAssassin::Plugin::Razor2
-
-full RAZOR2_CHECK	eval:check_razor2()
-describe RAZOR2_CHECK	Listed in Razor2 (http://razor.sf.net/)
-tflags RAZOR2_CHECK	net
-
-endif