[988] | 1 | #!/usr/bin/env python
|
---|
| 2 | # vim: expandtab ft=python
|
---|
| 3 |
|
---|
| 4 | # selftest main code.
|
---|
| 5 |
|
---|
| 6 | import Scripting, os, Options, Utils, Environment, optparse, sys
|
---|
| 7 | from samba_utils import *
|
---|
| 8 | from samba_autoconf import *
|
---|
| 9 | import types
|
---|
| 10 |
|
---|
| 11 | DEFAULT_SELFTEST_PREFIX="./st"
|
---|
| 12 |
|
---|
| 13 | def set_options(opt):
|
---|
| 14 |
|
---|
| 15 | opt.add_option('--enable-selftest',
|
---|
| 16 | help=("enable options necessary for selftest (default=no)"),
|
---|
| 17 | action="store_true", dest='enable_selftest', default=False)
|
---|
| 18 | opt.add_option('--enable-coverage',
|
---|
| 19 | help=("enable options necessary for code coverage "
|
---|
| 20 | "reporting on selftest (default=no)"),
|
---|
| 21 | action="store_true", dest='enable_coverage', default=False)
|
---|
| 22 | opt.add_option('--with-selftest-prefix',
|
---|
| 23 | help=("specify location of selftest directory "
|
---|
| 24 | "(default=%s)" % DEFAULT_SELFTEST_PREFIX),
|
---|
| 25 | action="store", dest='SELFTEST_PREFIX', default=DEFAULT_SELFTEST_PREFIX)
|
---|
| 26 |
|
---|
| 27 | opt.ADD_COMMAND('test', cmd_test)
|
---|
| 28 | opt.ADD_COMMAND('testonly', cmd_testonly)
|
---|
| 29 |
|
---|
| 30 | gr = opt.add_option_group('test options')
|
---|
| 31 |
|
---|
| 32 | gr.add_option('--load-list',
|
---|
| 33 | help=("Load a test id list from a text file"),
|
---|
| 34 | action="store", dest='LOAD_LIST', default=None)
|
---|
| 35 | gr.add_option('--list',
|
---|
| 36 | help=("List available tests"),
|
---|
| 37 | action="store_true", dest='LIST', default=False)
|
---|
| 38 | gr.add_option('--tests',
|
---|
| 39 | help=("wildcard pattern of tests to run"),
|
---|
| 40 | action="store", dest='TESTS', default='')
|
---|
| 41 | gr.add_option('--filtered-subunit',
|
---|
| 42 | help=("output (xfail) filtered subunit"),
|
---|
| 43 | action="store_true", dest='FILTERED_SUBUNIT', default=False)
|
---|
| 44 | gr.add_option('--quick',
|
---|
| 45 | help=("enable only quick tests"),
|
---|
| 46 | action="store_true", dest='QUICKTEST', default=False)
|
---|
| 47 | gr.add_option('--slow',
|
---|
| 48 | help=("enable the really slow tests"),
|
---|
| 49 | action="store_true", dest='SLOWTEST', default=False)
|
---|
| 50 | gr.add_option('--nb-slowest',
|
---|
| 51 | help=("Show the n slowest tests (default=10)"),
|
---|
| 52 | type=int, default=10, dest='NB_SLOWEST')
|
---|
| 53 | gr.add_option('--testenv',
|
---|
| 54 | help=("start a terminal with the test environment setup"),
|
---|
| 55 | action="store_true", dest='TESTENV', default=False)
|
---|
| 56 | gr.add_option('--valgrind',
|
---|
| 57 | help=("use valgrind on client programs in the tests"),
|
---|
| 58 | action="store_true", dest='VALGRIND', default=False)
|
---|
| 59 | gr.add_option('--valgrind-log',
|
---|
| 60 | help=("where to put the valgrind log"),
|
---|
| 61 | action="store", dest='VALGRINDLOG', default=None)
|
---|
| 62 | gr.add_option('--valgrind-server',
|
---|
| 63 | help=("use valgrind on the server in the tests (opens an xterm)"),
|
---|
| 64 | action="store_true", dest='VALGRIND_SERVER', default=False)
|
---|
| 65 | gr.add_option('--screen',
|
---|
| 66 | help=("run the samba servers in screen sessions"),
|
---|
| 67 | action="store_true", dest='SCREEN', default=False)
|
---|
| 68 | gr.add_option('--gdbtest',
|
---|
| 69 | help=("run the servers within a gdb window"),
|
---|
| 70 | action="store_true", dest='GDBTEST', default=False)
|
---|
| 71 | gr.add_option('--fail-immediately',
|
---|
| 72 | help=("stop tests on first failure"),
|
---|
| 73 | action="store_true", dest='FAIL_IMMEDIATELY', default=False)
|
---|
| 74 | gr.add_option('--socket-wrapper-pcap',
|
---|
| 75 | help=("create a pcap file for each failing test"),
|
---|
| 76 | action="store_true", dest='SOCKET_WRAPPER_PCAP', default=False)
|
---|
| 77 | gr.add_option('--socket-wrapper-keep-pcap',
|
---|
| 78 | help=("create a pcap file for all individual test"),
|
---|
| 79 | action="store_true", dest='SOCKET_WRAPPER_KEEP_PCAP', default=False)
|
---|
| 80 | gr.add_option('--random-order', dest='RANDOM_ORDER', default=False,
|
---|
| 81 | action="store_true", help="Run testsuites in random order")
|
---|
| 82 |
|
---|
| 83 | def configure(conf):
|
---|
| 84 | conf.env.SELFTEST_PREFIX = Options.options.SELFTEST_PREFIX
|
---|
| 85 | conf.env.enable_coverage = Options.options.enable_coverage
|
---|
| 86 | if conf.env.enable_coverage:
|
---|
| 87 | conf.ADD_LDFLAGS('-lgcov', testflags=True)
|
---|
| 88 | conf.ADD_CFLAGS('--coverage')
|
---|
| 89 |
|
---|
| 90 | if Options.options.enable_selftest or Options.options.developer:
|
---|
| 91 | conf.DEFINE('ENABLE_SELFTEST', 1)
|
---|
| 92 |
|
---|
| 93 |
|
---|
| 94 | def cmd_testonly(opt):
|
---|
| 95 | '''run tests without doing a build first'''
|
---|
| 96 | env = LOAD_ENVIRONMENT()
|
---|
| 97 | opt.env = env
|
---|
| 98 |
|
---|
| 99 | if Options.options.SELFTEST_PREFIX != DEFAULT_SELFTEST_PREFIX:
|
---|
| 100 | env.SELFTEST_PREFIX = Options.options.SELFTEST_PREFIX
|
---|
| 101 |
|
---|
| 102 | if (not CONFIG_SET(opt, 'NSS_WRAPPER') or
|
---|
| 103 | not CONFIG_SET(opt, 'UID_WRAPPER') or
|
---|
| 104 | not CONFIG_SET(opt, 'SOCKET_WRAPPER')):
|
---|
| 105 | print("ERROR: You must use --enable-selftest to enable selftest")
|
---|
| 106 | sys.exit(1)
|
---|
| 107 |
|
---|
| 108 | os.environ['SAMBA_SELFTEST'] = '1'
|
---|
| 109 |
|
---|
| 110 | env.TESTS = Options.options.TESTS
|
---|
| 111 |
|
---|
| 112 | env.SUBUNIT_FORMATTER = os.getenv('SUBUNIT_FORMATTER')
|
---|
| 113 | if not env.SUBUNIT_FORMATTER:
|
---|
| 114 | env.SUBUNIT_FORMATTER = '${PYTHON} -u ${srcdir}/selftest/format-subunit --prefix=${SELFTEST_PREFIX} --immediate'
|
---|
| 115 | env.FILTER_XFAIL = '${PYTHON} -u ${srcdir}/selftest/filter-subunit --expected-failures=${srcdir}/selftest/knownfail --flapping=${srcdir}/selftest/flapping'
|
---|
| 116 |
|
---|
| 117 | if Options.options.FAIL_IMMEDIATELY:
|
---|
| 118 | env.FILTER_XFAIL += ' --fail-immediately'
|
---|
| 119 |
|
---|
| 120 | env.FORMAT_TEST_OUTPUT = '${SUBUNIT_FORMATTER}'
|
---|
| 121 |
|
---|
| 122 | # clean any previous temporary files
|
---|
| 123 | os.system("rm -rf %s/tmp" % env.SELFTEST_PREFIX);
|
---|
| 124 |
|
---|
| 125 | # put all command line options in the environment as TESTENV_*=*
|
---|
| 126 | for o in dir(Options.options):
|
---|
| 127 | if o[0:1] != '_':
|
---|
| 128 | val = getattr(Options.options, o, '')
|
---|
| 129 | if not issubclass(type(val), types.FunctionType) \
|
---|
| 130 | and not issubclass(type(val), types.MethodType):
|
---|
| 131 | os.environ['TESTENV_%s' % o.upper()] = str(getattr(Options.options, o, ''))
|
---|
| 132 |
|
---|
| 133 | env.OPTIONS = ''
|
---|
| 134 | if not Options.options.SLOWTEST:
|
---|
| 135 | env.OPTIONS += ' --exclude=${srcdir}/selftest/slow'
|
---|
| 136 | if Options.options.QUICKTEST:
|
---|
| 137 | env.OPTIONS += ' --quick --include=${srcdir}/selftest/quick'
|
---|
| 138 | if Options.options.LOAD_LIST:
|
---|
| 139 | env.OPTIONS += ' --load-list=%s' % Options.options.LOAD_LIST
|
---|
| 140 | if Options.options.TESTENV:
|
---|
| 141 | env.OPTIONS += ' --testenv'
|
---|
| 142 | if Options.options.SOCKET_WRAPPER_PCAP:
|
---|
| 143 | env.OPTIONS += ' --socket-wrapper-pcap'
|
---|
| 144 | if Options.options.SOCKET_WRAPPER_KEEP_PCAP:
|
---|
| 145 | env.OPTIONS += ' --socket-wrapper-keep-pcap'
|
---|
| 146 | if Options.options.RANDOM_ORDER:
|
---|
| 147 | env.OPTIONS += ' --random-order'
|
---|
| 148 | if os.environ.get('RUN_FROM_BUILD_FARM') is not None:
|
---|
| 149 | env.FILTER_OPTIONS = '${FILTER_XFAIL} --strip-passed-output'
|
---|
| 150 | else:
|
---|
| 151 | env.FILTER_OPTIONS = '${FILTER_XFAIL}'
|
---|
| 152 |
|
---|
| 153 | if Options.options.VALGRIND:
|
---|
| 154 | os.environ['VALGRIND'] = 'valgrind -q --num-callers=30'
|
---|
| 155 | if Options.options.VALGRINDLOG is not None:
|
---|
| 156 | os.environ['VALGRIND'] += ' --log-file=%s' % Options.options.VALGRINDLOG
|
---|
| 157 |
|
---|
| 158 | server_wrapper=''
|
---|
| 159 |
|
---|
| 160 | if Options.options.VALGRIND_SERVER:
|
---|
| 161 | server_wrapper = '${srcdir}/selftest/valgrind_run _DUMMY=X'
|
---|
| 162 | elif Options.options.GDBTEST:
|
---|
| 163 | server_wrapper = '${srcdir}/selftest/gdb_run _DUMMY=X'
|
---|
| 164 |
|
---|
| 165 | if Options.options.SCREEN:
|
---|
| 166 | server_wrapper = '${srcdir}/selftest/in_screen %s' % server_wrapper
|
---|
| 167 | os.environ['TERMINAL'] = EXPAND_VARIABLES(opt, '${srcdir}/selftest/in_screen')
|
---|
| 168 | elif server_wrapper != '':
|
---|
| 169 | server_wrapper = 'xterm -n server -l -e %s' % server_wrapper
|
---|
| 170 |
|
---|
| 171 | if server_wrapper != '':
|
---|
| 172 | os.environ['SAMBA_VALGRIND'] = EXPAND_VARIABLES(opt, server_wrapper)
|
---|
| 173 | os.environ['NMBD_VALGRIND'] = EXPAND_VARIABLES(opt, server_wrapper)
|
---|
| 174 | os.environ['WINBINDD_VALGRIND'] = EXPAND_VARIABLES(opt, server_wrapper)
|
---|
| 175 | os.environ['SMBD_VALGRIND'] = EXPAND_VARIABLES(opt, server_wrapper)
|
---|
| 176 |
|
---|
| 177 | # this is needed for systems without rpath, or with rpath disabled
|
---|
| 178 | ADD_LD_LIBRARY_PATH('bin/shared')
|
---|
| 179 | ADD_LD_LIBRARY_PATH('bin/shared/private')
|
---|
| 180 |
|
---|
| 181 | # if we are using a system version of ldb then we need to tell it to
|
---|
| 182 | # load modules from our modules path
|
---|
| 183 | if env.USING_SYSTEM_LDB:
|
---|
| 184 | os.environ['LDB_MODULES_PATH'] = os.path.abspath(os.path.join(env.cwd, 'bin/modules/ldb'))
|
---|
| 185 |
|
---|
| 186 | # tell build system where to find config.h
|
---|
| 187 | os.environ['CONFIG_H'] = 'bin/default/include/config.h'
|
---|
| 188 |
|
---|
| 189 | st_done = os.path.join(env.SELFTEST_PREFIX, 'st_done')
|
---|
| 190 | if os.path.exists(st_done):
|
---|
| 191 | os.unlink(st_done)
|
---|
| 192 |
|
---|
| 193 | if not os.path.isdir(env.SELFTEST_PREFIX):
|
---|
| 194 | os.makedirs(env.SELFTEST_PREFIX, int('755', 8))
|
---|
| 195 |
|
---|
| 196 | env.TESTLISTS = ('--testlist="${PYTHON} ${srcdir}/selftest/tests.py|" ' +
|
---|
| 197 | '--testlist="${PYTHON} ${srcdir}/source3/selftest/tests.py|" ' +
|
---|
| 198 | '--testlist="${PYTHON} ${srcdir}/source4/selftest/tests.py|"')
|
---|
| 199 |
|
---|
| 200 | if CONFIG_SET(opt, 'AD_DC_BUILD_IS_ENABLED'):
|
---|
| 201 | env.SELFTEST_TARGET = "samba"
|
---|
| 202 | else:
|
---|
| 203 | env.SELFTEST_TARGET = "samba3"
|
---|
| 204 |
|
---|
| 205 | env.OPTIONS += " --nss_wrapper_so_path=" + CONFIG_GET(opt, 'LIBNSS_WRAPPER_SO_PATH')
|
---|
| 206 | env.OPTIONS += " --resolv_wrapper_so_path=" + CONFIG_GET(opt, 'LIBRESOLV_WRAPPER_SO_PATH')
|
---|
| 207 | env.OPTIONS += " --socket_wrapper_so_path=" + CONFIG_GET(opt, 'LIBSOCKET_WRAPPER_SO_PATH')
|
---|
| 208 | env.OPTIONS += " --uid_wrapper_so_path=" + CONFIG_GET(opt, 'LIBUID_WRAPPER_SO_PATH')
|
---|
| 209 |
|
---|
| 210 | #if unversioned_sys_platform in ('freebsd', 'netbsd', 'openbsd', 'sunos'):
|
---|
| 211 | # env.OPTIONS += " --use-dns-faking"
|
---|
| 212 |
|
---|
| 213 | # FIXME REMOVE ME!
|
---|
| 214 | env.OPTIONS += " --use-dns-faking"
|
---|
| 215 |
|
---|
| 216 |
|
---|
| 217 | subunit_cache = None
|
---|
| 218 | # We use the full path rather than relative path to avoid problems on some platforms (ie. solaris 8).
|
---|
| 219 | env.CORE_COMMAND = '${PERL} ${srcdir}/selftest/selftest.pl --target=${SELFTEST_TARGET} --prefix=${SELFTEST_PREFIX} --srcdir=${srcdir} --exclude=${srcdir}/selftest/skip ${TESTLISTS} ${OPTIONS} ${TESTS}'
|
---|
| 220 | if Options.options.LIST:
|
---|
| 221 | cmd = '${CORE_COMMAND} --list'
|
---|
| 222 | else:
|
---|
| 223 | env.OPTIONS += ' --socket-wrapper'
|
---|
| 224 | cmd = '(${CORE_COMMAND} && touch ${SELFTEST_PREFIX}/st_done) | ${FILTER_OPTIONS}'
|
---|
| 225 | if (os.environ.get('RUN_FROM_BUILD_FARM') is None and
|
---|
| 226 | not Options.options.FILTERED_SUBUNIT):
|
---|
| 227 | subunit_cache = os.path.join(env.SELFTEST_PREFIX, "subunit")
|
---|
| 228 | cmd += ' | tee %s | ${FORMAT_TEST_OUTPUT}' % subunit_cache
|
---|
| 229 | else:
|
---|
| 230 | cmd += ' | ${FILTER_OPTIONS}'
|
---|
| 231 | runcmd = EXPAND_VARIABLES(opt, cmd)
|
---|
| 232 |
|
---|
| 233 | print("test: running %s" % runcmd)
|
---|
| 234 | ret = RUN_COMMAND(cmd, env=env)
|
---|
| 235 |
|
---|
| 236 | if (os.path.exists(".testrepository") and
|
---|
| 237 | not Options.options.LIST and
|
---|
| 238 | not Options.options.LOAD_LIST and
|
---|
| 239 | subunit_cache is not None):
|
---|
| 240 | testrcmd = 'testr load -q < %s > /dev/null' % subunit_cache
|
---|
| 241 | runcmd = EXPAND_VARIABLES(opt, testrcmd)
|
---|
| 242 | RUN_COMMAND(runcmd, env=env)
|
---|
| 243 |
|
---|
| 244 | if subunit_cache is not None:
|
---|
| 245 | nb = Options.options.NB_SLOWEST
|
---|
| 246 | cmd = "./script/show_testsuite_time %s %d" % (subunit_cache, nb)
|
---|
| 247 | runcmd = EXPAND_VARIABLES(opt, cmd)
|
---|
| 248 | RUN_COMMAND(runcmd, env=env)
|
---|
| 249 |
|
---|
| 250 | if ret != 0:
|
---|
| 251 | print("ERROR: test failed with exit code %d" % ret)
|
---|
| 252 | sys.exit(ret)
|
---|
| 253 |
|
---|
| 254 | if not Options.options.LIST and not os.path.exists(st_done):
|
---|
| 255 | print("ERROR: test command failed to complete")
|
---|
| 256 | sys.exit(1)
|
---|
| 257 |
|
---|
| 258 |
|
---|
| 259 | ########################################################################
|
---|
| 260 | # main test entry point
|
---|
| 261 | def cmd_test(opt):
|
---|
| 262 | '''Run the test suite (see test options below)'''
|
---|
| 263 |
|
---|
| 264 | # if running all tests, then force a symbol check
|
---|
| 265 | env = LOAD_ENVIRONMENT()
|
---|
| 266 | CHECK_MAKEFLAGS(env)
|
---|
| 267 | Scripting.commands.append('build')
|
---|
| 268 | Scripting.commands.append('testonly')
|
---|