From: <zy...@us...> - 2008-09-14 00:08:31
|
Revision: 5328 http://jython.svn.sourceforge.net/jython/?rev=5328&view=rev Author: zyasoft Date: 2008-09-14 00:08:28 +0000 (Sun, 14 Sep 2008) Log Message: ----------- Adds tests: test_copy, test_profilehooks, test_random, test_syntax, test_trace that should be reasonable for Jython (possibly with modifications) Provides coverage for #1738411 Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2008-09-13 19:02:55 UTC (rev 5327) +++ trunk/jython/Lib/test/regrtest.py 2008-09-14 00:08:28 UTC (rev 5328) @@ -1476,19 +1476,13 @@ test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw - test_copy test_dis test_eof test_frozen test_gc test_iterlen test_marshal - test_profilehooks test_pyclbr - test_quopri - test_random - test_syntax - test_trace test_ucn test_xml_etree test_zipimport This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-11 05:08:32
|
Revision: 5371 http://jython.svn.sourceforge.net/jython/?rev=5371&view=rev Author: pjenvey Date: 2008-10-11 05:08:23 +0000 (Sat, 11 Oct 2008) Log Message: ----------- disable test_compiler as we don't intend to support the parser module compiler relies on, with _ast being the way forward Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2008-10-11 03:37:39 UTC (rev 5370) +++ trunk/jython/Lib/test/regrtest.py 2008-10-11 05:08:23 UTC (rev 5371) @@ -1475,6 +1475,7 @@ test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw + test_compiler test_dis test_eof test_frozen This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-13 17:31:17
|
Revision: 5385 http://jython.svn.sourceforge.net/jython/?rev=5385&view=rev Author: fwierzbicki Date: 2008-10-13 17:31:05 +0000 (Mon, 13 Oct 2008) Log Message: ----------- disable test_transformer for the same reason we disabled test_compiler: we don't intend to support the parser module compiler relies on, with _ast being the way forward. transformer.py is in the same area of code. Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2008-10-13 17:19:47 UTC (rev 5384) +++ trunk/jython/Lib/test/regrtest.py 2008-10-13 17:31:05 UTC (rev 5385) @@ -1483,6 +1483,7 @@ test_iterlen test_marshal test_pyclbr + test_transformer test_ucn test_xml_etree test_zipimport This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-13 18:50:22
|
Revision: 5386 http://jython.svn.sourceforge.net/jython/?rev=5386&view=rev Author: fwierzbicki Date: 2008-10-13 18:50:06 +0000 (Mon, 13 Oct 2008) Log Message: ----------- Fixed "expected skips" that wheren't actually being skipped. Also added test_peepholer and test_profile to expected failures since these are platform specific tests. This is a work around, we should (most likely) go back and force these expected failures to skip in Jython, but I want to do that in one future sweep. Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2008-10-13 17:31:05 UTC (rev 5385) +++ trunk/jython/Lib/test/regrtest.py 2008-10-13 18:50:06 UTC (rev 5386) @@ -1388,9 +1388,6 @@ test_capi test_cd test_cl - test_code - test_codeccallbacks - test_codeop test_commands test_crypt test_ctypes @@ -1417,28 +1414,23 @@ test_macfs test_macostools test_mmap - test_mpz test_nis test_normalization test_openpty test_ossaudiodev test_parser - test_peepholer test_plistlib test_poll - test_profile test_pty test_pyexpat test_resource test_rgbimg - test_rotor test_scriptpackages test_signal test_socket_ssl test_socketserver test_sqlite test_startfile - test_stringprep test_strop test_structmembers test_sunaudiodev @@ -1447,8 +1439,6 @@ test_tcl test_threadsignals test_timeout - test_timing - test_transformer test_unicode_file test_wait3 test_wait4 @@ -1482,6 +1472,8 @@ test_gc test_iterlen test_marshal + test_peepholer + test_profile test_pyclbr test_transformer test_ucn This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2009-01-04 23:06:30
|
Revision: 5843 http://jython.svn.sourceforge.net/jython/?rev=5843&view=rev Author: cgroves Date: 2009-01-04 23:06:27 +0000 (Sun, 04 Jan 2009) Log Message: ----------- Add tests that have been failing or skipping for the past few months to the expected lists Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-01-04 22:15:09 UTC (rev 5842) +++ trunk/jython/Lib/test/regrtest.py 2009-01-04 23:06:27 UTC (rev 5843) @@ -1380,6 +1380,7 @@ 'java': """ test__locale + test__rawffi test_aepack test_al test_applesingle @@ -1475,11 +1476,16 @@ test_gc test_iterlen test_marshal + test_multibytecodec + test_multibytecodec_support test_peepholer test_profile test_pyclbr + test_stringprep test_transformer test_ucn + test_unicode + test_unicodedata test_xml_etree test_zipimport """, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2009-01-04 23:20:38
|
Revision: 5844 http://jython.svn.sourceforge.net/jython/?rev=5844&view=rev Author: cgroves Date: 2009-01-04 23:20:34 +0000 (Sun, 04 Jan 2009) Log Message: ----------- One more longstanding skip Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-01-04 23:06:27 UTC (rev 5843) +++ trunk/jython/Lib/test/regrtest.py 2009-01-04 23:20:34 UTC (rev 5844) @@ -1450,6 +1450,7 @@ test_winreg test_winsound test_xml_etree_c + test_zipfile64 """ } _expectations['freebsd5'] = _expectations['freebsd4'] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2009-03-20 01:16:30
|
Revision: 6102 http://jython.svn.sourceforge.net/jython/?rev=6102&view=rev Author: pjenvey Date: 2009-03-20 01:16:13 +0000 (Fri, 20 Mar 2009) Log Message: ----------- o test_import/threadsignals fail, not skip o test_dummy_thread passes, dummy_threading is broken: http://bugs.jython.org/issue1279 Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-03-17 19:07:37 UTC (rev 6101) +++ trunk/jython/Lib/test/regrtest.py 2009-03-20 01:16:13 UTC (rev 6102) @@ -1399,8 +1399,6 @@ test_curses test_dbm test_dl - test_dummy_thread - test_dummy_threading test_email_codecs test_fcntl test_fork1 @@ -1410,7 +1408,6 @@ test_hotshot test_imageop test_imgfile - test_import test_ioctl test_largefile test_linuxaudiodev @@ -1441,7 +1438,6 @@ test_sundry test_symtable test_tcl - test_threadsignals test_timeout test_unicode_file test_wait3 @@ -1471,9 +1467,11 @@ test_codecmaps_tw test_compiler test_dis + test_dummy_threading test_eof test_frozen test_gc + test_import test_iterlen test_multibytecodec test_multibytecodec_support @@ -1481,6 +1479,7 @@ test_profile test_pyclbr test_stringprep + test_threadsignals test_transformer test_ucn test_unicodedata This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2009-04-10 04:27:51
|
Revision: 6203 http://jython.svn.sourceforge.net/jython/?rev=6203&view=rev Author: pjenvey Date: 2009-04-10 04:27:38 +0000 (Fri, 10 Apr 2009) Log Message: ----------- test_pyexpat is fail Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-04-10 04:01:54 UTC (rev 6202) +++ trunk/jython/Lib/test/regrtest.py 2009-04-10 04:27:38 UTC (rev 6203) @@ -1424,7 +1424,6 @@ test_plistlib test_poll test_pty - test_pyexpat test_resource test_rgbimg test_scriptpackages @@ -1477,6 +1476,7 @@ test_multibytecodec_support test_peepholer test_pyclbr + test_pyexpat test_stringprep test_threadsignals test_transformer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2009-05-26 06:28:28
|
Revision: 6377 http://jython.svn.sourceforge.net/jython/?rev=6377&view=rev Author: pjenvey Date: 2009-05-26 06:28:07 +0000 (Tue, 26 May 2009) Log Message: ----------- disable test_mailbox on Windows for now because it fails so miserably and ruins other tests Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-05-26 00:03:26 UTC (rev 6376) +++ trunk/jython/Lib/test/regrtest.py 2009-05-26 06:28:07 UTC (rev 6377) @@ -1489,6 +1489,10 @@ _platform = sys.platform if _platform[:4] == 'java': _platform = 'java' + if os._name == 'nt': + # XXX: Omitted for now because it fails so miserably and ruins + # other tests + _failures['java'] += '\ntest_mailbox' class _ExpectedSkips: def __init__(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2009-05-30 06:49:09
|
Revision: 6428 http://jython.svn.sourceforge.net/jython/?rev=6428&view=rev Author: pjenvey Date: 2009-05-30 06:49:08 +0000 (Sat, 30 May 2009) Log Message: ----------- just skip test_popen on windows when ' ' in sys.executable as CPython still suffers from this anyway Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2009-05-30 06:41:33 UTC (rev 6427) +++ trunk/jython/Lib/test/regrtest.py 2009-05-30 06:49:08 UTC (rev 6428) @@ -1493,6 +1493,9 @@ # XXX: Omitted for now because it fails so miserably and ruins # other tests _failures['java'] += '\ntest_mailbox' + if ' ' in sys.executable: + # http://bugs.python.org/issue1559298 + _failures['java'] += '\ntest_popen' class _ExpectedSkips: def __init__(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2011-03-14 01:51:41
|
Revision: 7228 http://jython.svn.sourceforge.net/jython/?rev=7228&view=rev Author: pjenvey Date: 2011-03-14 01:51:34 +0000 (Mon, 14 Mar 2011) Log Message: ----------- from: https://svn.python.org/projects/python/branches/release26-maint/Lib/test/regrtest.py@83687 Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2011-03-13 18:54:43 UTC (rev 7227) +++ trunk/jython/Lib/test/regrtest.py 2011-03-14 01:51:34 UTC (rev 7228) @@ -11,12 +11,10 @@ -v: verbose -- run tests in verbose mode with output to stdout -w: verbose2 -- re-run failed tests in verbose mode -q: quiet -- don't print anything except if a test fails --g: generate -- write the output file for a test instead of comparing it -x: exclude -- arguments are tests to *exclude* -s: single -- run only a single test (see below) +-S: slow -- print the slowest 10 tests -r: random -- randomize test execution order --m: memo -- save results to file --j: junit-xml -- save results as JUnit XML to files in directory -f: fromfile -- read names of tests to run from a file (see below) -l: findleaks -- if GC is available detect tests that leak memory -u: use -- specify which special resource intensive tests to run @@ -28,14 +26,11 @@ -L: runleaks -- run the leaks(1) command just before exit -R: huntrleaks -- search for reference leaks (needs debug build, v. slow) -M: memlimit -- run very large memory-consuming tests --e: expected -- run only tests that are expected to run and pass If non-option arguments are present, they are names for tests to run, unless -x is given, in which case they are names for tests not to run. If no test names are given, all tests are run. --v is incompatible with -g and does not compare test output files. - -T turns on code coverage tracing with the trace module. -D specifies the directory where coverage files are put. @@ -96,6 +91,8 @@ curses - Tests that use curses and will modify the terminal's state and output modes. + lib2to3 - Run the tests for 2to3 (They take a while.) + largefile - It is okay to run some test that may create huge files. These tests can take a long time and may consume >2GB of disk space temporarily. @@ -124,15 +121,19 @@ option '-uall,-bsddb'. """ -import os -import sys +import cStringIO import getopt +import os import random -import warnings import re -import cStringIO -import traceback +import sys import time +import traceback +import warnings +# keep a reference to the ascii module to workaround #7140 bug +# (see issue #7027) +import encodings.ascii +import imp # I see no other way to suppress these warnings; # putting them in test_grammar.py has no effect: @@ -168,7 +169,6 @@ newsoft = min(hard, max(soft, 1024*2048)) resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard)) -import test as _test from test import test_support RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', @@ -181,11 +181,10 @@ sys.exit(code) -def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, +def main(tests=None, testdir=None, verbose=0, quiet=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False, verbose2=False, expected=False, - memo=None, junit_xml=None): + runleaks=False, huntrleaks=False, verbose2=False, print_slow=False): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -202,27 +201,25 @@ command-line will be used. If that's empty, too, then all *.py files beginning with test_ will be used. - The other default arguments (verbose, quiet, generate, exclude, single, - randomize, findleaks, use_resources, trace and coverdir) allow programmers - calling main() directly to set the values that would normally be set by - flags on the command line. + The other default arguments (verbose, quiet, exclude, + single, randomize, findleaks, use_resources, trace, coverdir, and + print_slow) allow programmers calling main() directly to set the + values that would normally be set by flags on the command line. """ test_support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:wM:em:j:', - ['help', 'verbose', 'quiet', 'generate', - 'exclude', 'single', 'random', 'fromfile', + opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:wM:', + ['help', 'verbose', 'quiet', 'exclude', + 'single', 'slow', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', 'huntrleaks=', 'verbose2', 'memlimit=', - 'expected', 'memo' ]) except getopt.error, msg: usage(2, msg) # Defaults - allran = True if use_resources is None: use_resources = [] for o, a in opts: @@ -235,16 +232,12 @@ elif o in ('-q', '--quiet'): quiet = True; verbose = 0 - elif o in ('-g', '--generate'): - generate = True elif o in ('-x', '--exclude'): exclude = True - allran = False - elif o in ('-e', '--expected'): - expected = True - allran = False elif o in ('-s', '--single'): single = True + elif o in ('-S', '--slow'): + print_slow = True elif o in ('-r', '--randomize'): randomize = True elif o in ('-f', '--fromfile'): @@ -253,10 +246,6 @@ findleaks = True elif o in ('-L', '--runleaks'): runleaks = True - elif o in ('-m', '--memo'): - memo = a - elif o in ('-j', '--junit-xml'): - junit_xml = a elif o in ('-t', '--threshold'): import gc gc.set_threshold(int(a)) @@ -300,8 +289,10 @@ use_resources.remove(r) elif r not in use_resources: use_resources.append(r) - if generate and verbose: - usage(2, "-g and -v don't go together!") + else: + print >>sys.stderr, ("No handler for option {0}. Please " + "report this as a bug at http://bugs.python.org.").format(o) + sys.exit(1) if single and fromfile: usage(2, "-s and -f don't go together!") @@ -312,8 +303,6 @@ if findleaks: try: - if test_support.is_jython: - raise ImportError() import gc except ImportError: print 'No GC available, disabling findleaks.' @@ -348,7 +337,6 @@ # Strip .py extensions. if args: args = map(removepy, args) - allran = False if tests: tests = map(removepy, tests) @@ -369,27 +357,24 @@ import trace tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=False, count=True) + test_times = [] test_support.verbose = verbose # Tell tests to be moderately quiet test_support.use_resources = use_resources - test_support.junit_xml_dir = junit_xml save_modules = sys.modules.keys() - skips = _ExpectedSkips() - failures = _ExpectedFailures() for test in tests: - if expected and (test in skips or test in failures): - continue if not quiet: print test sys.stdout.flush() if trace: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. - tracer.runctx('runtest(test, generate, verbose, quiet, testdir)', + tracer.runctx('runtest(test, verbose, quiet,' + ' test_times, testdir)', globals=globals(), locals=vars()) else: try: - ok = runtest(test, generate, verbose, quiet, testdir, - huntrleaks, junit_xml) + ok = runtest(test, verbose, quiet, test_times, + testdir, huntrleaks) except KeyboardInterrupt: # print a newline separate from the ^C print @@ -417,38 +402,45 @@ for module in sys.modules.keys(): if module not in save_modules and module.startswith("test."): test_support.unload(module) - module = module[5:] - if hasattr(_test, module): - delattr(_test, module) - # The lists won't be sorted if running with -r - good.sort() - bad.sort() - skipped.sort() - if good and not quiet: if not bad and not skipped and len(good) > 1: print "All", print count(len(good), "test"), "OK." - if verbose: - print "CAUTION: stdout isn't compared in verbose mode:" - print "a test that passes in verbose mode may fail without it." - surprises = 0 - if skipped and not quiet: - print count(len(skipped), "test"), "skipped:" - surprises += countsurprises(skips, skipped, 'skip', 'ran', allran, resource_denieds) + if print_slow: + test_times.sort(reverse=True) + print "10 slowest tests:" + for time, test in test_times[:10]: + print "%s: %.1fs" % (test, time) if bad: print count(len(bad), "test"), "failed:" - surprises += countsurprises(failures, bad, 'fail', 'passed', allran, resource_denieds) + printlist(bad) + if skipped and not quiet: + print count(len(skipped), "test"), "skipped:" + printlist(skipped) + e = _ExpectedSkips() + plat = sys.platform + if e.isvalid(): + surprise = set(skipped) - e.getexpected() - set(resource_denieds) + if surprise: + print count(len(surprise), "skip"), \ + "unexpected on", plat + ":" + printlist(surprise) + else: + print "Those skips are all expected on", plat + "." + else: + print "Ask someone to teach regrtest.py about which tests are" + print "expected to get skipped on", plat + "." + if verbose2 and bad: print "Re-running failed tests in verbose mode" for test in bad: print "Re-running test %r in verbose mode" % test sys.stdout.flush() try: - test_support.verbose = 1 - ok = runtest(test, generate, 1, quiet, testdir, + test_support.verbose = True + ok = runtest(test, True, quiet, test_times, testdir, huntrleaks) except KeyboardInterrupt: # print a newline separate from the ^C @@ -478,29 +470,32 @@ if runleaks: os.system("leaks %d" % os.getpid()) - if memo: - savememo(memo,good,bad,skipped) + sys.exit(len(bad) > 0) - sys.exit(surprises > 0) - STDTESTS = [ 'test_grammar', 'test_opcodes', - 'test_operations', + 'test_dict', 'test_builtin', 'test_exceptions', 'test_types', 'test_unittest', 'test_doctest', 'test_doctest2', + # On 2.6, when a C module like dl or linuxaudiodev is imported by some + # test, a DeprecationWarning is raised, but test_py3kwarn can not find + # it in the __warningregistry__ of the modules in sys.modules. + # C modules raise the warning only once, and since there's no way to + # find these warnings, test_py3kwarn is executed first to catch them + # before the other modules. This shouldn't affect 2.7+ + 'test_py3kwarn', ] NOTTESTS = [ 'test_support', 'test_future1', 'test_future2', - 'test_future3', ] def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): @@ -516,15 +511,14 @@ tests.sort() return stdtests + tests -def runtest(test, generate, verbose, quiet, testdir=None, huntrleaks=False, - junit_xml=None): +def runtest(test, verbose, quiet, test_times, + testdir=None, huntrleaks=False): """Run a single test. test -- the name of the test - generate -- if true, generate output, instead of running the test - and comparing it to a previously created output file verbose -- if true, print more messages quiet -- if true, don't print 'skipped' messages (probably redundant) + test_times -- a list of (time, test_name) pairs testdir -- test directory huntrleaks -- run multiple times to test for leaks; requires a debug build; a triple corresponding to -R's three arguments @@ -536,91 +530,61 @@ """ try: - return runtest_inner(test, generate, verbose, quiet, testdir, - huntrleaks, junit_xml) + return runtest_inner(test, verbose, quiet, test_times, + testdir, huntrleaks) finally: cleanup_test_droppings(test, verbose) -def runtest_inner(test, generate, verbose, quiet, - testdir=None, huntrleaks=False, junit_xml_dir=None): +def runtest_inner(test, verbose, quiet, test_times, + testdir=None, huntrleaks=False): test_support.unload(test) if not testdir: testdir = findtestdir() - outputdir = os.path.join(testdir, "output") - outputfile = os.path.join(outputdir, test) if verbose: - cfp = None + capture_stdout = None else: - cfp = cStringIO.StringIO() + capture_stdout = cStringIO.StringIO() - from test.junit_xml import Tee, write_direct_test try: save_stdout = sys.stdout - - indirect_test = None - if junit_xml_dir: - save_stderr = sys.stderr - sys.stdout = stdout = Tee(sys.stdout) - sys.stderr = stderr = Tee(sys.stderr) try: - if cfp: - sys.stdout = cfp - print test # Output file starts with test name + if capture_stdout: + sys.stdout = capture_stdout if test.startswith('test.'): abstest = test else: # Always import it from the test package abstest = 'test.' + test - start = time.time() + start_time = time.time() the_package = __import__(abstest, globals(), locals(), []) the_module = getattr(the_package, test) - # Most tests run to completion simply as a side-effect of - # being imported. For the benefit of tests that can't run - # that way (like test_threaded_import), explicitly invoke - # their test_main() function (if it exists). + # Old tests run to completion simply as a side-effect of + # being imported. For tests based on unittest or doctest, + # explicitly invoke their test_main() function (if it exists). indirect_test = getattr(the_module, "test_main", None) if indirect_test is not None: indirect_test() - elif junit_xml_dir: - write_direct_test(junit_xml_dir, abstest, time.time() - start, - stdout=stdout.getvalue(), - stderr=stderr.getvalue()) if huntrleaks: dash_R(the_module, test, indirect_test, huntrleaks) + test_time = time.time() - start_time + test_times.append((test_time, test)) finally: sys.stdout = save_stdout - if junit_xml_dir: - sys.stderr = save_stderr except test_support.ResourceDenied, msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() - if junit_xml_dir: - write_direct_test(junit_xml_dir, abstest, time.time() - start, - 'skipped', sys.exc_info(), - stdout=stdout.getvalue(), - stderr=stderr.getvalue()) return -2 except (ImportError, test_support.TestSkipped), msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() - if junit_xml_dir: - write_direct_test(junit_xml_dir, abstest, time.time() - start, - 'skipped', sys.exc_info(), - stdout=stdout.getvalue(), - stderr=stderr.getvalue()) return -1 except KeyboardInterrupt: raise except test_support.TestFailed, msg: print "test", test, "failed --", msg sys.stdout.flush() - if junit_xml_dir and indirect_test is None: - write_direct_test(junit_xml_dir, abstest, time.time() - start, - 'failure', sys.exc_info(), - stdout=stdout.getvalue(), - stderr=stderr.getvalue()) return 0 except: type, value = sys.exc_info()[:2] @@ -629,42 +593,19 @@ if verbose: traceback.print_exc(file=sys.stdout) sys.stdout.flush() - if junit_xml_dir and indirect_test is None: - write_direct_test(junit_xml_dir, abstest, time.time() - start, - 'error', sys.exc_info(), - stdout=stdout.getvalue(), - stderr=stderr.getvalue()) return 0 else: - if not cfp: + # Except in verbose mode, tests should not print anything + if verbose or huntrleaks: return 1 - output = cfp.getvalue() - if generate: - if output == test + "\n": - if os.path.exists(outputfile): - # Write it since it already exists (and the contents - # may have changed), but let the user know it isn't - # needed: - print "output file", outputfile, \ - "is no longer needed; consider removing it" - else: - # We don't need it, so don't create it. - return 1 - fp = open(outputfile, "w") - fp.write(output) - fp.close() + output = capture_stdout.getvalue() + if not output: return 1 - if os.path.exists(outputfile): - fp = open(outputfile, "r") - expected = fp.read() - fp.close() - else: - expected = test + "\n" - if output == expected or huntrleaks: - return 1 + print "test", test, "produced unexpected output:" + print "*" * 70 + print output + print "*" * 70 sys.stdout.flush() - reportdiff(expected, output) - sys.stdout.flush() return 0 def cleanup_test_droppings(testname, verbose): @@ -700,7 +641,7 @@ def dash_R(the_module, test, indirect_test, huntrleaks): # This code is hackish and inelegant, but it seems to do the job. - import copy_reg + import copy_reg, _abcoll, io if not hasattr(sys, 'gettotalrefcount'): raise Exception("Tracking reference leaks requires a debug build " @@ -710,41 +651,56 @@ fs = warnings.filters[:] ps = copy_reg.dispatch_table.copy() pic = sys.path_importer_cache.copy() + abcs = {} + modules = _abcoll, io + for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]: + # XXX isinstance(abc, ABCMeta) leads to infinite recursion + if not hasattr(abc, '_abc_registry'): + continue + for obj in abc.__subclasses__() + [abc]: + abcs[obj] = obj._abc_registry.copy() if indirect_test: def run_the_test(): indirect_test() else: def run_the_test(): - reload(the_module) + imp.reload(the_module) deltas = [] nwarmup, ntracked, fname = huntrleaks repcount = nwarmup + ntracked print >> sys.stderr, "beginning", repcount, "repetitions" print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount] - dash_R_cleanup(fs, ps, pic) + dash_R_cleanup(fs, ps, pic, abcs) for i in range(repcount): rc = sys.gettotalrefcount() run_the_test() sys.stderr.write('.') - dash_R_cleanup(fs, ps, pic) + dash_R_cleanup(fs, ps, pic, abcs) if i >= nwarmup: deltas.append(sys.gettotalrefcount() - rc - 2) print >> sys.stderr if any(deltas): - print >> sys.stderr, test, 'leaked', deltas, 'references' + msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas)) + print >> sys.stderr, msg refrep = open(fname, "a") - print >> refrep, test, 'leaked', deltas, 'references' + print >> refrep, msg refrep.close() -def dash_R_cleanup(fs, ps, pic): +def dash_R_cleanup(fs, ps, pic, abcs): import gc, copy_reg - import _strptime, linecache, dircache + import _strptime, linecache + dircache = test_support.import_module('dircache', deprecated=True) import urlparse, urllib, urllib2, mimetypes, doctest import struct, filecmp from distutils.dir_util import _path_created + # Clear the warnings registry, so they can be displayed again + for mod in sys.modules.values(): + if hasattr(mod, '__warningregistry__'): + del mod.__warningregistry__ + # Restore some original values. warnings.filters[:] = fs copy_reg.dispatch_table.clear() @@ -752,6 +708,15 @@ sys.path_importer_cache.clear() sys.path_importer_cache.update(pic) + # clear type cache + sys._clear_type_cache() + + # Clear ABC registries, restoring previously saved ABC registries. + for abc, registry in abcs.items(): + abc._abc_registry = registry.copy() + abc._abc_cache.clear() + abc._abc_negative_cache.clear() + # Clear assorted module caches. _path_created.clear() re.purge() @@ -762,55 +727,13 @@ dircache.reset() linecache.clearcache() mimetypes._default_mime_types() - struct._cache.clear() filecmp._cache.clear() + struct._clearcache() doctest.master = None # Collect cyclic trash. gc.collect() -def reportdiff(expected, output): - import difflib - print "*" * 70 - a = expected.splitlines(1) - b = output.splitlines(1) - sm = difflib.SequenceMatcher(a=a, b=b) - tuples = sm.get_opcodes() - - def pair(x0, x1): - # x0:x1 are 0-based slice indices; convert to 1-based line indices. - x0 += 1 - if x0 >= x1: - return "line " + str(x0) - else: - return "lines %d-%d" % (x0, x1) - - for op, a0, a1, b0, b1 in tuples: - if op == 'equal': - pass - - elif op == 'delete': - print "***", pair(a0, a1), "of expected output missing:" - for line in a[a0:a1]: - print "-", line, - - elif op == 'replace': - print "*** mismatch between", pair(a0, a1), "of expected", \ - "output and", pair(b0, b1), "of actual output:" - for line in difflib.ndiff(a[a0:a1], b[b0:b1]): - print line, - - elif op == 'insert': - print "***", pair(b0, b1), "of actual output doesn't appear", \ - "in expected output after line", str(a1)+":" - for line in b[b0:b1]: - print "+", line, - - else: - print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1) - - print "*" * 70 - def findtestdir(): if __name__ == '__main__': file = sys.argv[0] @@ -840,26 +763,10 @@ from textwrap import fill blanks = ' ' * indent - print fill(' '.join(map(str, sorted(x))), width, + # Print the sorted list: 'x' may be a '--random' list or a set() + print fill(' '.join(str(elt) for elt in sorted(x)), width, initial_indent=blanks, subsequent_indent=blanks) -def countsurprises(expected, actual, action, antiaction, allran, resource_denieds): - """returns the number of items in actual that aren't in expected.""" - printlist(actual) - if not expected.isvalid(): - print "Ask someone to teach regrtest.py about which tests are" - print "expected to %s on %s." % (action, sys.platform) - return 1#Surprising not to know what to expect.... - good_surprise = expected.getexpected() - set(actual) - if allran and good_surprise: - print count(len(good_surprise), 'test'), antiaction, 'unexpectedly:' - printlist(good_surprise) - bad_surprise = set(actual) - expected.getexpected() - set(resource_denieds) - if bad_surprise: - print count(len(bad_surprise), action), "unexpected:" - printlist(bad_surprise) - return len(bad_surprise) - # Map sys.platform to a string containing the basenames of tests # expected to be skipped on that platform. # @@ -873,17 +780,16 @@ # test_timeout # Controlled by test_timeout.skip_expected. Requires the network # resource and a socket module. +# +# Tests that are expected to be skipped everywhere except on one platform +# are also handled separately. _expectations = { 'win32': """ test__locale - test_applesingle - test_al test_bsddb185 test_bsddb3 - test_cd - test_cl test_commands test_crypt test_curses @@ -891,24 +797,22 @@ test_dl test_fcntl test_fork1 + test_epoll test_gdbm - test_gl test_grp - test_imgfile test_ioctl test_largefile - test_linuxaudiodev + test_kqueue test_mhlib - test_nis test_openpty test_ossaudiodev + test_pipes test_poll test_posix test_pty test_pwd test_resource test_signal - test_sunaudiodev test_threadsignals test_timing test_wait3 @@ -916,34 +820,20 @@ """, 'linux2': """ - test_al - test_applesingle test_bsddb185 - test_cd - test_cl test_curses test_dl - test_gl - test_imgfile test_largefile - test_linuxaudiodev - test_nis - test_ntpath + test_kqueue test_ossaudiodev - test_sqlite - test_startfile - test_sunaudiodev """, 'mac': """ - test_al test_atexit test_bsddb test_bsddb185 test_bsddb3 test_bz2 - test_cd - test_cl test_commands test_crypt test_curses @@ -951,16 +841,13 @@ test_dl test_fcntl test_fork1 - test_gl + test_epoll test_grp test_ioctl - test_imgfile test_largefile - test_linuxaudiodev test_locale + test_kqueue test_mmap - test_nis - test_ntpath test_openpty test_ossaudiodev test_poll @@ -971,88 +858,55 @@ test_pwd test_resource test_signal - test_sqlite - test_startfile - test_sunaudiodev test_sundry test_tarfile test_timing """, 'unixware7': """ - test_al - test_applesingle test_bsddb test_bsddb185 - test_cd - test_cl test_dl - test_gl - test_imgfile + test_epoll test_largefile - test_linuxaudiodev + test_kqueue test_minidom - test_nis - test_ntpath test_openpty test_pyexpat test_sax - test_startfile - test_sqlite - test_sunaudiodev test_sundry """, 'openunix8': """ - test_al - test_applesingle test_bsddb test_bsddb185 - test_cd - test_cl test_dl - test_gl - test_imgfile + test_epoll test_largefile - test_linuxaudiodev + test_kqueue test_minidom - test_nis - test_ntpath test_openpty test_pyexpat test_sax - test_sqlite - test_startfile - test_sunaudiodev test_sundry """, 'sco_sv3': """ - test_al - test_applesingle test_asynchat test_bsddb test_bsddb185 - test_cd - test_cl test_dl test_fork1 + test_epoll test_gettext - test_gl - test_imgfile test_largefile - test_linuxaudiodev test_locale + test_kqueue test_minidom - test_nis - test_ntpath test_openpty test_pyexpat test_queue test_sax - test_sqlite - test_startfile - test_sunaudiodev test_sundry test_thread test_threaded_import @@ -1061,40 +915,30 @@ """, 'riscos': """ - test_al - test_applesingle test_asynchat test_atexit test_bsddb test_bsddb185 test_bsddb3 - test_cd - test_cl test_commands test_crypt test_dbm test_dl test_fcntl test_fork1 + test_epoll test_gdbm - test_gl test_grp - test_imgfile test_largefile - test_linuxaudiodev test_locale + test_kqueue test_mmap - test_nis - test_ntpath test_openpty test_poll test_popen2 test_pty test_pwd test_strop - test_sqlite - test_startfile - test_sunaudiodev test_sundry test_thread test_threaded_import @@ -1105,452 +949,232 @@ 'darwin': """ test__locale - test_al test_bsddb test_bsddb3 - test_cd - test_cl test_curses + test_epoll test_gdbm - test_gl - test_imgfile test_largefile - test_linuxaudiodev test_locale + test_kqueue test_minidom - test_nis - test_ntpath test_ossaudiodev test_poll - test_sqlite - test_startfile - test_sunaudiodev """, 'sunos5': """ - test_al - test_applesingle test_bsddb test_bsddb185 - test_cd - test_cl test_curses test_dbm + test_epoll + test_kqueue test_gdbm - test_gl test_gzip - test_imgfile - test_linuxaudiodev test_openpty - test_sqlite - test_startfile test_zipfile test_zlib """, 'hp-ux11': """ - test_al - test_applesingle test_bsddb test_bsddb185 - test_cd - test_cl test_curses test_dl + test_epoll test_gdbm - test_gl test_gzip - test_imgfile test_largefile - test_linuxaudiodev test_locale + test_kqueue test_minidom - test_nis - test_ntpath test_openpty test_pyexpat test_sax - test_sqlite - test_startfile - test_sunaudiodev test_zipfile test_zlib """, 'atheos': """ - test_al - test_applesingle test_bsddb185 - test_cd - test_cl test_curses test_dl test_gdbm - test_gl - test_imgfile + test_epoll test_largefile - test_linuxaudiodev test_locale + test_kqueue test_mhlib test_mmap - test_nis test_poll test_popen2 test_resource - test_sqlite - test_startfile - test_sunaudiodev """, 'cygwin': """ - test_al - test_applesingle test_bsddb185 test_bsddb3 - test_cd - test_cl test_curses test_dbm - test_gl - test_imgfile + test_epoll test_ioctl + test_kqueue test_largefile - test_linuxaudiodev test_locale - test_nis test_ossaudiodev test_socketserver - test_sqlite - test_sunaudiodev """, 'os2emx': """ - test_al - test_applesingle test_audioop test_bsddb185 test_bsddb3 - test_cd - test_cl test_commands test_curses test_dl - test_gl - test_imgfile + test_epoll + test_kqueue test_largefile - test_linuxaudiodev test_mhlib test_mmap - test_nis test_openpty test_ossaudiodev test_pty test_resource test_signal - test_sqlite - test_startfile - test_sunaudiodev """, 'freebsd4': """ - test_aepack - test_al - test_applesingle test_bsddb test_bsddb3 - test_cd - test_cl + test_epoll test_gdbm - test_gl - test_imgfile - test_linuxaudiodev test_locale - test_macfs - test_macostools - test_nis test_ossaudiodev test_pep277 - test_plistlib test_pty - test_scriptpackages test_socket_ssl test_socketserver - test_sqlite - test_startfile - test_sunaudiodev test_tcl test_timeout - test_unicode_file test_urllibnet - test_winreg - test_winsound + test_multiprocessing """, 'aix5': """ - test_aepack - test_al - test_applesingle test_bsddb test_bsddb185 test_bsddb3 test_bz2 - test_cd - test_cl test_dl + test_epoll test_gdbm - test_gl test_gzip - test_imgfile - test_linuxaudiodev - test_macfs - test_macostools - test_nis + test_kqueue test_ossaudiodev - test_sqlite - test_startfile - test_sunaudiodev test_tcl - test_winreg - test_winsound test_zipimport test_zlib """, 'openbsd3': """ - test_aepack - test_al - test_applesingle test_bsddb test_bsddb3 - test_cd - test_cl test_ctypes test_dl + test_epoll test_gdbm - test_gl - test_imgfile - test_linuxaudiodev test_locale - test_macfs - test_macostools - test_nis test_normalization test_ossaudiodev test_pep277 - test_plistlib - test_scriptpackages test_tcl - test_sqlite - test_startfile - test_sunaudiodev - test_unicode_file - test_winreg - test_winsound + test_multiprocessing """, 'netbsd3': """ - test_aepack - test_al - test_applesingle test_bsddb test_bsddb185 test_bsddb3 - test_cd - test_cl test_ctypes test_curses test_dl + test_epoll test_gdbm - test_gl - test_imgfile - test_linuxaudiodev test_locale - test_macfs - test_macostools - test_nis test_ossaudiodev test_pep277 - test_sqlite - test_startfile - test_sunaudiodev test_tcl - test_unicode_file - test_winreg - test_winsound + test_multiprocessing """, - 'java': - """ - test__locale - test__rawffi - test_aepack - test_al - test_applesingle - test_audioop - test_bsddb - test_bsddb185 - test_bsddb3 - test_bz2 - test_cProfile - test_capi - test_cd - test_cl - test_commands - test_crypt - test_ctypes - test_curses - test_dbm - test_dl - test_email_codecs - test_fcntl - test_fork1 - test_gdbm - test_getargs2 - test_gl - test_hotshot - test_imageop - test_imgfile - test_ioctl - test_largefile - test_linuxaudiodev - test_locale - test_longexp - test_macfs - test_macostools - test_mmap - test_nis - test_normalization - test_openpty - test_ossaudiodev - test_parser - test_plistlib - test_poll - test_pty - test_resource - test_rgbimg - test_scriptpackages - test_socket_ssl - test_socketserver - test_sqlite - test_startfile - test_strop - test_structmembers - test_sunaudiodev - test_sundry - test_symtable - test_tcl - test_timeout - test_unicode_file - test_wait3 - test_wait4 - test_wave - test_winreg - test_winsound - test_zipfile64 - - test_gzip - test_ftplib - test_logging - test_poplib - test_pydoc - test_queue - test_smtplib - test_telnetlib - """ } _expectations['freebsd5'] = _expectations['freebsd4'] _expectations['freebsd6'] = _expectations['freebsd4'] _expectations['freebsd7'] = _expectations['freebsd4'] +_expectations['freebsd8'] = _expectations['freebsd4'] -_failures = { - 'java': - """ - test_codecencodings_cn - test_codecencodings_hk - test_codecencodings_jp - test_codecencodings_kr - test_codecencodings_tw - test_codecmaps_cn - test_codecmaps_hk - test_codecmaps_jp - test_codecmaps_kr - test_codecmaps_tw - test_compiler - test_dis - test_dummy_threading - test_eof - test_frozen - test_gc - test_import - test_iterlen - test_multibytecodec - test_multibytecodec_support - test_peepholer - test_pyclbr - test_pyexpat - test_stringprep - test_threadsignals - test_transformer - test_ucn - test_unicodedata - test_zipimport - """, -} - -_platform = sys.platform -if _platform[:4] == 'java': - _platform = 'java' - if os._name == 'nt': - # XXX: Omitted for now because it fails so miserably and ruins - # other tests - _failures['java'] += '\ntest_mailbox' - if ' ' in sys.executable: - # http://bugs.python.org/issue1559298 - _failures['java'] += '\ntest_popen' - class _ExpectedSkips: def __init__(self): import os.path - from test import test_socket_ssl from test import test_timeout self.valid = False - if _platform in _expectations: - s = _expectations[_platform] + if sys.platform in _expectations: + s = _expectations[sys.platform] self.expected = set(s.split()) + # expected to be skipped on every platform, even Linux + self.expected.add('test_linuxaudiodev') + if not os.path.supports_unicode_filenames: self.expected.add('test_pep277') - if test_socket_ssl.skip_expected: - self.expected.add('test_socket_ssl') + try: + from test import test_socket_ssl + except ImportError: + pass + else: + if test_socket_ssl.skip_expected: + self.expected.add('test_socket_ssl') if test_timeout.skip_expected: self.expected.add('test_timeout') if sys.maxint == 9223372036854775807L: - self.expected.add('test_rgbimg') self.expected.add('test_imageop') if not sys.platform in ("mac", "darwin"): - MAC_ONLY = ["test_macostools", "test_macfs", "test_aepack", - "test_plistlib", "test_scriptpackages"] + MAC_ONLY = ["test_macos", "test_macostools", "test_aepack", + "test_plistlib", "test_scriptpackages", + "test_applesingle"] for skip in MAC_ONLY: self.expected.add(skip) + elif len(u'\0'.encode('unicode-internal')) == 4: + self.expected.add("test_macostools") + if sys.platform != "win32": + # test_sqlite is only reliable on Windows where the library + # is distributed with Python WIN_ONLY = ["test_unicode_file", "test_winreg", - "test_winsound"] + "test_winsound", "test_startfile", + "test_sqlite"] for skip in WIN_ONLY: self.expected.add(skip) - if test_support.is_jython: - if os._name != 'posix': - self.expected.update([ - 'test_grp', 'test_mhlib', 'test_posix', 'test_pwd', - 'test_signal']) - if os._name != 'nt': - self.expected.add('test_nt_paths_jy') + if sys.platform != 'irix': + IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl", + "test_gl", "test_imgfile"] + for skip in IRIX_ONLY: + self.expected.add(skip) + if sys.platform != 'sunos5': + self.expected.add('test_sunaudiodev') + self.expected.add('test_nis') + + if not sys.py3kwarning: + self.expected.add('test_py3kwarn') + self.valid = True def isvalid(self): @@ -1566,28 +1190,6 @@ assert self.isvalid() return self.expected - def __contains__(self, key): - return key in self.expected - -class _ExpectedFailures(_ExpectedSkips): - def __init__(self): - self.valid = False - if _platform in _failures: - s = _failures[_platform] - self.expected = set(s.split()) - self.valid = True - -def savememo(memo,good,bad,skipped): - f = open(memo,'w') - try: - for n,l in [('good',good),('bad',bad),('skipped',skipped)]: - print >>f,"%s = [" % n - for x in l: - print >>f," %r," % x - print >>f," ]" - finally: - f.close() - if __name__ == '__main__': # Remove regrtest.py's own directory from the module search path. This # prevents relative imports from working, and relative imports will screw @@ -1596,11 +1198,9 @@ # much of the testing framework relies on the globals in the # test.test_support module. mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0]))) - i = pathlen = len(sys.path) + i = len(sys.path) while i >= 0: i -= 1 if os.path.abspath(os.path.normpath(sys.path[i])) == mydir: del sys.path[i] - if len(sys.path) == pathlen: - print 'Could not find %r in sys.path to remove it' % mydir main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2011-03-14 01:52:08
|
Revision: 7229 http://jython.svn.sourceforge.net/jython/?rev=7229&view=rev Author: pjenvey Date: 2011-03-14 01:52:02 +0000 (Mon, 14 Mar 2011) Log Message: ----------- reapply all our changes Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2011-03-14 01:51:34 UTC (rev 7228) +++ trunk/jython/Lib/test/regrtest.py 2011-03-14 01:52:02 UTC (rev 7229) @@ -15,6 +15,8 @@ -s: single -- run only a single test (see below) -S: slow -- print the slowest 10 tests -r: random -- randomize test execution order +-m: memo -- save results to file +-j: junit-xml -- save results as JUnit XML to files in directory -f: fromfile -- read names of tests to run from a file (see below) -l: findleaks -- if GC is available detect tests that leak memory -u: use -- specify which special resource intensive tests to run @@ -26,6 +28,7 @@ -L: runleaks -- run the leaks(1) command just before exit -R: huntrleaks -- search for reference leaks (needs debug build, v. slow) -M: memlimit -- run very large memory-consuming tests +-e: expected -- run only tests that are expected to run and pass If non-option arguments are present, they are names for tests to run, unless -x is given, in which case they are names for tests not to run. @@ -169,6 +172,7 @@ newsoft = min(hard, max(soft, 1024*2048)) resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard)) +import test as _test from test import test_support RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', @@ -184,7 +188,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False, verbose2=False, print_slow=False): + runleaks=False, huntrleaks=False, verbose2=False, print_slow=False, + expected=False, memo=None, junit_xml=None): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -209,17 +214,19 @@ test_support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:wM:', + opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:wM:em:j:', ['help', 'verbose', 'quiet', 'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', 'huntrleaks=', 'verbose2', 'memlimit=', + 'expected', 'memo' ]) except getopt.error, msg: usage(2, msg) # Defaults + allran = True if use_resources is None: use_resources = [] for o, a in opts: @@ -234,6 +241,10 @@ verbose = 0 elif o in ('-x', '--exclude'): exclude = True + allran = False + elif o in ('-e', '--expected'): + expected = True + allran = False elif o in ('-s', '--single'): single = True elif o in ('-S', '--slow'): @@ -246,6 +257,10 @@ findleaks = True elif o in ('-L', '--runleaks'): runleaks = True + elif o in ('-m', '--memo'): + memo = a + elif o in ('-j', '--junit-xml'): + junit_xml = a elif o in ('-t', '--threshold'): import gc gc.set_threshold(int(a)) @@ -303,6 +318,8 @@ if findleaks: try: + if test_support.is_jython: + raise ImportError() import gc except ImportError: print 'No GC available, disabling findleaks.' @@ -337,6 +354,7 @@ # Strip .py extensions. if args: args = map(removepy, args) + allran = False if tests: tests = map(removepy, tests) @@ -360,8 +378,13 @@ test_times = [] test_support.verbose = verbose # Tell tests to be moderately quiet test_support.use_resources = use_resources + test_support.junit_xml_dir = junit_xml save_modules = sys.modules.keys() + skips = _ExpectedSkips() + failures = _ExpectedFailures() for test in tests: + if expected and (test in skips or test in failures): + continue if not quiet: print test sys.stdout.flush() @@ -374,7 +397,7 @@ else: try: ok = runtest(test, verbose, quiet, test_times, - testdir, huntrleaks) + testdir, huntrleaks, junit_xml) except KeyboardInterrupt: # print a newline separate from the ^C print @@ -402,6 +425,9 @@ for module in sys.modules.keys(): if module not in save_modules and module.startswith("test."): test_support.unload(module) + module = module[5:] + if hasattr(_test, module): + delattr(_test, module) if good and not quiet: if not bad and not skipped and len(good) > 1: @@ -412,27 +438,14 @@ print "10 slowest tests:" for time, test in test_times[:10]: print "%s: %.1fs" % (test, time) - if bad: - print count(len(bad), "test"), "failed:" - printlist(bad) + surprises = 0 if skipped and not quiet: print count(len(skipped), "test"), "skipped:" - printlist(skipped) + surprises += countsurprises(skips, skipped, 'skip', 'ran', allran, resource_denieds) + if bad: + print count(len(bad), "test"), "failed:" + surprises += countsurprises(failures, bad, 'fail', 'passed', allran, resource_denieds) - e = _ExpectedSkips() - plat = sys.platform - if e.isvalid(): - surprise = set(skipped) - e.getexpected() - set(resource_denieds) - if surprise: - print count(len(surprise), "skip"), \ - "unexpected on", plat + ":" - printlist(surprise) - else: - print "Those skips are all expected on", plat + "." - else: - print "Ask someone to teach regrtest.py about which tests are" - print "expected to get skipped on", plat + "." - if verbose2 and bad: print "Re-running failed tests in verbose mode" for test in bad: @@ -470,9 +483,12 @@ if runleaks: os.system("leaks %d" % os.getpid()) - sys.exit(len(bad) > 0) + if memo: + savememo(memo,good,bad,skipped) + sys.exit(surprises > 0) + STDTESTS = [ 'test_grammar', 'test_opcodes', @@ -512,7 +528,7 @@ return stdtests + tests def runtest(test, verbose, quiet, test_times, - testdir=None, huntrleaks=False): + testdir=None, huntrleaks=False, junit_xml=None): """Run a single test. test -- the name of the test @@ -531,12 +547,12 @@ try: return runtest_inner(test, verbose, quiet, test_times, - testdir, huntrleaks) + testdir, huntrleaks, junit_xml) finally: cleanup_test_droppings(test, verbose) def runtest_inner(test, verbose, quiet, test_times, - testdir=None, huntrleaks=False): + testdir=None, huntrleaks=False, junit_xml_dir=None): test_support.unload(test) if not testdir: testdir = findtestdir() @@ -545,8 +561,15 @@ else: capture_stdout = cStringIO.StringIO() + from test.junit_xml import Tee, write_direct_test try: save_stdout = sys.stdout + + indirect_test = None + if junit_xml_dir: + save_stderr = sys.stderr + sys.stdout = stdout = Tee(sys.stdout) + sys.stderr = stderr = Tee(sys.stderr) try: if capture_stdout: sys.stdout = capture_stdout @@ -562,29 +585,54 @@ # being imported. For tests based on unittest or doctest, # explicitly invoke their test_main() function (if it exists). indirect_test = getattr(the_module, "test_main", None) + test_time = None if indirect_test is not None: indirect_test() + elif junit_xml_dir: + test_time = time.time() - start_time + write_direct_test(junit_xml_dir, abstest, test_time, + stdout=stdout.getvalue(), + stderr=stderr.getvalue()) if huntrleaks: dash_R(the_module, test, indirect_test, huntrleaks) - test_time = time.time() - start_time + if test_time is None: + test_time = time.time() - start_time test_times.append((test_time, test)) finally: sys.stdout = save_stdout + if junit_xml_dir: + sys.stderr = save_stderr + test_time = time.time() - start_time except test_support.ResourceDenied, msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() + if junit_xml_dir: + write_direct_test(junit_xml_dir, abstest, test_time, + 'skipped', sys.exc_info(), + stdout=stdout.getvalue(), + stderr=stderr.getvalue()) return -2 except (ImportError, test_support.TestSkipped), msg: if not quiet: print test, "skipped --", msg sys.stdout.flush() + if junit_xml_dir: + write_direct_test(junit_xml_dir, abstest, test_time, + 'skipped', sys.exc_info(), + stdout=stdout.getvalue(), + stderr=stderr.getvalue()) return -1 except KeyboardInterrupt: raise except test_support.TestFailed, msg: print "test", test, "failed --", msg sys.stdout.flush() + if junit_xml_dir and indirect_test is None: + write_direct_test(junit_xml_dir, abstest, test_time, + 'failure', sys.exc_info(), + stdout=stdout.getvalue(), + stderr=stderr.getvalue()) return 0 except: type, value = sys.exc_info()[:2] @@ -593,6 +641,11 @@ if verbose: traceback.print_exc(file=sys.stdout) sys.stdout.flush() + if junit_xml_dir and indirect_test is None: + write_direct_test(junit_xml_dir, abstest, test_time, + 'error', sys.exc_info(), + stdout=stdout.getvalue(), + stderr=stderr.getvalue()) return 0 else: # Except in verbose mode, tests should not print anything @@ -767,6 +820,23 @@ print fill(' '.join(str(elt) for elt in sorted(x)), width, initial_indent=blanks, subsequent_indent=blanks) +def countsurprises(expected, actual, action, antiaction, allran, resource_denieds): + """returns the number of items in actual that aren't in expected.""" + printlist(actual) + if not expected.isvalid(): + print "Ask someone to teach regrtest.py about which tests are" + print "expected to %s on %s." % (action, sys.platform) + return 1#Surprising not to know what to expect.... + good_surprise = expected.getexpected() - set(actual) + if allran and good_surprise: + print count(len(good_surprise), 'test'), antiaction, 'unexpectedly:' + printlist(good_surprise) + bad_surprise = set(actual) - expected.getexpected() - set(resource_denieds) + if bad_surprise: + print count(len(bad_surprise), action), "unexpected:" + printlist(bad_surprise) + return len(bad_surprise) + # Map sys.platform to a string containing the basenames of tests # expected to be skipped on that platform. # @@ -1107,20 +1177,144 @@ test_tcl test_multiprocessing """, + 'java': + """ + test__locale + test__rawffi + test_aepack + test_al + test_applesingle + test_audioop + test_bsddb + test_bsddb185 + test_bsddb3 + test_bz2 + test_cProfile + test_capi + test_cd + test_cl + test_commands + test_crypt + test_ctypes + test_curses + test_dbm + test_dl + test_email_codecs + test_fcntl + test_fork1 + test_gdbm + test_getargs2 + test_gl + test_hotshot + test_imageop + test_imgfile + test_ioctl + test_largefile + test_linuxaudiodev + test_locale + test_longexp + test_macfs + test_macostools + test_mmap + test_nis + test_normalization + test_openpty + test_ossaudiodev + test_parser + test_plistlib + test_poll + test_pty + test_resource + test_rgbimg + test_scriptpackages + test_socket_ssl + test_socketserver + test_sqlite + test_startfile + test_strop + test_structmembers + test_sunaudiodev + test_sundry + test_symtable + test_tcl + test_timeout + test_unicode_file + test_wait3 + test_wait4 + test_wave + test_winreg + test_winsound + test_zipfile64 + + test_gzip + test_ftplib + test_logging + test_poplib + test_pydoc + test_queue + test_smtplib + test_telnetlib + """ } _expectations['freebsd5'] = _expectations['freebsd4'] _expectations['freebsd6'] = _expectations['freebsd4'] _expectations['freebsd7'] = _expectations['freebsd4'] _expectations['freebsd8'] = _expectations['freebsd4'] +_failures = { + 'java': + """ + test_codecencodings_cn + test_codecencodings_hk + test_codecencodings_jp + test_codecencodings_kr + test_codecencodings_tw + test_codecmaps_cn + test_codecmaps_hk + test_codecmaps_jp + test_codecmaps_kr + test_codecmaps_tw + test_compiler + test_dis + test_dummy_threading + test_eof + test_frozen + test_gc + test_import + test_iterlen + test_multibytecodec + test_multibytecodec_support + test_peepholer + test_pyclbr + test_pyexpat + test_stringprep + test_threadsignals + test_transformer + test_ucn + test_unicodedata + test_zipimport + """, +} + +_platform = sys.platform +if _platform[:4] == 'java': + _platform = 'java' + if os._name == 'nt': + # XXX: Omitted for now because it fails so miserably and ruins + # other tests + _failures['java'] += '\ntest_mailbox' + if ' ' in sys.executable: + # http://bugs.python.org/issue1559298 + _failures['java'] += '\ntest_popen' + class _ExpectedSkips: def __init__(self): import os.path from test import test_timeout self.valid = False - if sys.platform in _expectations: - s = _expectations[sys.platform] + if _platform in _expectations: + s = _expectations[_platform] self.expected = set(s.split()) # expected to be skipped on every platform, even Linux @@ -1175,6 +1369,14 @@ if not sys.py3kwarning: self.expected.add('test_py3kwarn') + if test_support.is_jython: + if os._name != 'posix': + self.expected.update([ + 'test_grp', 'test_mhlib', 'test_posix', 'test_pwd', + 'test_signal']) + if os._name != 'nt': + self.expected.add('test_nt_paths_jy') + self.valid = True def isvalid(self): @@ -1190,6 +1392,28 @@ assert self.isvalid() return self.expected + def __contains__(self, key): + return key in self.expected + +class _ExpectedFailures(_ExpectedSkips): + def __init__(self): + self.valid = False + if _platform in _failures: + s = _failures[_platform] + self.expected = set(s.split()) + self.valid = True + +def savememo(memo,good,bad,skipped): + f = open(memo,'w') + try: + for n,l in [('good',good),('bad',bad),('skipped',skipped)]: + print >>f,"%s = [" % n + for x in l: + print >>f," %r," % x + print >>f," ]" + finally: + f.close() + if __name__ == '__main__': # Remove regrtest.py's own directory from the module search path. This # prevents relative imports from working, and relative imports will screw This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |