selftest.py: Only run teardown_all when actually relevant.
[samba.git] / selftest / selftest.py
index 5a1092833e5885283618db5356d2bf41f61d5918..1b2044134c8372b2ea6ff261504da80fba02da83 100755 (executable)
@@ -23,10 +23,8 @@ import iso8601
 import os
 import sys
 import signal
-import shutil
 import subprocess
 import subunit
-import tempfile
 import traceback
 import warnings
 
@@ -39,6 +37,13 @@ from selftest import (
     subunithelper,
     testlist,
     )
+from selftest.client import write_clientconf
+from selftest.run import (
+    expand_environment_strings,
+    expand_command_list,
+    expand_command_run,
+    exported_envvars_str,
+    )
 from selftest.target import (
     EnvironmentManager,
     NoneTarget,
@@ -60,7 +65,6 @@ def read_includes(fn):
 parser = optparse.OptionParser("TEST-REGEXES")
 parser.add_option("--target", type="choice", choices=["samba", "samba3", "none"], default="samba", help="Samba version to target")
 parser.add_option("--quick", help="run quick overall test", action="store_true", default=False)
-parser.add_option("--verbose", help="be verbose", action="store_true", default=False)
 parser.add_option("--list", help="list available tests", action="store_true", default=False)
 parser.add_option("--socket-wrapper", help="enable socket wrapper", action="store_true", default=False)
 parser.add_option("--socket-wrapper-pcap", help="save traffic to pcap directories", type="str")
@@ -119,15 +123,6 @@ def cleanup_pcap(pcap_file, exit_code):
     os.unlink(pcap_file)
 
 
-# expand strings from %ENV
-def expand_environment_strings(s):
-    # we use a reverse sort so we do the longer ones first
-    for k in sorted(os.environ.keys(), reverse=True):
-        v = os.environ[k]
-        s = s.replace("$%s" % k, v)
-    return s
-
-
 def run_testsuite(envname, name, cmd):
     """Run a single testsuite.
 
@@ -157,7 +152,7 @@ def run_testsuite(envname, name, cmd):
         sys.stdout.write("envlog: %s\n" % envlog)
 
     sys.stdout.write("command: %s\n" % cmd)
-    sys.stdout.write("expanded command: %s\n" % expand_environment_strings(cmd))
+    sys.stdout.write("expanded command: %s\n" % expand_environment_strings(cmd, os.environ))
 
     if exitcode == 0:
         subunit_ops.end_testsuite(name, "success")
@@ -329,65 +324,6 @@ clientdir = os.path.join(prefix_abs, "client")
 conffile = os.path.join(clientdir, "client.conf")
 os.environ["SMB_CONF_PATH"] = conffile
 
-def write_clientconf(conffile, clientdir, vars):
-    if not os.path.isdir(clientdir):
-        os.mkdir(clientdir, 0777)
-
-    for n in ["private", "lockdir", "statedir", "cachedir"]:
-        p = os.path.join(clientdir, n)
-        if os.path.isdir(p):
-            shutil.rmtree(p)
-        os.mkdir(p, 0777)
-
-    # this is ugly, but the ncalrpcdir needs exactly 0755
-    # otherwise tests fail.
-    mask = os.umask(0022)
-
-    for n in ["ncalrpcdir", "ncalrpcdir/np"]:
-        p = os.path.join(clientdir, n)
-        if os.path.isdir(p):
-            shutil.rmtree(p)
-        os.mkdir(p, 0777)
-    os.umask(mask)
-
-    settings = {
-        "netbios name": "client",
-        "private dir": os.path.join(clientdir, "private"),
-        "lock dir": os.path.join(clientdir, "lockdir"),
-        "state directory": os.path.join(clientdir, "statedir"),
-        "cache directory": os.path.join(clientdir, "cachedir"),
-        "ncalrpc dir": os.path.join(clientdir, "ncalrpcdir"),
-        "name resolve order": "file bcast",
-        "panic action": os.path.join(os.path.dirname(__file__), "gdb_backtrace \%d"),
-        "max xmit": "32K",
-        "notify:inotify": "false",
-        "ldb:nosync": "true",
-        "system:anonymous": "true",
-        "client lanman auth": "Yes",
-        "log level": "1",
-        "torture:basedir": clientdir,
-        # We don't want to pass our self-tests if the PAC code is wrong
-        "gensec:require_pac": "true",
-        "resolv:host file": os.path.join(prefix_abs, "dns_host_file"),
-        # We don't want to run 'speed' tests for very long
-        "torture:timelimit": "1",
-        }
-
-    if "DOMAIN" in vars:
-        settings["workgroup"] = vars["DOMAIN"]
-    if "REALM" in vars:
-        settings["realm"] = vars["REALM"]
-    if opts.socket_wrapper:
-        settings["interfaces"] = interfaces
-
-    f = open(conffile, 'w')
-    try:
-        f.write("[global]\n")
-        for item in settings.iteritems():
-            f.write("\t%s = %s\n" % item)
-    finally:
-        f.close()
-
 todo = []
 
 if not opts.testlist:
@@ -401,10 +337,6 @@ if opts.socket_wrapper:
     os.environ["SELFTEST_INTERFACES"] = interfaces
 else:
     os.environ["SELFTEST_INTERFACES"] = ""
-if opts.verbose:
-    os.environ["SELFTEST_VERBOSE"] = "1"
-else:
-    os.environ["SELFTEST_VERBOSE"] = ""
 if opts.quick:
     os.environ["SELFTEST_QUICK"] = "1"
 else:
@@ -412,31 +344,22 @@ else:
 os.environ["SELFTEST_MAXTIME"] = str(torture_maxtime)
 
 
-def open_file_or_pipe(path, mode):
-    if path.endswith("|"):
-        return os.popen(path[:-1], mode)
-    return open(path, mode)
-
 available = []
 for fn in opts.testlist:
-    inf = open_file_or_pipe(fn, 'r')
-    try:
-        for testsuite in testlist.read_testlist(inf, sys.stdout):
-            if not testlist.should_run_test(tests, testsuite):
-                continue
-            name = testsuite[0]
-            if includes is not None and testlist.find_in_list(includes, name) is not None:
-                continue
-            available.append(testsuite)
-    finally:
-        inf.close()
+    for testsuite in testlist.read_testlist_file(fn):
+        if not testlist.should_run_test(tests, testsuite):
+            continue
+        name = testsuite[0]
+        if (includes is not None and
+            testlist.find_in_list(includes, name) is not None):
+            continue
+        available.append(testsuite)
 
 if opts.load_list:
     restricted_mgr = testlist.RestrictedTestManager.from_path(opts.load_list)
 else:
     restricted_mgr = None
 
-
 for testsuite in available:
     name = testsuite[0]
     skipreason = skip(name)
@@ -515,17 +438,6 @@ exported_envvars = [
     "LOCAL_PATH"
 ]
 
-def exported_envvars_str(testenv_vars):
-    out = ""
-
-    for n in exported_envvars:
-        if not n in testenv_vars:
-            continue
-        out += "%s=%s\n" % (n, testenv_vars[n])
-
-    return out
-
-
 def switch_env(name, prefix):
     if ":" in name:
         (envname, option) = name.split(":", 1)
@@ -569,7 +481,7 @@ if opts.testenv:
     os.environ["PIDDIR"] = testenv_vars["PIDDIR"]
     os.environ["ENVNAME"] = testenv_name
 
-    envvarstr = exported_envvars_str(testenv_vars)
+    envvarstr = exported_envvars_str(testenv_vars, exported_envvars)
 
     term = os.environ.get("TERMINAL", "xterm -e")
     cmd = """'echo -e "
@@ -590,12 +502,11 @@ $envvarstr
     env_manager.teardown_env(testenv_name)
 elif opts.list:
     for (name, envname, cmd, supports_loadfile, supports_idlist, subtests) in todo:
-        if not "$LISTOPT" in cmd:
+        cmd = expand_command_list(cmd)
+        if cmd is None:
             warnings.warn("Unable to list tests in %s" % name)
             continue
 
-        cmd = cmd.replace("$LISTOPT", "--list")
-
         exitcode = subprocess.call(cmd, shell=True)
 
         if exitcode != 0:
@@ -617,32 +528,20 @@ else:
                 "unable to set up environment %s: %s" % (envname, e))
             continue
 
-        # Generate a file with the individual tests to run, if the
-        # test runner for this test suite supports it.
-        if subtests is not None:
-            if supports_loadfile:
-                (fd, listid_file) = tempfile.mkstemp()
-                # FIXME: Remove tempfile afterwards
-                f = os.fdopen(fd)
-                try:
-                    for test in subtests:
-                        f.write(test+"\n")
-                finally:
-                    f.close()
-                cmd = cmd.replace("$LOADLIST", "--load-list=%s" % listid_file)
-            elif supports_idlist:
-                cmd += " ".join(subtests)
+        cmd, tmpf = expand_command_run(cmd, supports_loadfile, supports_idlist,
+            subtests)
 
         run_testsuite(envname, name, cmd)
 
+        if tmpf is not None:
+            os.remove(tmpf)
+
         if opts.resetup_environment:
             env_manager.teardown_env(envname)
+    env_manager.teardown_all()
 
 sys.stdout.write("\n")
 
-if not opts.list:
-    env_manager.teardown_all()
-
 # if there were any valgrind failures, show them
 for fn in os.listdir(prefix):
     if fn.startswith("valgrind.log"):