5
This will find all modules whose name is "test_*" in the test
6
directory, and run them. Various command line options provide
11
-v: verbose -- run tests in verbose mode with output to stdout
12
-q: quiet -- don't print anything except if a test fails
13
-g: generate -- write the output file for a test instead of comparing it
14
-x: exclude -- arguments are tests to *exclude*
15
-s: single -- run only a single test (see below)
16
-r: random -- randomize test execution order
17
-f: fromfile -- read names of tests to run from a file (see below)
18
-l: findleaks -- if GC is available detect tests that leak memory
19
-u: use -- specify which special resource intensive tests to run
20
-h: help -- print this text and exit
21
-t: threshold -- call gc.set_threshold(N)
22
-T: coverage -- turn on code coverage using the trace module
23
-D: coverdir -- Directory where coverage files are put
24
-N: nocoverdir -- Put coverage files alongside modules
25
-L: runleaks -- run the leaks(1) command just before exit
26
-R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
28
If non-option arguments are present, they are names for tests to run,
29
unless -x is given, in which case they are names for tests not to run.
30
If no test names are given, all tests are run.
32
-v is incompatible with -g and does not compare test output files.
34
-T turns on code coverage tracing with the trace module.
36
-D specifies the directory where coverage files are put.
38
-N Put coverage files alongside modules.
40
-s means to run only a single test and exit. This is useful when
41
doing memory analysis on the Python interpreter (which tend to consume
42
too many resources to run the full regression test non-stop). The
43
file /tmp/pynexttest is read to find the next test to run. If this
44
file is missing, the first test_*.py file in testdir or on the command
45
line is used. (actually tempfile.gettempdir() is used instead of
48
-f reads the names of tests from the file given as f's argument, one
49
or more test names per line. Whitespace is ignored. Blank lines and
50
lines beginning with '#' are ignored. This is especially useful for
51
whittling down failures involving interactions among tests.
53
-L causes the leaks(1) command to be run just before exit if it exists.
54
leaks(1) is available on Mac OS X and presumably on some other
55
FreeBSD-derived systems.
57
-R runs each test several times and examines sys.gettotalrefcount() to
58
see if the test appears to be leaking references. The argument should
59
be of the form stab:run:fname where 'stab' is the number of times the
60
test is run to let gettotalrefcount settle down, 'run' is the number
61
of times further it is run and 'fname' is the name of the file the
62
reports are written to. These parameters all have defaults (5, 4 and
63
"reflog.txt" respectively), so the minimal invocation is '-R ::'.
65
-u is used to specify which special resource intensive tests to run,
66
such as those requiring large file support or network connectivity.
67
The argument is a comma-separated list of words indicating the
68
resources to test. Currently only the following are defined:
70
all - Enable all special resources.
72
audio - Tests that use the audio device. (There are known
73
cases of broken audio drivers that can crash Python or
74
even the Linux kernel.)
76
curses - Tests that use curses and will modify the terminal's
77
state and output modes.
79
largefile - It is okay to run some test that may create huge
80
files. These tests can take a long time and may
81
consume >2GB of disk space temporarily.
83
network - It is okay to run tests that use external network
84
resource, e.g. testing SSL support for sockets.
86
bsddb - It is okay to run the bsddb testsuite, which takes
87
a long time to complete.
89
decimal - Test the decimal module against a large suite that
90
verifies compliance with standards.
92
compiler - Test the compiler package by compiling all the source
93
in the standard library and test suite. This takes
96
subprocess Run all tests for the subprocess module.
98
To enable all resources except one, use '-uall,-<resource>'. For
99
example, to run all the tests except for the bsddb tests, give the
100
option '-uall,-bsddb'.
112
# I see no other way to suppress these warnings;
113
# putting them in test_grammar.py has no effect:
114
warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
115
".*test.test_grammar$")
116
if sys.maxint > 0x7fffffff:
117
# Also suppress them in <string>, because for 64-bit platforms,
118
# that's where test_grammar.py hides them.
119
warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
122
# MacOSX (a.k.a. Darwin) has a default stack size that is too small
123
# for deeply recursive regular expressions. We see this as crashes in
124
# the Python test suite when running test_re.py and test_sre.py. The
125
# fix is to set the stack limit to 2048.
126
# This approach may also be useful for other Unixy platforms that
127
# suffer from small default stack limits.
128
if sys.platform == 'darwin':
134
soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
135
newsoft = min(hard, max(soft, 1024*2048))
136
resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
138
from test import test_support
140
RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
141
'decimal', 'compiler', 'subprocess')
144
def usage(code, msg=''):
150
def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
151
exclude=False, single=False, randomize=False, fromfile=None,
152
findleaks=False, use_resources=None, trace=False, coverdir='coverage',
153
runleaks=False, huntrleaks=False):
154
"""Execute a test suite.
156
This also parses command-line options and modifies its behavior
159
tests -- a list of strings containing test names (optional)
160
testdir -- the directory in which to look for tests (optional)
162
Users other than the Python test suite will certainly want to
163
specify testdir; if it's omitted, the directory containing the
164
Python test suite is searched for.
166
If the tests argument is omitted, the tests listed on the
167
command-line will be used. If that's empty, too, then all *.py
168
files beginning with test_ will be used.
170
The other default arguments (verbose, quiet, generate, exclude, single,
171
randomize, findleaks, use_resources, trace and coverdir) allow programmers
172
calling main() directly to set the values that would normally be set by
173
flags on the command line.
176
test_support.record_original_stdout(sys.stdout)
178
opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:',
179
['help', 'verbose', 'quiet', 'generate',
180
'exclude', 'single', 'random', 'fromfile',
181
'findleaks', 'use=', 'threshold=', 'trace',
182
'coverdir=', 'nocoverdir', 'runleaks',
185
except getopt.error, msg:
189
if use_resources is None:
192
if o in ('-h', '--help'):
194
elif o in ('-v', '--verbose'):
196
elif o in ('-q', '--quiet'):
199
elif o in ('-g', '--generate'):
201
elif o in ('-x', '--exclude'):
203
elif o in ('-s', '--single'):
205
elif o in ('-r', '--randomize'):
207
elif o in ('-f', '--fromfile'):
209
elif o in ('-l', '--findleaks'):
211
elif o in ('-L', '--runleaks'):
213
elif o in ('-t', '--threshold'):
215
gc.set_threshold(int(a))
216
elif o in ('-T', '--coverage'):
218
elif o in ('-D', '--coverdir'):
219
coverdir = os.path.join(os.getcwd(), a)
220
elif o in ('-N', '--nocoverdir'):
222
elif o in ('-R', '--huntrleaks'):
223
huntrleaks = a.split(':')
224
if len(huntrleaks) != 3:
226
usage(2, '-R takes three colon-separated arguments')
227
if len(huntrleaks[0]) == 0:
230
huntrleaks[0] = int(huntrleaks[0])
231
if len(huntrleaks[1]) == 0:
234
huntrleaks[1] = int(huntrleaks[1])
235
if len(huntrleaks[2]) == 0:
236
huntrleaks[2] = "reflog.txt"
237
elif o in ('-u', '--use'):
238
u = [x.lower() for x in a.split(',')]
241
use_resources[:] = RESOURCE_NAMES
247
if r not in RESOURCE_NAMES:
248
usage(1, 'Invalid -u/--use option: ' + a)
250
if r in use_resources:
251
use_resources.remove(r)
252
elif r not in use_resources:
253
use_resources.append(r)
254
if generate and verbose:
255
usage(2, "-g and -v don't go together!")
256
if single and fromfile:
257
usage(2, "-s and -f don't go together!")
262
resource_denieds = []
268
print 'No GC available, disabling findleaks.'
271
# Uncomment the line below to report garbage that is not
272
# freeable by reference counting alone. By default only
273
# garbage that is not collectable by the GC is reported.
274
#gc.set_debug(gc.DEBUG_SAVEALL)
278
from tempfile import gettempdir
279
filename = os.path.join(gettempdir(), 'pynexttest')
281
fp = open(filename, 'r')
282
next = fp.read().strip()
292
guts = line.split() # assuming no test has whitespace in its name
293
if guts and not guts[0].startswith('#'):
297
# Strip .py extensions.
299
args = map(removepy, args)
301
tests = map(removepy, tests)
303
stdtests = STDTESTS[:]
304
nottests = NOTTESTS[:]
311
tests = tests or args or findtests(testdir, stdtests, nottests)
315
random.shuffle(tests)
318
tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
319
trace=False, count=True)
320
test_support.verbose = verbose # Tell tests to be moderately quiet
321
test_support.use_resources = use_resources
322
save_modules = sys.modules.keys()
328
# If we're tracing code coverage, then we don't exit with status
329
# if on a false return value from main.
330
tracer.runctx('runtest(test, generate, verbose, quiet, testdir)',
331
globals=globals(), locals=vars())
333
ok = runtest(test, generate, verbose, quiet, testdir, huntrleaks)
341
resource_denieds.append(test)
345
print "Warning: test created", len(gc.garbage),
346
print "uncollectable object(s)."
347
# move the uncollectable objects somewhere so we don't see
349
found_garbage.extend(gc.garbage)
351
# Unload the newly imported modules (best effort finalization)
352
for module in sys.modules.keys():
353
if module not in save_modules and module.startswith("test."):
354
test_support.unload(module)
356
# The lists won't be sorted if running with -r
361
if good and not quiet:
362
if not bad and not skipped and len(good) > 1:
364
print count(len(good), "test"), "OK."
366
print "CAUTION: stdout isn't compared in verbose mode:"
367
print "a test that passes in verbose mode may fail without it."
369
print count(len(bad), "test"), "failed:"
371
if skipped and not quiet:
372
print count(len(skipped), "test"), "skipped:"
378
surprise = set(skipped) - e.getexpected() - set(resource_denieds)
380
print count(len(surprise), "skip"), \
381
"unexpected on", plat + ":"
384
print "Those skips are all expected on", plat + "."
386
print "Ask someone to teach regrtest.py about which tests are"
387
print "expected to get skipped on", plat + "."
390
alltests = findtests(testdir, stdtests, nottests)
391
for i in range(len(alltests)):
392
if tests[0] == alltests[i]:
393
if i == len(alltests) - 1:
396
fp = open(filename, 'w')
397
fp.write(alltests[i+1] + '\n')
405
r.write_results(show_missing=True, summary=True, coverdir=coverdir)
408
os.system("leaks %d" % os.getpid())
410
sys.exit(len(bad) > 0)
429
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
430
"""Return a list of all applicable test modules."""
431
if not testdir: testdir = findtestdir()
432
names = os.listdir(testdir)
435
if name[:5] == "test_" and name[-3:] == os.extsep+"py":
437
if modname not in stdtests and modname not in nottests:
438
tests.append(modname)
440
return stdtests + tests
442
def runtest(test, generate, verbose, quiet, testdir=None, huntrleaks=False):
443
"""Run a single test.
444
test -- the name of the test
445
generate -- if true, generate output, instead of running the test
446
and comparing it to a previously created output file
447
verbose -- if true, print more messages
448
quiet -- if true, don't print 'skipped' messages (probably redundant)
449
testdir -- test directory
451
test_support.unload(test)
453
testdir = findtestdir()
454
outputdir = os.path.join(testdir, "output")
455
outputfile = os.path.join(outputdir, test)
459
cfp = cStringIO.StringIO()
461
refrep = open(huntrleaks[2], "a")
463
save_stdout = sys.stdout
467
print test # Output file starts with test name
468
if test.startswith('test.'):
471
# Always import it from the test package
472
abstest = 'test.' + test
473
the_package = __import__(abstest, globals(), locals(), [])
474
the_module = getattr(the_package, test)
475
# Most tests run to completion simply as a side-effect of
476
# being imported. For the benefit of tests that can't run
477
# that way (like test_threaded_import), explicitly invoke
478
# their test_main() function (if it exists).
479
indirect_test = getattr(the_module, "test_main", None)
480
if indirect_test is not None:
483
# This code *is* hackish and inelegant, yes.
484
# But it seems to do the job.
486
fs = warnings.filters[:]
487
ps = copy_reg.dispatch_table.copy()
488
pic = sys.path_importer_cache.copy()
491
import _strptime, urlparse, warnings, dircache
492
from distutils.dir_util import _path_created
493
_path_created.clear()
494
warnings.filters[:] = fs
497
_strptime._regex_cache.clear()
498
urlparse.clear_cache()
499
copy_reg.dispatch_table.clear()
500
copy_reg.dispatch_table.update(ps)
501
sys.path_importer_cache.clear()
502
sys.path_importer_cache.update(pic)
511
repcount = huntrleaks[0] + huntrleaks[1]
512
print >> sys.stderr, "beginning", repcount, "repetitions"
513
print >> sys.stderr, \
514
("1234567890"*(repcount//10 + 1))[:repcount]
515
for i in range(repcount):
516
rc = sys.gettotalrefcount()
518
sys.stderr.write('.')
520
deltas.append(sys.gettotalrefcount() - rc - 2)
522
if max(map(abs, deltas[-huntrleaks[1]:])) > 0:
523
print >>sys.stderr, test, 'leaked', \
524
deltas[-huntrleaks[1]:], 'references'
525
print >>refrep, test, 'leaked', \
526
deltas[-huntrleaks[1]:], 'references'
527
# The end of the huntrleaks hackishness.
529
sys.stdout = save_stdout
530
except test_support.ResourceDenied, msg:
532
print test, "skipped --", msg
535
except (ImportError, test_support.TestSkipped), msg:
537
print test, "skipped --", msg
540
except KeyboardInterrupt:
542
except test_support.TestFailed, msg:
543
print "test", test, "failed --", msg
547
type, value = sys.exc_info()[:2]
548
print "test", test, "crashed --", str(type) + ":", value
551
traceback.print_exc(file=sys.stdout)
557
output = cfp.getvalue()
559
if output == test + "\n":
560
if os.path.exists(outputfile):
561
# Write it since it already exists (and the contents
562
# may have changed), but let the user know it isn't
564
print "output file", outputfile, \
565
"is no longer needed; consider removing it"
567
# We don't need it, so don't create it.
569
fp = open(outputfile, "w")
573
if os.path.exists(outputfile):
574
fp = open(outputfile, "r")
578
expected = test + "\n"
579
if output == expected or huntrleaks:
581
print "test", test, "produced unexpected output:"
583
reportdiff(expected, output)
587
def reportdiff(expected, output):
590
a = expected.splitlines(1)
591
b = output.splitlines(1)
592
sm = difflib.SequenceMatcher(a=a, b=b)
593
tuples = sm.get_opcodes()
596
# x0:x1 are 0-based slice indices; convert to 1-based line indices.
599
return "line " + str(x0)
601
return "lines %d-%d" % (x0, x1)
603
for op, a0, a1, b0, b1 in tuples:
608
print "***", pair(a0, a1), "of expected output missing:"
609
for line in a[a0:a1]:
612
elif op == 'replace':
613
print "*** mismatch between", pair(a0, a1), "of expected", \
614
"output and", pair(b0, b1), "of actual output:"
615
for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
619
print "***", pair(b0, b1), "of actual output doesn't appear", \
620
"in expected output after line", str(a1)+":"
621
for line in b[b0:b1]:
625
print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
630
if __name__ == '__main__':
634
testdir = os.path.dirname(file) or os.curdir
638
if name.endswith(os.extsep + "py"):
644
return "%d %s" % (n, word)
646
return "%d %ss" % (n, word)
648
def printlist(x, width=70, indent=4):
649
"""Print the elements of iterable x to stdout.
651
Optional arg width (default 70) is the maximum line length.
652
Optional arg indent (default 4) is the number of blanks with which to
656
from textwrap import fill
657
blanks = ' ' * indent
658
print fill(' '.join(map(str, x)), width,
659
initial_indent=blanks, subsequent_indent=blanks)
661
# Map sys.platform to a string containing the basenames of tests
662
# expected to be skipped on that platform.
666
# The _ExpectedSkips constructor adds this to the set of expected
667
# skips if not os.path.supports_unicode_filenames.
669
# Whether a skip is expected here depends on whether a large test
670
# input file has been downloaded. test_normalization.skip_expected
673
# Controlled by test_socket_ssl.skip_expected. Requires the network
674
# resource, and a socket module with ssl support.
676
# Controlled by test_timeout.skip_expected. Requires the network
677
# resource and a socket module.
679
# Whether a skip is expected here depends on whether a large test
680
# input file has been downloaded. test_codecmaps_*.skip_expected
853
test_threadedtempfile
893
test_threadedtempfile
1070
_expectations['freebsd5'] = _expectations['freebsd4']
1071
_expectations['freebsd6'] = _expectations['freebsd4']
1073
class _ExpectedSkips:
1076
from test import test_normalization
1077
from test import test_socket_ssl
1078
from test import test_timeout
1079
from test import test_codecmaps_cn, test_codecmaps_jp
1080
from test import test_codecmaps_kr, test_codecmaps_tw
1081
from test import test_codecmaps_hk
1084
if sys.platform in _expectations:
1085
s = _expectations[sys.platform]
1086
self.expected = set(s.split())
1088
if not os.path.supports_unicode_filenames:
1089
self.expected.add('test_pep277')
1091
if test_normalization.skip_expected:
1092
self.expected.add('test_normalization')
1094
if test_socket_ssl.skip_expected:
1095
self.expected.add('test_socket_ssl')
1097
if test_timeout.skip_expected:
1098
self.expected.add('test_timeout')
1100
for cc in ('cn', 'jp', 'kr', 'tw', 'hk'):
1101
if eval('test_codecmaps_' + cc).skip_expected:
1102
self.expected.add('test_codecmaps_' + cc)
1104
if sys.maxint == 9223372036854775807L:
1105
self.expected.add('test_rgbimg')
1106
self.expected.add('test_imageop')
1108
if not sys.platform in ("mac", "darwin"):
1109
MAC_ONLY = ["test_macostools", "test_macfs", "test_aepack",
1110
"test_plistlib", "test_scriptpackages"]
1111
for skip in MAC_ONLY:
1112
self.expected.add(skip)
1114
if sys.platform != "win32":
1115
WIN_ONLY = ["test_unicode_file", "test_winreg",
1117
for skip in WIN_ONLY:
1118
self.expected.add(skip)
1123
"Return true iff _ExpectedSkips knows about the current platform."
1126
def getexpected(self):
1127
"""Return set of test names we expect to skip on current platform.
1129
self.isvalid() must be true.
1132
assert self.isvalid()
1133
return self.expected
1135
if __name__ == '__main__':
1136
# Remove regrtest.py's own directory from the module search path. This
1137
# prevents relative imports from working, and relative imports will screw
1138
# up the testing framework. E.g. if both test.test_support and
1139
# test_support are imported, they will not contain the same globals, and
1140
# much of the testing framework relies on the globals in the
1141
# test.test_support module.
1142
mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
1143
i = pathlen = len(sys.path)
1146
if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
1148
if len(sys.path) == pathlen:
1149
print 'Could not find %r in sys.path to remove it' % mydir