File: runtests.py

package info (click to toggle)
gssproxy 0.9.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,472 kB
  • sloc: ansic: 19,391; python: 1,196; xml: 611; makefile: 458; sh: 200
file content (130 lines) | stat: -rwxr-xr-x 4,572 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/python3
# Copyright (C) 2014,2015,2016 - GSS-Proxy contributors; see COPYING for the license.

import argparse
import importlib
import signal
import subprocess
import sys
import traceback

import testlib
from testlib import *

def check_exec(name):
    env = {'PATH': '/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/mit/sbin'}
    ret = subprocess.call(["which", name], stdout=subprocess.DEVNULL, env=env)
    if ret != 0:
        print(f"Executable '{name}' not found in {env['PATH']}",
              file=sys.stderr)
        exit(1)

def parse_args():
    parser = argparse.ArgumentParser(description='GSS-Proxy Tests Environment')
    parser.add_argument('--path', default='%s/testdir' % os.getcwd(),
                        help="Directory in which tests are run")
    parser.add_argument('--debug-all', default=False, action="store_true",
                        help="Enable debugging for all test cases")
    parser.add_argument('--debug-gssproxy', default=False, action="store_true",
                        help="Enable debugging for gssproxy command")
    parser.add_argument('--debug-cmd', default="gdb --args",
                        help="Set the debugging command. Defaults to gdb " +
                              "--args")
    parser.add_argument('--debug-num', default=-1, type=int,
                        help="Specify the testcase number to debug")
    parser.add_argument('--timeout', default=30, type=int,
                        help="Specify test case timeout limit")
    parser.add_argument('--valgrind-cmd', default="valgrind " +
                        "--track-origins=yes",
                        help="Set the valgrind command. Defaults to " +
                        "valgrind --track-origins=yes")
    parser.add_argument('--force-valgrind', default=False, action="store_true",
                        help="Force valgrind to be run on all test cases")

    args = vars(parser.parse_args())
    testlib_process_args(args)

    return args

def runtests_main(testfiles):
    args = parse_args()

    for e in ["bash", "pkg-config", "zcat", "kinit", "krb5kdc", "kdb5_util",
             "kadmin.local", "kdb5_ldap_util", "slapd", "slapadd",
              "ldapmodify", "valgrind"]:
        if e == "valgrind" and not args['valgrind_cmd'].startswith('valgrind'):
            continue

        check_exec(e)

    testdir = args['path']
    if os.path.exists(testdir):
        shutil.rmtree(testdir)
    os.makedirs(testdir)

    processes = dict()

    errored = False

    try:
        wrapenv = setup_wrappers(testdir)
        write_ldap_krb5_config(testdir)

        ldapproc, ldapenv = setup_ldap(testdir, wrapenv)
        processes["LDAP(%d)" % ldapproc.pid] = ldapproc

        kdcproc, kdcenv = setup_kdc(testdir, wrapenv)
        processes['KDC(%d)' % kdcproc.pid] = kdcproc

        keysenv = setup_keys(testdir, kdcenv)

        gssapienv = setup_gssapi_env(testdir, kdcenv)

        if 'TERM' in os.environ:
            gssapienv['TERM'] = os.environ['TERM']

        gssproxyenv = keysenv
        gssproxyenv['KRB5_TRACE'] = os.path.join(testdir, 'gssproxy.trace')

        gproc, gpsocket = setup_gssproxy(testdir, gssproxyenv)
        processes['GSS-Proxy(%d)' % gproc.pid] = gproc
        gssapienv['GSSPROXY_SOCKET'] = gpsocket

        basicconf = {'svc_name': "host@%s" % WRAP_HOSTNAME,
                     'keytab': os.path.join(testdir, SVC_KTNAME)}
        basicconf["gpid"] = gproc.pid
        basicconf["keysenv"] = keysenv

        print("Tests to be run: " + ", ".join(testfiles))
        for f in testfiles:
            fmod = f[:-len(".py")]
            t = importlib.__import__(fmod)

            basicconf['prefix'] = str(testlib.cmd_index)
            basicconf['logpath'] = testdir
            r = t.run(testdir, gssapienv, basicconf)
            if r != 0:
                errored = True
    except Exception:
        traceback.print_exc()
        errored = True
    finally:
        for name in processes:
            print("Killing %s" % name)
            os.killpg(processes[name].pid, signal.SIGTERM)

        if errored:
            sys.exit(1)
        sys.exit(0)

if __name__ == "__main__":
    print("\n")
    print("To pass arguments to the test suite, use CHECKARGS:")
    print("    make check CHECKARGS='--debug-num=<num>'")
    print("A full set of available options can be seen with --help")
    print("\n")

    testfiles = [f for f in os.listdir(os.path.dirname(sys.argv[0])) \
                 if f.endswith(".py") and f.startswith("t_")]
    testfiles.sort()
    runtests_main(testfiles)