symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/regrtest.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 #! /usr/bin/env python
       
     2 
       
     3 """Regression test.
       
     4 
       
     5 This will find all modules whose name is "test_*" in the test
       
     6 directory, and run them.  Various command line options provide
       
     7 additional facilities.
       
     8 
       
     9 Command line options:
       
    10 
       
    11 -v: verbose    -- run tests in verbose mode with output to stdout
       
    12 -w: verbose2   -- re-run failed tests in verbose mode
       
    13 -q: quiet      -- don't print anything except if a test fails
       
    14 -x: exclude    -- arguments are tests to *exclude*
       
    15 -s: single     -- run only a single test (see below)
       
    16 -S: slow       -- print the slowest 10 tests
       
    17 -r: random     -- randomize test execution order
       
    18 -f: fromfile   -- read names of tests to run from a file (see below)
       
    19 -l: findleaks  -- if GC is available detect tests that leak memory
       
    20 -u: use        -- specify which special resource intensive tests to run
       
    21 -h: help       -- print this text and exit
       
    22 -t: threshold  -- call gc.set_threshold(N)
       
    23 -T: coverage   -- turn on code coverage using the trace module
       
    24 -D: coverdir   -- Directory where coverage files are put
       
    25 -N: nocoverdir -- Put coverage files alongside modules
       
    26 -L: runleaks   -- run the leaks(1) command just before exit
       
    27 -R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
       
    28 -M: memlimit   -- run very large memory-consuming tests
       
    29 
       
    30 If non-option arguments are present, they are names for tests to run,
       
    31 unless -x is given, in which case they are names for tests not to run.
       
    32 If no test names are given, all tests are run.
       
    33 
       
    34 -T turns on code coverage tracing with the trace module.
       
    35 
       
    36 -D specifies the directory where coverage files are put.
       
    37 
       
    38 -N Put coverage files alongside modules.
       
    39 
       
    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
       
    46 /tmp).
       
    47 
       
    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.
       
    52 
       
    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.
       
    56 
       
    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 ::'.
       
    64 
       
    65 -M runs tests that require an exorbitant amount of memory. These tests
       
    66 typically try to ascertain containers keep working when containing more than
       
    67 2 billion objects, which only works on 64-bit systems. There are also some
       
    68 tests that try to exhaust the address space of the process, which only makes
       
    69 sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
       
    70 which is a string in the form of '2.5Gb', determines howmuch memory the
       
    71 tests will limit themselves to (but they may go slightly over.) The number
       
    72 shouldn't be more memory than the machine has (including swap memory). You
       
    73 should also keep in mind that swap memory is generally much, much slower
       
    74 than RAM, and setting memlimit to all available RAM or higher will heavily
       
    75 tax the machine. On the other hand, it is no use running these tests with a
       
    76 limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
       
    77 to use more than memlimit memory will be skipped. The big-memory tests
       
    78 generally run very, very long.
       
    79 
       
    80 -u is used to specify which special resource intensive tests to run,
       
    81 such as those requiring large file support or network connectivity.
       
    82 The argument is a comma-separated list of words indicating the
       
    83 resources to test.  Currently only the following are defined:
       
    84 
       
    85     all -       Enable all special resources.
       
    86 
       
    87     audio -     Tests that use the audio device.  (There are known
       
    88                 cases of broken audio drivers that can crash Python or
       
    89                 even the Linux kernel.)
       
    90 
       
    91     curses -    Tests that use curses and will modify the terminal's
       
    92                 state and output modes.
       
    93 
       
    94     lib2to3 -   Run the tests for 2to3 (They take a while.)
       
    95 
       
    96     largefile - It is okay to run some test that may create huge
       
    97                 files.  These tests can take a long time and may
       
    98                 consume >2GB of disk space temporarily.
       
    99 
       
   100     network -   It is okay to run tests that use external network
       
   101                 resource, e.g. testing SSL support for sockets.
       
   102 
       
   103     bsddb -     It is okay to run the bsddb testsuite, which takes
       
   104                 a long time to complete.
       
   105 
       
   106     decimal -   Test the decimal module against a large suite that
       
   107                 verifies compliance with standards.
       
   108 
       
   109     compiler -  Test the compiler package by compiling all the source
       
   110                 in the standard library and test suite.  This takes
       
   111                 a long time.  Enabling this resource also allows
       
   112                 test_tokenize to verify round-trip lexing on every
       
   113                 file in the test library.
       
   114 
       
   115     subprocess  Run all tests for the subprocess module.
       
   116 
       
   117     urlfetch -  It is okay to download files required on testing.
       
   118 
       
   119 To enable all resources except one, use '-uall,-<resource>'.  For
       
   120 example, to run all the tests except for the bsddb tests, give the
       
   121 option '-uall,-bsddb'.
       
   122 """
       
   123 
       
   124 import cStringIO
       
   125 import getopt
       
   126 import os
       
   127 import random
       
   128 import re
       
   129 import sys
       
   130 import time
       
   131 import traceback
       
   132 import warnings
       
   133 
       
   134 # I see no other way to suppress these warnings;
       
   135 # putting them in test_grammar.py has no effect:
       
   136 warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
       
   137                         ".*test.test_grammar$")
       
   138 if sys.maxint > 0x7fffffff:
       
   139     # Also suppress them in <string>, because for 64-bit platforms,
       
   140     # that's where test_grammar.py hides them.
       
   141     warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
       
   142                             "<string>")
       
   143 
       
   144 # Ignore ImportWarnings that only occur in the source tree,
       
   145 # (because of modules with the same name as source-directories in Modules/)
       
   146 for mod in ("ctypes", "gzip", "zipfile", "tarfile", "encodings.zlib_codec",
       
   147             "test.test_zipimport", "test.test_zlib", "test.test_zipfile",
       
   148             "test.test_codecs", "test.string_tests"):
       
   149     warnings.filterwarnings(module=".*%s$" % (mod,),
       
   150                             action="ignore", category=ImportWarning)
       
   151 
       
   152 # MacOSX (a.k.a. Darwin) has a default stack size that is too small
       
   153 # for deeply recursive regular expressions.  We see this as crashes in
       
   154 # the Python test suite when running test_re.py and test_sre.py.  The
       
   155 # fix is to set the stack limit to 2048.
       
   156 # This approach may also be useful for other Unixy platforms that
       
   157 # suffer from small default stack limits.
       
   158 if sys.platform == 'darwin':
       
   159     try:
       
   160         import resource
       
   161     except ImportError:
       
   162         pass
       
   163     else:
       
   164         soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
       
   165         newsoft = min(hard, max(soft, 1024*2048))
       
   166         resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
       
   167 
       
   168 from test import test_support
       
   169 
       
   170 RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
       
   171                   'decimal', 'compiler', 'subprocess', 'urlfetch')
       
   172 
       
   173 
       
   174 def usage(code, msg=''):
       
   175     print __doc__
       
   176     if msg: print msg
       
   177     sys.exit(code)
       
   178 
       
   179 
       
   180 def main(tests=None, testdir=None, verbose=0, quiet=False,
       
   181          exclude=False, single=False, randomize=False, fromfile=None,
       
   182          findleaks=False, use_resources=None, trace=False, coverdir='coverage',
       
   183          runleaks=False, huntrleaks=False, verbose2=False, print_slow=False):
       
   184     """Execute a test suite.
       
   185 
       
   186     This also parses command-line options and modifies its behavior
       
   187     accordingly.
       
   188 
       
   189     tests -- a list of strings containing test names (optional)
       
   190     testdir -- the directory in which to look for tests (optional)
       
   191 
       
   192     Users other than the Python test suite will certainly want to
       
   193     specify testdir; if it's omitted, the directory containing the
       
   194     Python test suite is searched for.
       
   195 
       
   196     If the tests argument is omitted, the tests listed on the
       
   197     command-line will be used.  If that's empty, too, then all *.py
       
   198     files beginning with test_ will be used.
       
   199 
       
   200     The other default arguments (verbose, quiet, exclude,
       
   201     single, randomize, findleaks, use_resources, trace, coverdir, and
       
   202     print_slow) allow programmers calling main() directly to set the
       
   203     values that would normally be set by flags on the command line.
       
   204     """
       
   205 
       
   206     test_support.record_original_stdout(sys.stdout)
       
   207     try:
       
   208         opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsSrf:lu:t:TD:NLR:wM:',
       
   209                                    ['help', 'verbose', 'quiet', 'exclude',
       
   210                                     'single', 'slow', 'random', 'fromfile',
       
   211                                     'findleaks', 'use=', 'threshold=', 'trace',
       
   212                                     'coverdir=', 'nocoverdir', 'runleaks',
       
   213                                     'huntrleaks=', 'verbose2', 'memlimit=',
       
   214                                     ])
       
   215     except getopt.error, msg:
       
   216         usage(2, msg)
       
   217 
       
   218     # Defaults
       
   219     if use_resources is None:
       
   220         use_resources = []
       
   221     for o, a in opts:
       
   222         if o in ('-h', '--help'):
       
   223             usage(0)
       
   224         elif o in ('-v', '--verbose'):
       
   225             verbose += 1
       
   226         elif o in ('-w', '--verbose2'):
       
   227             verbose2 = True
       
   228         elif o in ('-q', '--quiet'):
       
   229             quiet = True;
       
   230             verbose = 0
       
   231         elif o in ('-x', '--exclude'):
       
   232             exclude = True
       
   233         elif o in ('-s', '--single'):
       
   234             single = True
       
   235         elif o in ('-S', '--slow'):
       
   236             print_slow = True
       
   237         elif o in ('-r', '--randomize'):
       
   238             randomize = True
       
   239         elif o in ('-f', '--fromfile'):
       
   240             fromfile = a
       
   241         elif o in ('-l', '--findleaks'):
       
   242             findleaks = True
       
   243         elif o in ('-L', '--runleaks'):
       
   244             runleaks = True
       
   245         elif o in ('-t', '--threshold'):
       
   246             import gc
       
   247             gc.set_threshold(int(a))
       
   248         elif o in ('-T', '--coverage'):
       
   249             trace = True
       
   250         elif o in ('-D', '--coverdir'):
       
   251             coverdir = os.path.join(os.getcwd(), a)
       
   252         elif o in ('-N', '--nocoverdir'):
       
   253             coverdir = None
       
   254         elif o in ('-R', '--huntrleaks'):
       
   255             huntrleaks = a.split(':')
       
   256             if len(huntrleaks) != 3:
       
   257                 print a, huntrleaks
       
   258                 usage(2, '-R takes three colon-separated arguments')
       
   259             if len(huntrleaks[0]) == 0:
       
   260                 huntrleaks[0] = 5
       
   261             else:
       
   262                 huntrleaks[0] = int(huntrleaks[0])
       
   263             if len(huntrleaks[1]) == 0:
       
   264                 huntrleaks[1] = 4
       
   265             else:
       
   266                 huntrleaks[1] = int(huntrleaks[1])
       
   267             if len(huntrleaks[2]) == 0:
       
   268                 huntrleaks[2] = "reflog.txt"
       
   269         elif o in ('-M', '--memlimit'):
       
   270             test_support.set_memlimit(a)
       
   271         elif o in ('-u', '--use'):
       
   272             u = [x.lower() for x in a.split(',')]
       
   273             for r in u:
       
   274                 if r == 'all':
       
   275                     use_resources[:] = RESOURCE_NAMES
       
   276                     continue
       
   277                 remove = False
       
   278                 if r[0] == '-':
       
   279                     remove = True
       
   280                     r = r[1:]
       
   281                 if r not in RESOURCE_NAMES:
       
   282                     usage(1, 'Invalid -u/--use option: ' + a)
       
   283                 if remove:
       
   284                     if r in use_resources:
       
   285                         use_resources.remove(r)
       
   286                 elif r not in use_resources:
       
   287                     use_resources.append(r)
       
   288     if single and fromfile:
       
   289         usage(2, "-s and -f don't go together!")
       
   290 
       
   291     good = []
       
   292     bad = []
       
   293     skipped = []
       
   294     resource_denieds = []
       
   295 
       
   296     if findleaks:
       
   297         try:
       
   298             import gc
       
   299         except ImportError:
       
   300             print 'No GC available, disabling findleaks.'
       
   301             findleaks = False
       
   302         else:
       
   303             # Uncomment the line below to report garbage that is not
       
   304             # freeable by reference counting alone.  By default only
       
   305             # garbage that is not collectable by the GC is reported.
       
   306             #gc.set_debug(gc.DEBUG_SAVEALL)
       
   307             found_garbage = []
       
   308 
       
   309     if single:
       
   310         from tempfile import gettempdir
       
   311         filename = os.path.join(gettempdir(), 'pynexttest')
       
   312         try:
       
   313             fp = open(filename, 'r')
       
   314             next = fp.read().strip()
       
   315             tests = [next]
       
   316             fp.close()
       
   317         except IOError:
       
   318             pass
       
   319 
       
   320     if fromfile:
       
   321         tests = []
       
   322         fp = open(fromfile)
       
   323         for line in fp:
       
   324             guts = line.split() # assuming no test has whitespace in its name
       
   325             if guts and not guts[0].startswith('#'):
       
   326                 tests.extend(guts)
       
   327         fp.close()
       
   328 
       
   329     # Strip .py extensions.
       
   330     if args:
       
   331         args = map(removepy, args)
       
   332     if tests:
       
   333         tests = map(removepy, tests)
       
   334 
       
   335     stdtests = STDTESTS[:]
       
   336     nottests = NOTTESTS[:]
       
   337     if exclude:
       
   338         for arg in args:
       
   339             if arg in stdtests:
       
   340                 stdtests.remove(arg)
       
   341         nottests[:0] = args
       
   342         args = []
       
   343     tests = tests or args or findtests(testdir, stdtests, nottests)
       
   344     if single:
       
   345         tests = tests[:1]
       
   346     if randomize:
       
   347         random.shuffle(tests)
       
   348     if trace:
       
   349         import trace
       
   350         tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
       
   351                              trace=False, count=True)
       
   352     test_times = []
       
   353     test_support.verbose = verbose      # Tell tests to be moderately quiet
       
   354     test_support.use_resources = use_resources
       
   355     save_modules = sys.modules.keys()
       
   356     for test in tests:
       
   357         if not quiet:
       
   358             print test
       
   359             sys.stdout.flush()
       
   360         if trace:
       
   361             # If we're tracing code coverage, then we don't exit with status
       
   362             # if on a false return value from main.
       
   363             tracer.runctx('runtest(test, verbose, quiet,'
       
   364                           '        test_times, testdir)',
       
   365                           globals=globals(), locals=vars())
       
   366         else:
       
   367             try:
       
   368                 ok = runtest(test, verbose, quiet, test_times,
       
   369                              testdir, huntrleaks)
       
   370             except KeyboardInterrupt:
       
   371                 # print a newline separate from the ^C
       
   372                 print
       
   373                 break
       
   374             except:
       
   375                 raise
       
   376             if ok > 0:
       
   377                 good.append(test)
       
   378             elif ok == 0:
       
   379                 bad.append(test)
       
   380             else:
       
   381                 skipped.append(test)
       
   382                 if ok == -2:
       
   383                     resource_denieds.append(test)
       
   384         if findleaks:
       
   385             gc.collect()
       
   386             if gc.garbage:
       
   387                 print "Warning: test created", len(gc.garbage),
       
   388                 print "uncollectable object(s)."
       
   389                 # move the uncollectable objects somewhere so we don't see
       
   390                 # them again
       
   391                 found_garbage.extend(gc.garbage)
       
   392                 del gc.garbage[:]
       
   393         # Unload the newly imported modules (best effort finalization)
       
   394         for module in sys.modules.keys():
       
   395             if module not in save_modules and module.startswith("test."):
       
   396                 test_support.unload(module)
       
   397 
       
   398     # The lists won't be sorted if running with -r
       
   399     good.sort()
       
   400     bad.sort()
       
   401     skipped.sort()
       
   402 
       
   403     if good and not quiet:
       
   404         if not bad and not skipped and len(good) > 1:
       
   405             print "All",
       
   406         print count(len(good), "test"), "OK."
       
   407     if print_slow:
       
   408         test_times.sort(reverse=True)
       
   409         print "10 slowest tests:"
       
   410         for time, test in test_times[:10]:
       
   411             print "%s: %.1fs" % (test, time)
       
   412     if bad:
       
   413         print count(len(bad), "test"), "failed:"
       
   414         printlist(bad)
       
   415     if skipped and not quiet:
       
   416         print count(len(skipped), "test"), "skipped:"
       
   417         printlist(skipped)
       
   418 
       
   419         e = _ExpectedSkips()
       
   420         plat = sys.platform
       
   421         if e.isvalid():
       
   422             surprise = set(skipped) - e.getexpected() - set(resource_denieds)
       
   423             if surprise:
       
   424                 print count(len(surprise), "skip"), \
       
   425                       "unexpected on", plat + ":"
       
   426                 printlist(surprise)
       
   427             else:
       
   428                 print "Those skips are all expected on", plat + "."
       
   429         else:
       
   430             print "Ask someone to teach regrtest.py about which tests are"
       
   431             print "expected to get skipped on", plat + "."
       
   432 
       
   433     if verbose2 and bad:
       
   434         print "Re-running failed tests in verbose mode"
       
   435         for test in bad:
       
   436             print "Re-running test %r in verbose mode" % test
       
   437             sys.stdout.flush()
       
   438             try:
       
   439                 test_support.verbose = True
       
   440                 ok = runtest(test, True, quiet, test_times, testdir,
       
   441                              huntrleaks)
       
   442             except KeyboardInterrupt:
       
   443                 # print a newline separate from the ^C
       
   444                 print
       
   445                 break
       
   446             except:
       
   447                 raise
       
   448 
       
   449     if single:
       
   450         alltests = findtests(testdir, stdtests, nottests)
       
   451         for i in range(len(alltests)):
       
   452             if tests[0] == alltests[i]:
       
   453                 if i == len(alltests) - 1:
       
   454                     os.unlink(filename)
       
   455                 else:
       
   456                     fp = open(filename, 'w')
       
   457                     fp.write(alltests[i+1] + '\n')
       
   458                     fp.close()
       
   459                 break
       
   460         else:
       
   461             os.unlink(filename)
       
   462 
       
   463     if trace:
       
   464         r = tracer.results()
       
   465         r.write_results(show_missing=True, summary=True, coverdir=coverdir)
       
   466 
       
   467     if runleaks:
       
   468         os.system("leaks %d" % os.getpid())
       
   469 
       
   470     sys.exit(len(bad) > 0)
       
   471 
       
   472 
       
   473 STDTESTS = [
       
   474     'test_grammar',
       
   475     'test_opcodes',
       
   476     'test_dict',
       
   477     'test_builtin',
       
   478     'test_exceptions',
       
   479     'test_types',
       
   480     'test_unittest',
       
   481     'test_doctest',
       
   482     'test_doctest2',
       
   483    ]
       
   484 
       
   485 NOTTESTS = [
       
   486     'test_support',
       
   487     'test_future1',
       
   488     'test_future2',
       
   489     ]
       
   490 
       
   491 def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
       
   492     """Return a list of all applicable test modules."""
       
   493     if not testdir: testdir = findtestdir()
       
   494     names = os.listdir(testdir)
       
   495     tests = []
       
   496     for name in names:
       
   497         if name[:5] == "test_" and name[-3:] == os.extsep+"py":
       
   498             modname = name[:-3]
       
   499             if modname not in stdtests and modname not in nottests:
       
   500                 tests.append(modname)
       
   501     tests.sort()
       
   502     return stdtests + tests
       
   503 
       
   504 def runtest(test, verbose, quiet, test_times,
       
   505             testdir=None, huntrleaks=False):
       
   506     """Run a single test.
       
   507 
       
   508     test -- the name of the test
       
   509     verbose -- if true, print more messages
       
   510     quiet -- if true, don't print 'skipped' messages (probably redundant)
       
   511     test_times -- a list of (time, test_name) pairs
       
   512     testdir -- test directory
       
   513     huntrleaks -- run multiple times to test for leaks; requires a debug
       
   514                   build; a triple corresponding to -R's three arguments
       
   515     Return:
       
   516         -2  test skipped because resource denied
       
   517         -1  test skipped for some other reason
       
   518          0  test failed
       
   519          1  test passed
       
   520     """
       
   521 
       
   522     try:
       
   523         return runtest_inner(test, verbose, quiet, test_times,
       
   524                              testdir, huntrleaks)
       
   525     finally:
       
   526         cleanup_test_droppings(test, verbose)
       
   527 
       
   528 def runtest_inner(test, verbose, quiet, test_times,
       
   529                   testdir=None, huntrleaks=False):
       
   530     test_support.unload(test)
       
   531     if not testdir:
       
   532         testdir = findtestdir()
       
   533     if verbose:
       
   534         capture_stdout = None
       
   535     else:
       
   536         capture_stdout = cStringIO.StringIO()
       
   537 
       
   538     try:
       
   539         save_stdout = sys.stdout
       
   540         try:
       
   541             if capture_stdout:
       
   542                 sys.stdout = capture_stdout
       
   543             if test.startswith('test.'):
       
   544                 abstest = test
       
   545             else:
       
   546                 # Always import it from the test package
       
   547                 abstest = 'test.' + test
       
   548             start_time = time.time()
       
   549             the_package = __import__(abstest, globals(), locals(), [])
       
   550             the_module = getattr(the_package, test)
       
   551             # Old tests run to completion simply as a side-effect of
       
   552             # being imported.  For tests based on unittest or doctest,
       
   553             # explicitly invoke their test_main() function (if it exists).
       
   554             indirect_test = getattr(the_module, "test_main", None)
       
   555             if indirect_test is not None:
       
   556                 indirect_test()
       
   557             if huntrleaks:
       
   558                 dash_R(the_module, test, indirect_test, huntrleaks)
       
   559             test_time = time.time() - start_time
       
   560             test_times.append((test_time, test))
       
   561         finally:
       
   562             sys.stdout = save_stdout
       
   563     except test_support.ResourceDenied, msg:
       
   564         if not quiet:
       
   565             print test, "skipped --", msg
       
   566             sys.stdout.flush()
       
   567         return -2
       
   568     except (ImportError, test_support.TestSkipped), msg:
       
   569         if not quiet:
       
   570             print test, "skipped --", msg
       
   571             sys.stdout.flush()
       
   572         return -1
       
   573     except KeyboardInterrupt:
       
   574         raise
       
   575     except test_support.TestFailed, msg:
       
   576         print "test", test, "failed --", msg
       
   577         sys.stdout.flush()
       
   578         return 0
       
   579     except:
       
   580         type, value = sys.exc_info()[:2]
       
   581         print "test", test, "crashed --", str(type) + ":", value
       
   582         sys.stdout.flush()
       
   583         if verbose:
       
   584             traceback.print_exc(file=sys.stdout)
       
   585             sys.stdout.flush()
       
   586         return 0
       
   587     else:
       
   588         # Except in verbose mode, tests should not print anything
       
   589         if verbose or huntrleaks:
       
   590             return 1
       
   591         output = capture_stdout.getvalue()
       
   592         if not output:
       
   593             return 1
       
   594         print "test", test, "produced unexpected output:"
       
   595         print "*" * 70
       
   596         print output
       
   597         print "*" * 70
       
   598         sys.stdout.flush()
       
   599         return 0
       
   600 
       
   601 def cleanup_test_droppings(testname, verbose):
       
   602     import shutil
       
   603 
       
   604     # Try to clean up junk commonly left behind.  While tests shouldn't leave
       
   605     # any files or directories behind, when a test fails that can be tedious
       
   606     # for it to arrange.  The consequences can be especially nasty on Windows,
       
   607     # since if a test leaves a file open, it cannot be deleted by name (while
       
   608     # there's nothing we can do about that here either, we can display the
       
   609     # name of the offending test, which is a real help).
       
   610     for name in (test_support.TESTFN,
       
   611                  "db_home",
       
   612                 ):
       
   613         if not os.path.exists(name):
       
   614             continue
       
   615 
       
   616         if os.path.isdir(name):
       
   617             kind, nuker = "directory", shutil.rmtree
       
   618         elif os.path.isfile(name):
       
   619             kind, nuker = "file", os.unlink
       
   620         else:
       
   621             raise SystemError("os.path says %r exists but is neither "
       
   622                               "directory nor file" % name)
       
   623 
       
   624         if verbose:
       
   625             print "%r left behind %s %r" % (testname, kind, name)
       
   626         try:
       
   627             nuker(name)
       
   628         except Exception, msg:
       
   629             print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
       
   630                 "removed: %s" % (testname, kind, name, msg))
       
   631 
       
   632 def dash_R(the_module, test, indirect_test, huntrleaks):
       
   633     # This code is hackish and inelegant, but it seems to do the job.
       
   634     import copy_reg, _abcoll, io
       
   635 
       
   636     if not hasattr(sys, 'gettotalrefcount'):
       
   637         raise Exception("Tracking reference leaks requires a debug build "
       
   638                         "of Python")
       
   639 
       
   640     # Save current values for dash_R_cleanup() to restore.
       
   641     fs = warnings.filters[:]
       
   642     ps = copy_reg.dispatch_table.copy()
       
   643     pic = sys.path_importer_cache.copy()
       
   644     abcs = {}
       
   645     modules = _abcoll, io
       
   646     for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
       
   647         # XXX isinstance(abc, ABCMeta) leads to infinite recursion
       
   648         if not hasattr(abc, '_abc_registry'):
       
   649             continue
       
   650         for obj in abc.__subclasses__() + [abc]:
       
   651             abcs[obj] = obj._abc_registry.copy()
       
   652 
       
   653     if indirect_test:
       
   654         def run_the_test():
       
   655             indirect_test()
       
   656     else:
       
   657         def run_the_test():
       
   658             reload(the_module)
       
   659 
       
   660     deltas = []
       
   661     nwarmup, ntracked, fname = huntrleaks
       
   662     repcount = nwarmup + ntracked
       
   663     print >> sys.stderr, "beginning", repcount, "repetitions"
       
   664     print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
       
   665     dash_R_cleanup(fs, ps, pic, abcs)
       
   666     for i in range(repcount):
       
   667         rc = sys.gettotalrefcount()
       
   668         run_the_test()
       
   669         sys.stderr.write('.')
       
   670         dash_R_cleanup(fs, ps, pic, abcs)
       
   671         if i >= nwarmup:
       
   672             deltas.append(sys.gettotalrefcount() - rc - 2)
       
   673     print >> sys.stderr
       
   674     if any(deltas):
       
   675         msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
       
   676         print >> sys.stderr, msg
       
   677         refrep = open(fname, "a")
       
   678         print >> refrep, msg
       
   679         refrep.close()
       
   680 
       
   681 def dash_R_cleanup(fs, ps, pic, abcs):
       
   682     import gc, copy_reg
       
   683     import _strptime, linecache
       
   684     dircache = test_support.import_module('dircache', deprecated=True)
       
   685     import urlparse, urllib, urllib2, mimetypes, doctest
       
   686     import struct, filecmp
       
   687     from distutils.dir_util import _path_created
       
   688 
       
   689     # Clear the warnings registry, so they can be displayed again
       
   690     for mod in sys.modules.values():
       
   691         if hasattr(mod, '__warningregistry__'):
       
   692             del mod.__warningregistry__
       
   693 
       
   694     # Restore some original values.
       
   695     warnings.filters[:] = fs
       
   696     copy_reg.dispatch_table.clear()
       
   697     copy_reg.dispatch_table.update(ps)
       
   698     sys.path_importer_cache.clear()
       
   699     sys.path_importer_cache.update(pic)
       
   700 
       
   701     # clear type cache
       
   702     sys._clear_type_cache()
       
   703 
       
   704     # Clear ABC registries, restoring previously saved ABC registries.
       
   705     for abc, registry in abcs.items():
       
   706         abc._abc_registry = registry.copy()
       
   707         abc._abc_cache.clear()
       
   708         abc._abc_negative_cache.clear()
       
   709 
       
   710     # Clear assorted module caches.
       
   711     _path_created.clear()
       
   712     re.purge()
       
   713     _strptime._regex_cache.clear()
       
   714     urlparse.clear_cache()
       
   715     urllib.urlcleanup()
       
   716     urllib2.install_opener(None)
       
   717     dircache.reset()
       
   718     linecache.clearcache()
       
   719     mimetypes._default_mime_types()
       
   720     filecmp._cache.clear()
       
   721     struct._clearcache()
       
   722     doctest.master = None
       
   723 
       
   724     # Collect cyclic trash.
       
   725     gc.collect()
       
   726 
       
   727 def findtestdir():
       
   728     if __name__ == '__main__':
       
   729         file = sys.argv[0]
       
   730     else:
       
   731         file = __file__
       
   732     testdir = os.path.dirname(file) or os.curdir
       
   733     return testdir
       
   734 
       
   735 def removepy(name):
       
   736     if name.endswith(os.extsep + "py"):
       
   737         name = name[:-3]
       
   738     return name
       
   739 
       
   740 def count(n, word):
       
   741     if n == 1:
       
   742         return "%d %s" % (n, word)
       
   743     else:
       
   744         return "%d %ss" % (n, word)
       
   745 
       
   746 def printlist(x, width=70, indent=4):
       
   747     """Print the elements of iterable x to stdout.
       
   748 
       
   749     Optional arg width (default 70) is the maximum line length.
       
   750     Optional arg indent (default 4) is the number of blanks with which to
       
   751     begin each line.
       
   752     """
       
   753 
       
   754     from textwrap import fill
       
   755     blanks = ' ' * indent
       
   756     print fill(' '.join(map(str, x)), width,
       
   757                initial_indent=blanks, subsequent_indent=blanks)
       
   758 
       
   759 # Map sys.platform to a string containing the basenames of tests
       
   760 # expected to be skipped on that platform.
       
   761 #
       
   762 # Special cases:
       
   763 #     test_pep277
       
   764 #         The _ExpectedSkips constructor adds this to the set of expected
       
   765 #         skips if not os.path.supports_unicode_filenames.
       
   766 #     test_socket_ssl
       
   767 #         Controlled by test_socket_ssl.skip_expected.  Requires the network
       
   768 #         resource, and a socket module with ssl support.
       
   769 #     test_timeout
       
   770 #         Controlled by test_timeout.skip_expected.  Requires the network
       
   771 #         resource and a socket module.
       
   772 #
       
   773 # Tests that are expected to be skipped everywhere except on one platform
       
   774 # are also handled separately.
       
   775 
       
   776 _expectations = {
       
   777     'win32':
       
   778         """
       
   779         test__locale
       
   780         test_bsddb185
       
   781         test_bsddb3
       
   782         test_commands
       
   783         test_crypt
       
   784         test_curses
       
   785         test_dbm
       
   786         test_dl
       
   787         test_fcntl
       
   788         test_fork1
       
   789         test_epoll
       
   790         test_gdbm
       
   791         test_grp
       
   792         test_ioctl
       
   793         test_largefile
       
   794         test_kqueue
       
   795         test_mhlib
       
   796         test_openpty
       
   797         test_ossaudiodev
       
   798         test_pipes
       
   799         test_poll
       
   800         test_posix
       
   801         test_pty
       
   802         test_pwd
       
   803         test_resource
       
   804         test_signal
       
   805         test_threadsignals
       
   806         test_timing
       
   807         test_wait3
       
   808         test_wait4
       
   809         """,
       
   810     'linux2':
       
   811         """
       
   812         test_bsddb185
       
   813         test_curses
       
   814         test_dl
       
   815         test_largefile
       
   816         test_kqueue
       
   817         test_ossaudiodev
       
   818         """,
       
   819    'mac':
       
   820         """
       
   821         test_atexit
       
   822         test_bsddb
       
   823         test_bsddb185
       
   824         test_bsddb3
       
   825         test_bz2
       
   826         test_commands
       
   827         test_crypt
       
   828         test_curses
       
   829         test_dbm
       
   830         test_dl
       
   831         test_fcntl
       
   832         test_fork1
       
   833         test_epoll
       
   834         test_grp
       
   835         test_ioctl
       
   836         test_largefile
       
   837         test_locale
       
   838         test_kqueue
       
   839         test_mmap
       
   840         test_openpty
       
   841         test_ossaudiodev
       
   842         test_poll
       
   843         test_popen
       
   844         test_popen2
       
   845         test_posix
       
   846         test_pty
       
   847         test_pwd
       
   848         test_resource
       
   849         test_signal
       
   850         test_sundry
       
   851         test_tarfile
       
   852         test_timing
       
   853         """,
       
   854     'unixware7':
       
   855         """
       
   856         test_bsddb
       
   857         test_bsddb185
       
   858         test_dl
       
   859         test_epoll
       
   860         test_largefile
       
   861         test_kqueue
       
   862         test_minidom
       
   863         test_openpty
       
   864         test_pyexpat
       
   865         test_sax
       
   866         test_sundry
       
   867         """,
       
   868     'openunix8':
       
   869         """
       
   870         test_bsddb
       
   871         test_bsddb185
       
   872         test_dl
       
   873         test_epoll
       
   874         test_largefile
       
   875         test_kqueue
       
   876         test_minidom
       
   877         test_openpty
       
   878         test_pyexpat
       
   879         test_sax
       
   880         test_sundry
       
   881         """,
       
   882     'sco_sv3':
       
   883         """
       
   884         test_asynchat
       
   885         test_bsddb
       
   886         test_bsddb185
       
   887         test_dl
       
   888         test_fork1
       
   889         test_epoll
       
   890         test_gettext
       
   891         test_largefile
       
   892         test_locale
       
   893         test_kqueue
       
   894         test_minidom
       
   895         test_openpty
       
   896         test_pyexpat
       
   897         test_queue
       
   898         test_sax
       
   899         test_sundry
       
   900         test_thread
       
   901         test_threaded_import
       
   902         test_threadedtempfile
       
   903         test_threading
       
   904         """,
       
   905     'riscos':
       
   906         """
       
   907         test_asynchat
       
   908         test_atexit
       
   909         test_bsddb
       
   910         test_bsddb185
       
   911         test_bsddb3
       
   912         test_commands
       
   913         test_crypt
       
   914         test_dbm
       
   915         test_dl
       
   916         test_fcntl
       
   917         test_fork1
       
   918         test_epoll
       
   919         test_gdbm
       
   920         test_grp
       
   921         test_largefile
       
   922         test_locale
       
   923         test_kqueue
       
   924         test_mmap
       
   925         test_openpty
       
   926         test_poll
       
   927         test_popen2
       
   928         test_pty
       
   929         test_pwd
       
   930         test_strop
       
   931         test_sundry
       
   932         test_thread
       
   933         test_threaded_import
       
   934         test_threadedtempfile
       
   935         test_threading
       
   936         test_timing
       
   937         """,
       
   938     'darwin':
       
   939         """
       
   940         test__locale
       
   941         test_bsddb
       
   942         test_bsddb3
       
   943         test_curses
       
   944         test_epoll
       
   945         test_gdbm
       
   946         test_largefile
       
   947         test_locale
       
   948         test_kqueue
       
   949         test_minidom
       
   950         test_ossaudiodev
       
   951         test_poll
       
   952         """,
       
   953     'sunos5':
       
   954         """
       
   955         test_bsddb
       
   956         test_bsddb185
       
   957         test_curses
       
   958         test_dbm
       
   959         test_epoll
       
   960         test_kqueue
       
   961         test_gdbm
       
   962         test_gzip
       
   963         test_openpty
       
   964         test_zipfile
       
   965         test_zlib
       
   966         """,
       
   967     'hp-ux11':
       
   968         """
       
   969         test_bsddb
       
   970         test_bsddb185
       
   971         test_curses
       
   972         test_dl
       
   973         test_epoll
       
   974         test_gdbm
       
   975         test_gzip
       
   976         test_largefile
       
   977         test_locale
       
   978         test_kqueue
       
   979         test_minidom
       
   980         test_openpty
       
   981         test_pyexpat
       
   982         test_sax
       
   983         test_zipfile
       
   984         test_zlib
       
   985         """,
       
   986     'atheos':
       
   987         """
       
   988         test_bsddb185
       
   989         test_curses
       
   990         test_dl
       
   991         test_gdbm
       
   992         test_epoll
       
   993         test_largefile
       
   994         test_locale
       
   995         test_kqueue
       
   996         test_mhlib
       
   997         test_mmap
       
   998         test_poll
       
   999         test_popen2
       
  1000         test_resource
       
  1001         """,
       
  1002     'cygwin':
       
  1003         """
       
  1004         test_bsddb185
       
  1005         test_bsddb3
       
  1006         test_curses
       
  1007         test_dbm
       
  1008         test_epoll
       
  1009         test_ioctl
       
  1010         test_kqueue
       
  1011         test_largefile
       
  1012         test_locale
       
  1013         test_ossaudiodev
       
  1014         test_socketserver
       
  1015         """,
       
  1016     'os2emx':
       
  1017         """
       
  1018         test_audioop
       
  1019         test_bsddb185
       
  1020         test_bsddb3
       
  1021         test_commands
       
  1022         test_curses
       
  1023         test_dl
       
  1024         test_epoll
       
  1025         test_kqueue
       
  1026         test_largefile
       
  1027         test_mhlib
       
  1028         test_mmap
       
  1029         test_openpty
       
  1030         test_ossaudiodev
       
  1031         test_pty
       
  1032         test_resource
       
  1033         test_signal
       
  1034         """,
       
  1035     'freebsd4':
       
  1036         """
       
  1037         test_bsddb
       
  1038         test_bsddb3
       
  1039         test_epoll
       
  1040         test_gdbm
       
  1041         test_locale
       
  1042         test_ossaudiodev
       
  1043         test_pep277
       
  1044         test_pty
       
  1045         test_socket_ssl
       
  1046         test_socketserver
       
  1047         test_tcl
       
  1048         test_timeout
       
  1049         test_urllibnet
       
  1050         test_multiprocessing
       
  1051         """,
       
  1052     'aix5':
       
  1053         """
       
  1054         test_bsddb
       
  1055         test_bsddb185
       
  1056         test_bsddb3
       
  1057         test_bz2
       
  1058         test_dl
       
  1059         test_epoll
       
  1060         test_gdbm
       
  1061         test_gzip
       
  1062         test_kqueue
       
  1063         test_ossaudiodev
       
  1064         test_tcl
       
  1065         test_zipimport
       
  1066         test_zlib
       
  1067         """,
       
  1068     'openbsd3':
       
  1069         """
       
  1070         test_bsddb
       
  1071         test_bsddb3
       
  1072         test_ctypes
       
  1073         test_dl
       
  1074         test_epoll
       
  1075         test_gdbm
       
  1076         test_locale
       
  1077         test_normalization
       
  1078         test_ossaudiodev
       
  1079         test_pep277
       
  1080         test_tcl
       
  1081         test_multiprocessing
       
  1082         """,
       
  1083     'netbsd3':
       
  1084         """
       
  1085         test_bsddb
       
  1086         test_bsddb185
       
  1087         test_bsddb3
       
  1088         test_ctypes
       
  1089         test_curses
       
  1090         test_dl
       
  1091         test_epoll
       
  1092         test_gdbm
       
  1093         test_locale
       
  1094         test_ossaudiodev
       
  1095         test_pep277
       
  1096         test_tcl
       
  1097         test_multiprocessing
       
  1098         """,
       
  1099 }
       
  1100 _expectations['freebsd5'] = _expectations['freebsd4']
       
  1101 _expectations['freebsd6'] = _expectations['freebsd4']
       
  1102 _expectations['freebsd7'] = _expectations['freebsd4']
       
  1103 _expectations['freebsd8'] = _expectations['freebsd4']
       
  1104 
       
  1105 class _ExpectedSkips:
       
  1106     def __init__(self):
       
  1107         import os.path
       
  1108         from test import test_timeout
       
  1109 
       
  1110         self.valid = False
       
  1111         if sys.platform in _expectations:
       
  1112             s = _expectations[sys.platform]
       
  1113             self.expected = set(s.split())
       
  1114 
       
  1115             # expected to be skipped on every platform, even Linux
       
  1116             self.expected.add('test_linuxaudiodev')
       
  1117 
       
  1118             if not os.path.supports_unicode_filenames:
       
  1119                 self.expected.add('test_pep277')
       
  1120 
       
  1121             try:
       
  1122                 from test import test_socket_ssl
       
  1123             except ImportError:
       
  1124                 pass
       
  1125             else:
       
  1126                 if test_socket_ssl.skip_expected:
       
  1127                     self.expected.add('test_socket_ssl')
       
  1128 
       
  1129             if test_timeout.skip_expected:
       
  1130                 self.expected.add('test_timeout')
       
  1131 
       
  1132             if sys.maxint == 9223372036854775807L:
       
  1133                 self.expected.add('test_imageop')
       
  1134 
       
  1135             if not sys.platform in ("mac", "darwin"):
       
  1136                 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
       
  1137                             "test_plistlib", "test_scriptpackages",
       
  1138                             "test_applesingle"]
       
  1139                 for skip in MAC_ONLY:
       
  1140                     self.expected.add(skip)
       
  1141             elif len(u'\0'.encode('unicode-internal')) == 4:
       
  1142                 self.expected.add("test_macostools")
       
  1143 
       
  1144 
       
  1145             if sys.platform != "win32":
       
  1146                 # test_sqlite is only reliable on Windows where the library
       
  1147                 # is distributed with Python
       
  1148                 WIN_ONLY = ["test_unicode_file", "test_winreg",
       
  1149                             "test_winsound", "test_startfile",
       
  1150                             "test_sqlite"]
       
  1151                 for skip in WIN_ONLY:
       
  1152                     self.expected.add(skip)
       
  1153 
       
  1154             if sys.platform != 'irix':
       
  1155                 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
       
  1156                              "test_gl", "test_imgfile"]
       
  1157                 for skip in IRIX_ONLY:
       
  1158                     self.expected.add(skip)
       
  1159 
       
  1160             if sys.platform != 'sunos5':
       
  1161                 self.expected.add('test_sunaudiodev')
       
  1162                 self.expected.add('test_nis')
       
  1163 
       
  1164             if not sys.py3kwarning:
       
  1165                 self.expected.add('test_py3kwarn')
       
  1166 
       
  1167             self.valid = True
       
  1168 
       
  1169     def isvalid(self):
       
  1170         "Return true iff _ExpectedSkips knows about the current platform."
       
  1171         return self.valid
       
  1172 
       
  1173     def getexpected(self):
       
  1174         """Return set of test names we expect to skip on current platform.
       
  1175 
       
  1176         self.isvalid() must be true.
       
  1177         """
       
  1178 
       
  1179         assert self.isvalid()
       
  1180         return self.expected
       
  1181 
       
  1182 if __name__ == '__main__':
       
  1183     # Remove regrtest.py's own directory from the module search path.  This
       
  1184     # prevents relative imports from working, and relative imports will screw
       
  1185     # up the testing framework.  E.g. if both test.test_support and
       
  1186     # test_support are imported, they will not contain the same globals, and
       
  1187     # much of the testing framework relies on the globals in the
       
  1188     # test.test_support module.
       
  1189     mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
       
  1190     i = pathlen = len(sys.path)
       
  1191     while i >= 0:
       
  1192         i -= 1
       
  1193         if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
       
  1194             del sys.path[i]
       
  1195     if len(sys.path) == pathlen:
       
  1196         print 'Could not find %r in sys.path to remove it' % mydir
       
  1197     main()