Testsuite: prepare shadow (vpath) builds
[users/jgh/exim.git] / test / README
index e544857889535c0c54a6f5e6bd793742263d4e9e..1a300663bfa2e2ca2314d3ab62dd46439d21d022 100644 (file)
@@ -3,8 +3,8 @@ EXPORTABLE EXIM TEST SUITE
 
 This document last updated for:
 
-Test Suite Version: 4.67
-Date: 20 February 2007
+Test Suite Version: 4.87
+Date: 30 January 2016
 
 
 BACKGROUND
@@ -73,12 +73,15 @@ In order to run this test suite, the following requirements must be met:
 
       Defaults:exim-build     timestamp_timeout=480,!tty_tickets
 
-(3) The login under which you run the tests must be in the exim group so that
-    it has access to logs, spool files, etc. The login should not be one of the
-    names "userx", "usery", "userz", or a few other simple ones such as "abcd"
-    and "xyz" and single letters that are used in the tests. The test suite
-    expects the login to have a gecos name; I think it will now run if the
-    gecos field is empty but there may be anomalies.
+(3) The login under which you run the tests must have the exim group as a
+    secondary so that it has access to logs, spool files, etc.  However, it
+    should have a different primary group (eg. "users" vs. "eximgroup"). The
+    login should not be one of the names "userx", "usery", "userz", or a few
+    other simple ones such as "abcd" and "xyz" and single letters that are used
+    in the tests. The test suite expects the login to have a gecos name; I think
+    it will now run if the gecos field is empty but there may be anomalies.
+    The login must not contain a dash or an equal sign. (Otherwise some tests
+    about local_from_{suffix,prefix} will fail.)
 
 (4) The directory into which you unpack the test suite must be accessible by
     the Exim user, so that code running as exim can access the files therein.
@@ -112,14 +115,18 @@ In order to run this test suite, the following requirements must be met:
     is also an IPv6 address, additional tests are run when the Exim binary
     contains IPv6 support. There are checks in the scripts for a running IPv4
     interface; when one is not found, some tests are skipped (with a warning
-    message).
+    message).  The local net may not be in 10.0/8 as that is used by the suite.
 
 (9) Exim must be built with TRUSTED_CONFIG_LIST support, so that the test
     configs can be placed into it.  A suitable file location is .../exim/test/trusted_configs
-    DISABLE_D_OPTION must not be used. If ALT_CONFIG_PREFIX is used, it
+    with content .../exim/test/test-config [fill out the ... to make full
+    paths].  This file should be owner/group matching CONFIGURE_OWNER/GROUP,
+    or root/root, and it has to be accessible for the login, under which
+    you run the tests.  The config files in .../exim/test/confs/ should be
+    owner/group the same.  DISABLE_D_OPTION must not be used. If ALT_CONFIG_PREFIX is used, it
     must contain the directory of the test-suite.  WHITELIST_D_MACROS should contain:
-    
-     DIR:EXIM_PATH:AA:ACL:ACLRCPT:ACL_MAIL:ACL_PREDATA:ACL_RCPT:AFFIX:ALLOW:ARG1:ARG2:AUTHF:AUTHS:AUTH_ID_DOMAIN:BAD:BANNER:BB:BR:BRB:CERT:COM:COMMAND_USER:CONNECTCOND:CONTROL:CREQCIP:CREQMAC:CRL:CSS:D6:DATA:DCF:DDF:DEFAULTDWC:DELAY:DETAILS:DRATELIMIT:DYNAMIC_OPTION:ELI:ERROR_DETAILS:ERT:FAKE:FALLBACK:FILTER:FILTER_PREPEND_HOME:FORBID:FORBID_SMTP_CODE:FUSER:HAI:HAP:HARDLIMIT:HEADER_LINE_MAXSIZE:HEADER_MAXSIZE:HELO_MSG:HL:HOSTS:HOSTS_AVOID_TLS:HOSTS_MAX_TRY:HVH:IFACE:IGNORE_QUOTA:INC:INSERT:IP1:IP2:LAST:LDAPSERVERS:LENCHECK:LIMIT:LIST:LOG_SELECTOR:LS:MAXNM:MESSAGE_LOGS:MSIZE:NOTDAEMON:ONCE:ONLY:OPT:OPTION:ORDER:PAH:PEX:PORT:PTBC:QDG:QOLL:QUOTA:QUOTA_FILECOUNT:QWM:RCPT_MSG:REMEMBER:REQUIRE:RETRY:RETRY1:RETRY2:RETURN:RETURN_ERROR_DETAILS:REWRITE:ROUTE_DATA:RRATELIMIT:RT:S:SELECTOR:SELF:SERVER:SERVERS:SREQCIP:SREQMAC:SRV:STD:STRICT:SUB:SUBMISSION_OPTIONS:TIMEOUTDEFER:TIMES:TRUSTED:TRYCLEAR:UL:USE_SENDER:UTF8:VALUE:WMF:X:Y
+
+     DIR:EXIM_PATH:AA:ACL:ACLRCPT:ACL_MAIL:ACL_PREDATA:ACL_RCPT:AFFIX:ALLOW:ARG1:ARG2:AUTHF:AUTHS:AUTH_ID_DOMAIN:BAD:BANNER:BB:BR:BRB:CERT:COM:COMMAND_USER:CONNECTCOND:CONTROL:CREQCIP:CREQMAC:CRL:CSS:D6:DATA:DCF:DDF:DEFAULTDWC:DELAY:DETAILS:DRATELIMIT:DYNAMIC_OPTION:ELI:ERROR_DETAILS:ERT:FAKE:FALLBACK:FILTER:FILTER_PREPEND_HOME:FORBID:FORBID_SMTP_CODE:FUSER:HAI:HAP:HARDLIMIT:HEADER_LINE_MAXSIZE:HEADER_MAXSIZE:HELO_MSG:HL:HOSTS:HOSTS_AVOID_TLS:HOSTS_MAX_TRY:HVH:IFACE:IGNORE_QUOTA:INC:INSERT:IP1:IP2:LAST:LDAPSERVERS:LENCHECK:LIMIT:LIST:LOG_SELECTOR:MAXNM:MESSAGE_LOGS:MSIZE:NOTDAEMON:ONCE:ONLY:OPT:OPTION:ORDER:PAH:PEX:PORT:PTBC:QDG:QOLL:QUOTA:QUOTA_FILECOUNT:QWM:RCPT_MSG:REMEMBER:REQUIRE:RETRY:RETRY1:RETRY2:RETURN:RETURN_ERROR_DETAILS:REWRITE:ROUTE_DATA:RRATELIMIT:SELECTOR:SELF:SERVER:SERVERS:SREQCIP:SREQMAC:SRV:STRICT:SUB:SUBMISSION_OPTIONS:TIMEOUTDEFER:TIMES:TRUSTED:TRYCLEAR:UL:USE_SENDER:UTF8:VALUE:WMF
 
 (10) Exim must *not* be built with USE_READLINE, as the test-suite's automation
      assumes the simpler I/O model.
@@ -208,10 +215,12 @@ THE RUNTEST SCRIPT
 ------------------
 
 If you do not supply any arguments to ./runtest, it searches for an Exim
-source tree at the same level as the test suite directory. It then looks for an
-Exim binary in a "build" directory of that source tree. If there are several
-Exim source trees, it chooses the latest version of Exim. Consider the
-following example:
+source tree at the same level as the test suite directory. A source tree
+is a source tree, if it contains a build-* directory.
+
+It then looks for an Exim binary in a "build" directory of that source
+tree. If there are several Exim source trees, it chooses the latest
+version of Exim. Consider the following example:
 
   $ ls -F /source/exim
   exim-4.60/  exim-4.62/  exim-testsuite-x.xx/
@@ -255,6 +264,21 @@ There are some options for the ./runtest script itself:
             (If it turns out that most people prefer to use diff, I'll change
             the default.)
 
+  -FLAVOR <flavor>
+  -FLAVOUR <flavour>
+            This allows "overrides" for the test results. It's intended
+            use is to deal with distro specific differences in the test
+            output. The default flavour is "FOO" if autodetection fails.
+            (Autodection is possible for known flavours only. Known
+            flavours are computed after file name extensions in stdout/*
+            and stderr/*.)
+
+            If during the test run differences between the current and
+            the expected output are found and no flavour file exists already,
+            you may update the "common" expected output or you may create a
+            flavour file. If  a flavour file already exists, any updates will go
+            into that flavour file!
+
   -KEEP     Normally, after a successful run, the test output files are
             deleted. This option prevents this. It is useful when running a
             single test, in order to look at the actual output before it is
@@ -531,6 +555,7 @@ here:
   PORT_D         is replaced by a port number for normal daemon use
   PORT_N         is replaced by a port number that should never respond
   PORT_S         is replaced by a port number for normal bin/server use
+  PORT_DYNAMIC   is replaced by a port number allocated dynamically
   TESTNUM        is replaced by the current test number
   V4NET          is replaced by an IPv4 network number for testing
   V6NET          is replaced by an IPv6 network number for testing
@@ -541,6 +566,10 @@ testing purposes, and for testing Exim with -bh. The only requirement is that
 they are networks that can never be used for an IP address of a real host. I've
 chosen two multicast networks for the moment.
 
+PORT_DYNAMIC is allocated by hunting for a free port (starting at port
+1024) a listener can bind to. This is done by runtest, for simulating
+inetd operations.
+
 If the host has no IPv6 address, "<no IPv6 address found>" is substituted but
 that does not matter because no IPv6 tests will be run. A similar substitution
 is made if there is no IPv4 address, and again, tests that actually require a
@@ -822,6 +851,12 @@ terminated by four asterisks. Even if no data is required for the particular
 usage, the asterisks must be given.
 
 
+  background
+
+This command takes one script line and runs it in the background,
+in parallel with following commands.  For external daemons, eg. redis-server.
+
+
   catwrite <file name> [nxm[=start-of-line-text]]*
 
 This command operates like the "write" command, which is described below,
@@ -882,6 +917,11 @@ example:
 Finally, "exim" can be preceded by "sudo", to run Exim as root. If more than
 one of these prefixes is present, they must be in the above order.
 
+If the options include "-DSERVER" but not "-DNOTDAEMON", the script waits for
+Exim to start but then continues without waiting for it to terminate. Typically
+this will be for a daemon-mode "-bd" operation.  The daemon should be later
+terminated using "killdaemon".
+
 
   exim_exim [<options>] [<arguments>]
 
@@ -898,7 +938,9 @@ input, details of which are given below. A number of options are implemented:
   -d       causes the server to output debugging information
 
   -t <sec> sets a timeout (default 5) for when the server is
-           awaiting an incoming connection
+           awaiting an incoming connection. If negative, the
+          absolute value is used and a timeout results in a
+          nonfailure exit code
 
   -noipv4  causes the server not to set up an IPv4 socket
 
@@ -988,7 +1030,7 @@ Lines in client scripts are of two kinds:
 Here is a simple example:
 
   client 127.0.0.1 PORT_D
-  ??? 250
+  ??? 220
   EHLO xxx
   ??? 250-
   ??? 250
@@ -1021,7 +1063,10 @@ are of the following kinds:
     (d) If the line starts with ">*eof", nothing is sent and the connection
           is closed.
 
-    The data that is sent starts after the initial '>' sequence.
+    The data that is sent starts after the initial '>' sequence.  Within
+    each line the sequence '\x' followed by two hex digits can be used
+    to specify an arbitrary byte value.  The sequence '\\' specifies a
+    single backslash.
 
 (2) A line that starts with "*sleep" specifies a number of seconds to wait
     before proceeding.
@@ -1035,7 +1080,10 @@ are of the following kinds:
 (5) Otherwise, the line defines the start of an input line that the client
     is expected to send. To allow for lines that start with digits, the line
     may start with '<', which is not taken as part of the input data. If the
-    input does not match, the server bombs out with an error message.
+    lines starts with '<<' then only the characters are expected; no return-
+    linefeed terminator. If the input does not match, the server bombs out
+    with an error message.  Backslash-escape sequences may be used in the
+    line content as for output lines.
 
 Here is a simple example of server use in a test script:
 
@@ -1118,8 +1166,15 @@ directory by applying the standard substitutions. The test suite also builds
 dynamic zone files for the name of the current host and its IP address(es). The
 idea is that there should not be any need to rely on an external DNS.
 
-The domain names that are handled directly by Exim, without being passed to
-fakens, are:
+The fakens program handles some names programmatically rather than using the
+fake zone files.  These are:
+
+  manyhome.test.ex  This name is used for testing hosts with ridiculously large
+                    numbers of IP addresses; 2048 IP addresses are generated
+                    and returned. Doing it this way saves having to make the
+                    interface to fakens handle more records that can fit in the
+                    data block. The addresses that are generated are in the
+                    10.250.0.0/16 network.
 
   test.again.dns    This always provokes a TRY_AGAIN response, for testing the
                     handling of temporary DNS error. If the full domain name
@@ -1128,23 +1183,12 @@ fakens, are:
   test.fail.dns     This always provokes a NO_RECOVERY response, for testing
                     DNS server failures.
 
-This special handling could now be done in the fakens program, but while the
-old test suite is still being used it has to be done in Exim itself, so for the
-moment it remains there.
-
 The use of gethostbyname() and its IPv6 friends is also subverted when Exim is
 running in the test harness. The test code handles a few special names
 directly; for all the others it uses DNS lookups, which are then handled as
 just described. Thus, the use of /etc/hosts is completely bypassed. The names
 that are specially handled are:
 
-  manyhome.test.ex  This name is used for testing hosts with ridiculously large
-                    numbers of IP addresses; 2048 IP addresses are generated
-                    and returned. Doing it this way saves having to make the
-                    interface to fakens handle more records that can fit in the
-                    data block. The addresses that are generated are in the
-                    10.250.0.0/16 network.
-
   localhost         Always returns 127.0.0.1 or ::1, for IPv4 and IPv6 lookups,
                     respectively.