annotate Lib/test/support.py @ 67467:abe201dfd3dc 3.1

Merged revisions 87861,87863 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r87861 | antoine.pitrou | 2011-01-08 11:23:29 +0100 (sam., 08 janv. 2011) | 3 lines Fix test_ssl after r87849 ........ r87863 | antoine.pitrou | 2011-01-08 11:28:11 +0100 (sam., 08 janv. 2011) | 3 lines Add EHOSTUNREACH ('No route to host') to the errnos trapped by transient_internet(). ........
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 08 Jan 2011 10:31:09 +0000
parents e9a51d463579
children 4430e4d63594
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
1 """Supporting definitions for the Python regression tests."""
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
2
47201
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 47067
diff changeset
3 if __name__ != 'test.support':
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 47067
diff changeset
4 raise ImportError('support must be imported from the test package')
24442
226ba34bd998 Complete the absolute import patch for the test suite. All relative
Barry Warsaw <barry@python.org>
parents: 21595
diff changeset
5
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
6 import contextlib
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
7 import errno
54501
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
8 import functools
54504
2c00bdaad7a9 Merged revisions 73073-73074,73089 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54501
diff changeset
9 import gc
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
10 import socket
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
11 import sys
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
12 import os
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
13 import re
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
14 import platform
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
15 import shutil
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
16 import warnings
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
17 import unittest
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
18 import importlib
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
19 import collections
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
20
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
21 __all__ = [
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
22 "Error", "TestFailed", "ResourceDenied", "import_module",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
23 "verbose", "use_resources", "max_memuse", "record_original_stdout",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
24 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
25 "is_resource_enabled", "requires", "find_unused_port", "bind_port",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
26 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "findfile", "verify",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
27 "vereq", "sortdict", "check_syntax_error", "open_urlresource",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
28 "check_warnings", "CleanImport", "EnvironmentVarGuard",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
29 "TransientResource", "captured_output", "captured_stdout",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
30 "time_out", "socket_peer_reset", "ioerror_peer_reset",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
31 "run_with_locale", "transient_internet",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
32 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
33 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
34 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
35 ]
47317
ba8015e23487 Merged revisions 63698 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
36
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
37 class Error(Exception):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
38 """Base class for regression test exceptions."""
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
39
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
40 class TestFailed(Error):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
41 """Test failed."""
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
43 class ResourceDenied(unittest.SkipTest):
27636
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
44 """Test skipped because it requested a disallowed resource.
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
45
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
46 This is raised when a test calls requires() for a resource that
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
47 has not be enabled. It is used to distinguish between expected
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
48 and unexpected skips.
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
49 """
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
50
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
51 @contextlib.contextmanager
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
52 def _ignore_deprecated_imports(ignore=True):
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
53 """Context manager to suppress package and module deprecation
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
54 warnings when importing them.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
55
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
56 If ignore is False, this context manager has no effect."""
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
57 if ignore:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
58 with warnings.catch_warnings():
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
59 warnings.filterwarnings("ignore", ".+ (module|package)",
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
60 DeprecationWarning)
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
61 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
62 else:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
63 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
64
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
65
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
66 def import_module(name, deprecated=False):
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
67 """Import and return the module to be tested, raising SkipTest if
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
68 it is not available.
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
69
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
70 If deprecated is True, any module or package deprecation messages
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
71 will be suppressed."""
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
72 with _ignore_deprecated_imports(deprecated):
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
73 try:
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
74 return importlib.import_module(name)
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
75 except ImportError as msg:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
76 raise unittest.SkipTest(str(msg))
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
77
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
78
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
79 def _save_and_remove_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
80 """Helper function to save and remove a module from sys.modules
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
81
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
82 Return value is True if the module was in sys.modules and
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
83 False otherwise."""
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
84 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
85 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
86 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
87 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
88 saved = False
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
89 else:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
90 del sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
91 return saved
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
92
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
93
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
94 def _save_and_block_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
95 """Helper function to save and block a module in sys.modules
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
96
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
97 Return value is True if the module was in sys.modules and
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
98 False otherwise."""
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
99 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
100 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
101 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
102 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
103 saved = False
62999
daea978a48ae Merged revisions 82850 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61581
diff changeset
104 sys.modules[name] = None
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
105 return saved
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
106
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
107
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
108 def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
109 """Imports and returns a module, deliberately bypassing the sys.modules cache
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
110 and importing a fresh copy of the module. Once the import is complete,
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
111 the sys.modules cache is restored to its original state.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
112
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
113 Modules named in fresh are also imported anew if needed by the import.
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
114
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
115 Importing of modules named in blocked is prevented while the fresh import
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
116 takes place.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
117
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
118 If deprecated is True, any module or package deprecation messages
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
119 will be suppressed."""
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
120 # NOTE: test_heapq and test_warnings include extra sanity checks to make
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
121 # sure that this utility function is working as expected
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
122 with _ignore_deprecated_imports(deprecated):
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
123 # Keep track of modules saved for later restoration as well
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
124 # as those which just need a blocking entry removed
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
125 orig_modules = {}
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
126 names_to_remove = []
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
127 _save_and_remove_module(name, orig_modules)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
128 try:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
129 for fresh_name in fresh:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
130 _save_and_remove_module(fresh_name, orig_modules)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
131 for blocked_name in blocked:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
132 if not _save_and_block_module(blocked_name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
133 names_to_remove.append(blocked_name)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
134 fresh_module = importlib.import_module(name)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
135 finally:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
136 for orig_name, module in orig_modules.items():
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
137 sys.modules[orig_name] = module
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
138 for name_to_remove in names_to_remove:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
139 del sys.modules[name_to_remove]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
140 return fresh_module
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
141
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
142
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
143 def get_attribute(obj, name):
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
144 """Get an attribute, raising SkipTest if AttributeError is raised."""
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
145 try:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
146 attribute = getattr(obj, name)
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
147 except AttributeError:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
148 raise unittest.SkipTest("module %s has no attribute %s" % (
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
149 obj.__name__, name))
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
150 else:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
151 return attribute
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
152
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
153 verbose = 1 # Flag set to 0 by regrtest.py
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
154 use_resources = None # Flag set to [] by regrtest.py
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
155 max_memuse = 0 # Disable bigmem tests (they will still be run with
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
156 # small sizes, to make sure they work.)
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
157 real_max_memuse = 0
4791
a2fd80eed27f Add verbose flag for regression test to clear.
Guido van Rossum <guido@python.org>
parents: 1197
diff changeset
158
20091
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
159 # _original_stdout is meant to hold stdout at the time regrtest began.
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
160 # This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
161 # The point is to have some flavor of stdout the user can actually see.
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
162 _original_stdout = None
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
163 def record_original_stdout(stdout):
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
164 global _original_stdout
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
165 _original_stdout = stdout
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
166
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
167 def get_original_stdout():
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
168 return _original_stdout or sys.stdout
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
169
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 def unload(name):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
171 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
172 del sys.modules[name]
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
173 except KeyError:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
174 pass
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
176 def unlink(filename):
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
177 try:
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
178 os.unlink(filename)
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
179 except OSError:
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
180 pass
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
181
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
182 def rmtree(path):
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
183 try:
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
184 shutil.rmtree(path)
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
185 except OSError as e:
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
186 # Unix returns ENOENT, Windows returns ESRCH.
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
187 if e.errno not in (errno.ENOENT, errno.ESRCH):
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
188 raise
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
189
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 def forget(modname):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
191 '''"Forget" a module was ever imported by removing it from sys.modules and
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
192 deleting any .pyc and .pyo files.'''
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
193 unload(modname)
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
194 for dirname in sys.path:
42622
4d2aa4bfb2d6 Remove RISCOS support
Skip Montanaro <skip@pobox.com>
parents: 41993
diff changeset
195 unlink(os.path.join(dirname, modname + '.pyc'))
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
196 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
197 # the chance exists that there is no .pyc (and thus the 'try' statement
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
198 # is exited) but there is a .pyo file.
42622
4d2aa4bfb2d6 Remove RISCOS support
Skip Montanaro <skip@pobox.com>
parents: 41993
diff changeset
199 unlink(os.path.join(dirname, modname + '.pyo'))
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200
26527
18dcf80e6f8d Rearrange test_socket_ssl so that a skip is expected iff the network
Tim Peters <tim.peters@gmail.com>
parents: 26139
diff changeset
201 def is_resource_enabled(resource):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
202 """Test whether a resource is enabled. Known resources are set by
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
203 regrtest.py."""
26527
18dcf80e6f8d Rearrange test_socket_ssl so that a skip is expected iff the network
Tim Peters <tim.peters@gmail.com>
parents: 26139
diff changeset
204 return use_resources is not None and resource in use_resources
18dcf80e6f8d Rearrange test_socket_ssl so that a skip is expected iff the network
Tim Peters <tim.peters@gmail.com>
parents: 26139
diff changeset
205
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
206 def requires(resource, msg=None):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
207 """Raise ResourceDenied if the specified resource is not available.
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
208
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
209 If the caller's module is __main__ then automatically return True. The
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
210 possibility of False being returned occurs when regrtest.py is executing."""
28799
46d26afa8b95 if the test is run directly (__name__ == "__main__") don't actually require
Skip Montanaro <skip@pobox.com>
parents: 28174
diff changeset
211 # see if the caller's module is __main__ - if so, treat as if
46d26afa8b95 if the test is run directly (__name__ == "__main__") don't actually require
Skip Montanaro <skip@pobox.com>
parents: 28174
diff changeset
212 # the resource was set
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
213 if sys._getframe(1).f_globals.get("__name__") == "__main__":
28799
46d26afa8b95 if the test is run directly (__name__ == "__main__") don't actually require
Skip Montanaro <skip@pobox.com>
parents: 28174
diff changeset
214 return
26527
18dcf80e6f8d Rearrange test_socket_ssl so that a skip is expected iff the network
Tim Peters <tim.peters@gmail.com>
parents: 26139
diff changeset
215 if not is_resource_enabled(resource):
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
216 if msg is None:
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
217 msg = "Use of the `%s' resource not enabled" % resource
27636
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
218 raise ResourceDenied(msg)
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
219
46370
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
220 HOST = 'localhost'
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
221
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
222 def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
223 """Returns an unused port that should be suitable for binding. This is
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
224 achieved by creating a temporary socket with the same family and type as
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
225 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
226 the specified host address (defaults to 0.0.0.0) with the port set to 0,
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
227 eliciting an unused ephemeral port from the OS. The temporary socket is
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
228 then closed and deleted, and the ephemeral port is returned.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
229
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
230 Either this method or bind_port() should be used for any tests where a
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
231 server socket needs to be bound to a particular port for the duration of
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
232 the test. Which one to use depends on whether the calling code is creating
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
233 a python socket, or if an unused port needs to be provided in a constructor
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
234 or passed to an external program (i.e. the -accept argument to openssl's
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
235 s_server mode). Always prefer bind_port() over find_unused_port() where
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
236 possible. Hard coded ports should *NEVER* be used. As soon as a server
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
237 socket is bound to a hard coded port, the ability to run multiple instances
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
238 of the test simultaneously on the same host is compromised, which makes the
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
239 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
240 may simply manifest as a failed test, which can be recovered from without
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
241 intervention in most cases, but on Windows, the entire python process can
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
242 completely and utterly wedge, requiring someone to log in to the buildbot
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
243 and manually kill the affected process.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
244
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
245 (This is easy to reproduce on Windows, unfortunately, and can be traced to
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
246 the SO_REUSEADDR socket option having different semantics on Windows versus
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
247 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
248 listen and then accept connections on identical host/ports. An EADDRINUSE
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
249 socket.error will be raised at some point (depending on the platform and
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
250 the order bind and listen were called on each socket).
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
251
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
252 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
253 will ever be raised when attempting to bind two identical host/ports. When
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
254 accept() is called on each socket, the second caller's process will steal
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
255 the port from the first caller, leaving them both in an awkwardly wedged
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
256 state where they'll no longer respond to any signals or graceful kills, and
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
257 must be forcibly killed via OpenProcess()/TerminateProcess().
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
258
46370
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
259 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
260 instead of SO_REUSEADDR, which effectively affords the same semantics as
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
261 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
262 Source world compared to Windows ones, this is a common mistake. A quick
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
263 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
264 openssl.exe is called with the 's_server' option, for example. See
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
265 http://bugs.python.org/issue2550 for more info. The following site also
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
266 has a very thorough description about the implications of both REUSEADDR
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
267 and EXCLUSIVEADDRUSE on Windows:
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
268 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
269
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
270 XXX: although this approach is a vast improvement on previous attempts to
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
271 elicit unused ports, it rests heavily on the assumption that the ephemeral
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
272 port returned to us by the OS won't immediately be dished back out to some
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
273 other process when we close and delete our temporary socket but before our
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
274 calling code has a chance to bind the returned port. We can deal with this
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
275 issue if/when we come across it.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
276 """
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
277
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
278 tempsock = socket.socket(family, socktype)
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
279 port = bind_port(tempsock)
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
280 tempsock.close()
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
281 del tempsock
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
282 return port
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
283
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
284 def bind_port(sock, host=HOST):
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
285 """Bind the socket to a free port and return the port number. Relies on
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
286 ephemeral ports in order to ensure we are using an unbound port. This is
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
287 important as many tests may be running simultaneously, especially in a
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
288 buildbot environment. This method raises an exception if the sock.family
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
289 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
290 or SO_REUSEPORT set on it. Tests should *never* set these socket options
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
291 for TCP/IP sockets. The only case for setting these options is testing
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
292 multicasting via multiple UDP sockets.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
293
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
294 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
295 on Windows), it will be set on the socket. This will prevent anyone else
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
296 from bind()'ing to our host/port for the duration of the test.
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
297 """
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
298
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
299 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
300 if hasattr(socket, 'SO_REUSEADDR'):
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
301 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
302 raise TestFailed("tests should never set the SO_REUSEADDR " \
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
303 "socket option on TCP/IP sockets!")
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
304 if hasattr(socket, 'SO_REUSEPORT'):
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
305 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
306 raise TestFailed("tests should never set the SO_REUSEPORT " \
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
307 "socket option on TCP/IP sockets!")
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
308 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
309 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
310
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
311 sock.bind((host, 0))
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
312 port = sock.getsockname()[1]
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
313 return port
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
314
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
315 FUZZ = 1e-6
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
316
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
317 def fcmp(x, y): # fuzzy comparison function
39602
73a3291c58dc use isinstance instead of type. Use bool instead of int for flag.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39442
diff changeset
318 if isinstance(x, float) or isinstance(y, float):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
319 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
320 fuzz = (abs(x) + abs(y)) * FUZZ
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
321 if abs(x-y) <= fuzz:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
322 return 0
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
323 except:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
324 pass
39602
73a3291c58dc use isinstance instead of type. Use bool instead of int for flag.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39442
diff changeset
325 elif type(x) == type(y) and isinstance(x, (tuple, list)):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
326 for i in range(min(len(x), len(y))):
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
327 outcome = fcmp(x[i], y[i])
15540
9d43129c8c55 Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 15305
diff changeset
328 if outcome != 0:
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
329 return outcome
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39602
diff changeset
330 return (len(x) > len(y)) - (len(x) < len(y))
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39602
diff changeset
331 return (x > y) - (x < y)
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
332
25982
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
333 is_jython = sys.platform.startswith('java')
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
334
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
335 # Filename used for testing
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
336 if os.name == 'java':
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
337 # Jython disallows @ in module names
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
338 TESTFN = '$test'
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28968
diff changeset
339 else:
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
340 TESTFN = '@test'
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
341
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
342 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
343 # TESTFN_UNICODE is a filename that can be encoded using the
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
344 # file system encoding, but *not* with the default (ascii) encoding
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
345 TESTFN_UNICODE = "@test-\xe0\xf2"
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
346 TESTFN_ENCODING = sys.getfilesystemencoding()
64605
b314adc9bcde Recorded merge of revisions 83987 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64603
diff changeset
347 # TESTFN_UNENCODABLE is a filename that should *not* be
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
348 # able to be encoded by *either* the default or filesystem encoding.
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
349 # This test really only makes sense on Windows NT platforms
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
350 # which have special Unicode support in posixmodule.
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
351 if (not hasattr(sys, "getwindowsversion") or
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
352 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
64605
b314adc9bcde Recorded merge of revisions 83987 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64603
diff changeset
353 TESTFN_UNENCODABLE = None
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
354 else:
64603
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
355 # Different kinds of characters from various languages to minimize the
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
356 # probability that the whole name is encodable to MBCS (issue #9819)
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
357 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
358 try:
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
359 # XXX - Note - should be using TESTFN_ENCODING here - but for
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
360 # Windows, "mbcs" currently always operates as if in
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
361 # errors=ignore' mode - hence we get '?' characters rather than
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
362 # the exception. 'Latin1' operates as we expect - ie, fails.
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
363 # See [ 850997 ] mbcs encoding ignores errors
64605
b314adc9bcde Recorded merge of revisions 83987 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64603
diff changeset
364 TESTFN_UNENCODABLE.encode("Latin1")
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
365 except UnicodeEncodeError:
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
366 pass
26139
144d9d48b96c Don't try to convert the test filename to Unicode with -U.
Martin v. Löwis <martin@v.loewis.de>
parents: 26128
diff changeset
367 else:
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
368 print('WARNING: The filename %r CAN be encoded by the filesystem. '
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
369 'Unicode filename tests may not be effective'
64605
b314adc9bcde Recorded merge of revisions 83987 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64603
diff changeset
370 % TESTFN_UNENCODABLE)
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
371
61581
2369d4f189e4 test/support.py: remove TESTFN if it is a directory
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60818
diff changeset
372 if os.path.isdir(TESTFN):
2369d4f189e4 test/support.py: remove TESTFN if it is a directory
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60818
diff changeset
373 # a test failed (eg. test_os) without removing TESTFN directory
2369d4f189e4 test/support.py: remove TESTFN if it is a directory
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60818
diff changeset
374 shutil.rmtree(TESTFN)
2369d4f189e4 test/support.py: remove TESTFN if it is a directory
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60818
diff changeset
375
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
376 # Make sure we can write to TESTFN, try in /tmp if we can't
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
377 fp = None
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
378 try:
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
379 fp = open(TESTFN, 'w+')
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
380 except IOError:
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
381 TMP_TESTFN = os.path.join('/tmp', TESTFN)
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
382 try:
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
383 fp = open(TMP_TESTFN, 'w+')
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
384 TESTFN = TMP_TESTFN
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
385 del TMP_TESTFN
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
386 except IOError:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
387 print(('WARNING: tests will fail, unable to write to: %s or %s' %
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
388 (TESTFN, TMP_TESTFN)))
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
389 if fp is not None:
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
390 fp.close()
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
391 unlink(TESTFN)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
392 del fp
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
393
63005
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
394 def findfile(file, here=__file__, subdir=None):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
395 """Try to find a file on sys.path and the working directory. If it is not
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
396 found the argument passed to the function is returned (this does not
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
397 necessarily signal failure; could still be the legitimate path)."""
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
398 if os.path.isabs(file):
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
399 return file
63005
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
400 if subdir is not None:
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
401 file = os.path.join(subdir, file)
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
402 path = sys.path
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
403 path = [os.path.dirname(here)] + path
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
404 for dn in path:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
405 fn = os.path.join(dn, file)
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
406 if os.path.exists(fn): return fn
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
407 return file
15957
c1a8deb15f0e This patch removes all uses of "assert" in the regression test suite
Marc-André Lemburg <mal@egenix.com>
parents: 15540
diff changeset
408
58492
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
409 def verify(condition, reason='test failed'):
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
410 """Verify that condition is true. If not, raise TestFailed.
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
411
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
412 The optional argument reason can be given to provide
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
413 a better error text.
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
414 """
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
415
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
416 if not condition:
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
417 raise TestFailed(reason)
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
418
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
419 def vereq(a, b):
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
420 """Raise TestFailed if a == b is false.
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
421
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
422 This is better than verify(a == b) because, in case of failure, the
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
423 error message incorporates repr(a) and repr(b) so you can see the
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
424 inputs.
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
425
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
426 Note that "not (a == b)" isn't necessarily the same as "a != b"; the
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
427 former is tested.
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
428 """
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
429
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
430 if not (a == b):
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
431 raise TestFailed("%r == %r" % (a, b))
78c0ac07aa9e Revert r77732 and add back verify and vereq in case other projects use them, but leave the changes in test_pprint and string_tests.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58477
diff changeset
432
17815
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
433 def sortdict(dict):
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
434 "Like repr(dict), but in sorted order."
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
435 items = sorted(dict.items())
17815
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
436 reprpairs = ["%r: %r" % pair for pair in items]
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
437 withcommas = ", ".join(reprpairs)
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
438 return "{%s}" % withcommas
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
439
50915
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
440 def make_bad_fd():
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
441 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
442 Create an invalid file descriptor by opening and closing a file and return
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
443 its fd.
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
444 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
445 file = open(TESTFN, "wb")
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
446 try:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
447 return file.fileno()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
448 finally:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
449 file.close()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
450 unlink(TESTFN)
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
451
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39644
diff changeset
452 def check_syntax_error(testcase, statement):
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
453 testcase.assertRaises(SyntaxError, compile, statement,
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
454 '<test string>', 'exec')
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
455
43089
2e3c02c625de Explicitly use UTF-8 as the encoding for the normalization file.
Martin v. Löwis <martin@v.loewis.de>
parents: 42954
diff changeset
456 def open_urlresource(url, *args, **kw):
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
457 import urllib.request, urllib.parse
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
458
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41674
diff changeset
459 requires('urlfetch')
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
460 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
35998
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
461
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
462 for path in [os.path.curdir, os.path.pardir]:
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
463 fn = os.path.join(path, filename)
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
464 if os.path.exists(fn):
43089
2e3c02c625de Explicitly use UTF-8 as the encoding for the normalization file.
Martin v. Löwis <martin@v.loewis.de>
parents: 42954
diff changeset
465 return open(fn, *args, **kw)
35998
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
466
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
467 print('\tfetching %s ...' % url, file=get_original_stdout())
57056
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
468 f = urllib.request.urlopen(url, timeout=15)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
469 try:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
470 with open(filename, "wb") as out:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
471 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
472 while s:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
473 out.write(s)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
474 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
475 finally:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
476 f.close()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
477 return open(filename, *args, **kw)
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
478
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
479 class WarningsRecorder(object):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
480 """Convenience wrapper for the warnings list returned on
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
481 entry to the warnings.catch_warnings() context manager.
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
482 """
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
483 def __init__(self, warnings_list):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
484 self.warnings = warnings_list
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
485
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
486 def __getattr__(self, attr):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
487 if self.warnings:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
488 return getattr(self.warnings[-1], attr)
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
489 elif attr in warnings.WarningMessage._WARNING_DETAILS:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
490 return None
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
491 raise AttributeError("%r has no attribute %r" % (self, attr))
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
492
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
493 def reset(self):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
494 del self.warnings[:]
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
495
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
496 @contextlib.contextmanager
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
497 def check_warnings():
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
498 with warnings.catch_warnings(record=True) as w:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
499 yield WarningsRecorder(w)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
500
47067
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
501
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
502 class CleanImport(object):
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
503 """Context manager to force import to return a new module reference.
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
504
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
505 This is useful for testing module-level behaviours, such as
48455
b5cf0cb0c7ce Make test.test_support.catch_warnings more robust as discussed on python-dev. Also add explicit tests for it to test_warnings. (forward port of r64910 from trunk)
Nick Coghlan <ncoghlan@gmail.com>
parents: 48334
diff changeset
506 the emission of a DeprecationWarning on import.
47067
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
507
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
508 Use like this:
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
509
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
510 with CleanImport("foo"):
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
511 __import__("foo") # new reference
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
512 """
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
513
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
514 def __init__(self, *module_names):
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
515 self.original_modules = sys.modules.copy()
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
516 for module_name in module_names:
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
517 if module_name in sys.modules:
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
518 module = sys.modules[module_name]
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
519 # It is possible that module_name is just an alias for
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
520 # another module (e.g. stub for modules renamed in 3.x).
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
521 # In that case, we also need delete the real module to clear
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
522 # the import cache.
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
523 if module.__name__ != module_name:
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
524 del sys.modules[module.__name__]
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
525 del sys.modules[module_name]
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
526
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
527 def __enter__(self):
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
528 return self
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
529
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
530 def __exit__(self, *ignore_exc):
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
531 sys.modules.update(self.original_modules)
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
532
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47066
diff changeset
533
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
534 class EnvironmentVarGuard(collections.MutableMapping):
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
535
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
536 """Class to help protect the environment variable properly. Can be used as
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
537 a context manager."""
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
538
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
539 def __init__(self):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
540 self._environ = os.environ
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
541 self._changed = {}
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
542
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
543 def __getitem__(self, envvar):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
544 return self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
545
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
546 def __setitem__(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
547 # Remember the initial value on the first access
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
548 if envvar not in self._changed:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
549 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
550 self._environ[envvar] = value
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
551
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
552 def __delitem__(self, envvar):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
553 # Remember the initial value on the first access
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
554 if envvar not in self._changed:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
555 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
556 if envvar in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
557 del self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
558
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
559 def keys(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
560 return self._environ.keys()
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
561
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
562 def __iter__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
563 return iter(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
564
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
565 def __len__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
566 return len(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
567
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
568 def set(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
569 self[envvar] = value
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
570
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
571 def unset(self, envvar):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
572 del self[envvar]
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
573
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
574 def __enter__(self):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
575 return self
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
576
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
577 def __exit__(self, *ignore_exc):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
578 for (k, v) in self._changed.items():
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
579 if v is None:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
580 if k in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
581 del self._environ[k]
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
582 else:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
583 self._environ[k] = v
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
584
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
585
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
586 class TransientResource(object):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
587
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
588 """Raise ResourceDenied if an exception is raised while the context manager
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
589 is in effect that matches the specified exception and attributes."""
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
590
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
591 def __init__(self, exc, **kwargs):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
592 self.exc = exc
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
593 self.attrs = kwargs
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
594
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
595 def __enter__(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
596 return self
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
597
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
598 def __exit__(self, type_=None, value=None, traceback=None):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
599 """If type_ is a subclass of self.exc and value has attributes matching
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
600 self.attrs, raise ResourceDenied. Otherwise let the exception
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
601 propagate (if any)."""
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
602 if type_ is not None and issubclass(self.exc, type_):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
603 for attr, attr_value in self.attrs.items():
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
604 if not hasattr(value, attr):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
605 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
606 if getattr(value, attr) != attr_value:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
607 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
608 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
609 raise ResourceDenied("an optional resource is not available")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
610
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
611 # Context managers that raise ResourceDenied when various issues
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
612 # with the Internet connection manifest themselves as exceptions.
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
613 # XXX deprecate these and use transient_internet() instead
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
614 time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
615 socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
616 ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
617
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
618
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
619 @contextlib.contextmanager
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
620 def transient_internet(resource_name, *, timeout=30.0, errnos=()):
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
621 """Return a context manager that raises ResourceDenied when various issues
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
622 with the Internet connection manifest themselves as exceptions."""
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
623 default_errnos = [
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
624 ('ECONNREFUSED', 111),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
625 ('ECONNRESET', 104),
67467
abe201dfd3dc Merged revisions 87861,87863 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67311
diff changeset
626 ('EHOSTUNREACH', 113),
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
627 ('ENETUNREACH', 101),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
628 ('ETIMEDOUT', 110),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
629 ]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
630 default_gai_errnos = [
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
631 ('EAI_NONAME', -2),
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
632 ('EAI_NODATA', -5),
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
633 ]
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
634
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
635 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
636 captured_errnos = errnos
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
637 gai_errnos = []
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
638 if not captured_errnos:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
639 captured_errnos = [getattr(errno, name, num)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
640 for (name, num) in default_errnos]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
641 gai_errnos = [getattr(socket, name, num)
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
642 for (name, num) in default_gai_errnos]
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
643
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
644 def filter_error(err):
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
645 n = getattr(err, 'errno', None)
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
646 if (isinstance(err, socket.timeout) or
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
647 (isinstance(err, socket.gaierror) and n in gai_errnos) or
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
648 n in captured_errnos):
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
649 if not verbose:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
650 sys.stderr.write(denied.args[0] + "\n")
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
651 raise denied from err
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
652
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
653 old_timeout = socket.getdefaulttimeout()
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
654 try:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
655 if timeout is not None:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
656 socket.setdefaulttimeout(timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
657 yield
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
658 except IOError as err:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
659 # urllib can wrap original socket errors multiple times (!), we must
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
660 # unwrap to get at the original error.
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
661 while True:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
662 a = err.args
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
663 if len(a) >= 1 and isinstance(a[0], IOError):
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
664 err = a[0]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
665 # The error can also be wrapped as args[1]:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
666 # except socket.error as msg:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
667 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
668 elif len(a) >= 2 and isinstance(a[1], IOError):
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
669 err = a[1]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
670 else:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
671 break
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
672 filter_error(err)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
673 raise
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
674 # XXX should we catch generic exceptions and look for their
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
675 # __cause__ or __context__?
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
676 finally:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
677 socket.setdefaulttimeout(old_timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
678
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
679
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
680 @contextlib.contextmanager
46262
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
681 def captured_output(stream_name):
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
682 """Run the 'with' statement body using a StringIO object in place of a
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
683 specific attribute on the sys module.
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
684 Example use (with 'stream_name=stdout')::
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
685
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
686 with captured_stdout() as s:
46978
55d8c35322a7 Convert a lot of print statements to print functions in docstrings,
Neal Norwitz <nnorwitz@gmail.com>
parents: 46769
diff changeset
687 print("hello")
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
688 assert s.getvalue() == "hello"
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
689 """
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
690 import io
46262
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
691 orig_stdout = getattr(sys, stream_name)
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
692 setattr(sys, stream_name, io.StringIO())
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46430
diff changeset
693 try:
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46430
diff changeset
694 yield getattr(sys, stream_name)
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46430
diff changeset
695 finally:
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46430
diff changeset
696 setattr(sys, stream_name, orig_stdout)
46262
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
697
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
698 def captured_stdout():
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
699 return captured_output("stdout")
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
700
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
701 def gc_collect():
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
702 """Force as many objects as possible to be collected.
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
703
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
704 In non-CPython implementations of Python, this is needed because timely
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
705 deallocation is not guaranteed by the garbage collector. (Even in CPython
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
706 this can be the case in case of reference cycles.) This means that __del__
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
707 methods may be called later than expected and weakrefs may remain alive for
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
708 longer than expected. This function tries its best to force all garbage
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
709 objects to disappear.
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
710 """
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
711 gc.collect()
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
712 gc.collect()
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
713 gc.collect()
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
714
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
715
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
716 #=======================================================================
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
717 # Decorator for running a function in a different locale, correctly resetting
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
718 # it afterwards.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
719
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
720 def run_with_locale(catstr, *locales):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
721 def decorator(func):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
722 def inner(*args, **kwds):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
723 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
724 import locale
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
725 category = getattr(locale, catstr)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
726 orig_locale = locale.setlocale(category)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
727 except AttributeError:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
728 # if the test author gives us an invalid category string
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
729 raise
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
730 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
731 # cannot retrieve original locale, so do nothing
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
732 locale = orig_locale = None
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
733 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
734 for loc in locales:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
735 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
736 locale.setlocale(category, loc)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
737 break
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
738 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
739 pass
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
740
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
741 # now run the function, resetting the locale on exceptions
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
742 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
743 return func(*args, **kwds)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
744 finally:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
745 if locale and orig_locale:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
746 locale.setlocale(category, orig_locale)
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40809
diff changeset
747 inner.__name__ = func.__name__
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
748 inner.__doc__ = func.__doc__
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
749 return inner
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
750 return decorator
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
751
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
752 #=======================================================================
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
753 # Big-memory-test support. Separate from 'resources' because memory use
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
754 # should be configurable.
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
755
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
756 # Some handy shorthands. Note that these are used for byte-limits as well
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
757 # as size-limits, in the various bigmem tests
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
758 _1M = 1024*1024
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
759 _1G = 1024 * _1M
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
760 _2G = 2 * _1G
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
761 _4G = 4 * _1G
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
762
43100
4e6b4ba60c3b Remove the simple slicing API. All slicing is now done with slice objects.
Thomas Wouters <thomas@python.org>
parents: 43089
diff changeset
763 MAX_Py_ssize_t = sys.maxsize
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
764
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
765 def set_memlimit(limit):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
766 import re
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
767 global max_memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
768 global real_max_memuse
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
769 sizes = {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
770 'k': 1024,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
771 'm': _1M,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
772 'g': _1G,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
773 't': 1024*_1G,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
774 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
775 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
776 re.IGNORECASE | re.VERBOSE)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
777 if m is None:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
778 raise ValueError('Invalid memory limit %r' % (limit,))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
779 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
780 real_max_memuse = memlimit
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
781 if memlimit > MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
782 memlimit = MAX_Py_ssize_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
783 if memlimit < _2G - 1:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
784 raise ValueError('Memory limit %r too low to be useful' % (limit,))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
785 max_memuse = memlimit
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
786
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
787 def bigmemtest(minsize, memuse, overhead=5*_1M):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
788 """Decorator for bigmem tests.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
789
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
790 'minsize' is the minimum useful size for the test (in arbitrary,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
791 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
792 the test, or a good estimate of it. 'overhead' specifies fixed overhead,
46430
47d9bbe10897 Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46370
diff changeset
793 independent of the testsize, and defaults to 5Mb.
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
794
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
795 The decorator tries to guess a good value for 'size' and passes it to
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
796 the decorated test function. If minsize * memuse is more than the
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
797 allowed memory use (as defined by max_memuse), the test is skipped.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
798 Otherwise, minsize is adjusted upward to use up to max_memuse.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
799 """
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
800 def decorator(f):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
801 def wrapper(self):
52069
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
802 # Retrieve values in case someone decided to adjust them
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
803 minsize = wrapper.minsize
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
804 memuse = wrapper.memuse
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
805 overhead = wrapper.overhead
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
806 if not max_memuse:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
807 # If max_memuse is 0 (the default),
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
808 # we still want to run the tests with size set to a few kb,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
809 # to make sure they work. We still want to avoid using
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
810 # too much memory, though, but we do that noisily.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
811 maxsize = 5147
55594
d7f3cdf2b07f Merged revisions 73718,73721,73723 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54554
diff changeset
812 self.assertFalse(maxsize * memuse + overhead > 20 * _1M)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
813 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
814 maxsize = int((max_memuse - overhead) / memuse)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
815 if maxsize < minsize:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
816 # Really ought to print 'test skipped' or something
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
817 if verbose:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
818 sys.stderr.write("Skipping %s because of memory "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
819 "constraint\n" % (f.__name__,))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
820 return
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
821 # Try to keep some breathing room in memory use
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
822 maxsize = max(maxsize - 50 * _1M, minsize)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
823 return f(self, maxsize)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
824 wrapper.minsize = minsize
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
825 wrapper.memuse = memuse
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
826 wrapper.overhead = overhead
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
827 return wrapper
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
828 return decorator
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
829
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
830 def precisionbigmemtest(size, memuse, overhead=5*_1M):
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
831 def decorator(f):
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
832 def wrapper(self):
52069
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
833 size = wrapper.size
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
834 memuse = wrapper.memuse
bfc2fa4c8444 Issue #3700: make test_bigmem py3k-compatible, and add bytes/bytearray tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 50915
diff changeset
835 overhead = wrapper.overhead
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
836 if not real_max_memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
837 maxsize = 5147
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
838 else:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
839 maxsize = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
840
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
841 if real_max_memuse and real_max_memuse < maxsize * memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
842 if verbose:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
843 sys.stderr.write("Skipping %s because of memory "
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
844 "constraint\n" % (f.__name__,))
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
845 return
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
846
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
847 return f(self, maxsize)
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
848 wrapper.size = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
849 wrapper.memuse = memuse
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
850 wrapper.overhead = overhead
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
851 return wrapper
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
852 return decorator
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
853
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
854 def bigaddrspacetest(f):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
855 """Decorator for tests that fill the address space."""
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
856 def wrapper(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
857 if max_memuse < MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
858 if verbose:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
859 sys.stderr.write("Skipping %s because of memory "
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
860 "constraint\n" % (f.__name__,))
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
861 else:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
862 return f(self)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
863 return wrapper
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
864
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
865 #=======================================================================
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
866 # unittest integration.
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
867
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
868 class BasicTestRunner:
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
869 def run(self, test):
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
870 result = unittest.TestResult()
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
871 test(result)
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
872 return result
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
873
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
874 def _id(obj):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
875 return obj
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
876
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
877 def requires_resource(resource):
65317
b83f0a667e7c Merged revisions 85482 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64605
diff changeset
878 if is_resource_enabled(resource):
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
879 return _id
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
880 else:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
881 return unittest.skip("resource {0!r} is not enabled".format(resource))
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
882
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
883 def cpython_only(test):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
884 """
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
885 Decorator for tests only applicable on CPython.
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
886 """
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
887 return impl_detail(cpython=True)(test)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
888
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
889 def impl_detail(msg=None, **guards):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
890 if check_impl_detail(**guards):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
891 return _id
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
892 if msg is None:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
893 guardnames, default = _parse_guards(guards)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
894 if default:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
895 msg = "implementation detail not available on {0}"
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
896 else:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
897 msg = "implementation detail specific to {0}"
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
898 guardnames = sorted(guardnames.keys())
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
899 msg = msg.format(' or '.join(guardnames))
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
900 return unittest.skip(msg)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
901
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
902 def _parse_guards(guards):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
903 # Returns a tuple ({platform_name: run_me}, default_value)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
904 if not guards:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
905 return ({'cpython': True}, False)
53487
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
906 is_true = list(guards.values())[0]
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
907 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
908 return (guards, not is_true)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
909
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
910 # Use the following check to guard CPython's implementation-specific tests --
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
911 # or to run them only on the implementation(s) guarded by the arguments.
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
912 def check_impl_detail(**guards):
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
913 """This function returns True or False depending on the host platform.
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
914 Examples:
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
915 if check_impl_detail(): # only on CPython (default)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
916 if check_impl_detail(jython=True): # only on Jython
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
917 if check_impl_detail(cpython=False): # everywhere except on CPython
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
918 """
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
919 guards, default = _parse_guards(guards)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
920 return guards.get(platform.python_implementation().lower(), default)
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
921
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
922
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
923
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
924 def _run_suite(suite):
19995
b07cb51d731c run_suite(): Oops, update a docstring.
Barry Warsaw <barry@python.org>
parents: 19994
diff changeset
925 """Run tests from a unittest.TestSuite-derived class."""
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
926 if verbose:
17171
4f68d3f8fdc8 When the regression test is run in verbose mode, make the PyUNIT-based
Fred Drake <fdrake@acm.org>
parents: 17133
diff changeset
927 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
928 else:
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
929 runner = BasicTestRunner()
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
930
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
931 result = runner.run(suite)
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
932 if not result.wasSuccessful():
18635
c8e4728d2ab0 Give more useful information about a failing PyUnit-style test.
Fred Drake <fdrake@acm.org>
parents: 17817
diff changeset
933 if len(result.errors) == 1 and not result.failures:
c8e4728d2ab0 Give more useful information about a failing PyUnit-style test.
Fred Drake <fdrake@acm.org>
parents: 17817
diff changeset
934 err = result.errors[0][1]
c8e4728d2ab0 Give more useful information about a failing PyUnit-style test.
Fred Drake <fdrake@acm.org>
parents: 17817
diff changeset
935 elif len(result.failures) == 1 and not result.errors:
c8e4728d2ab0 Give more useful information about a failing PyUnit-style test.
Fred Drake <fdrake@acm.org>
parents: 17817
diff changeset
936 err = result.failures[0][1]
c8e4728d2ab0 Give more useful information about a failing PyUnit-style test.
Fred Drake <fdrake@acm.org>
parents: 17817
diff changeset
937 else:
56949
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
938 err = "multiple errors occurred"
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
939 if not verbose: err += "; run in verbose mode for details"
19807
086ffafaed55 It appears that unittest was changed to stop hoarding raw exception data,
Tim Peters <tim.peters@gmail.com>
parents: 19768
diff changeset
940 raise TestFailed(err)
19817
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
941
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
942
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
943 def run_unittest(*classes):
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
944 """Run tests from unittest.TestCase-derived classes."""
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
945 valid_types = (unittest.TestSuite, unittest.TestCase)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
946 suite = unittest.TestSuite()
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
947 for cls in classes:
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43100
diff changeset
948 if isinstance(cls, str):
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
949 if cls in sys.modules:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
950 suite.addTest(unittest.findTestCases(sys.modules[cls]))
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
951 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
952 raise ValueError("str arguments must be keys in sys.modules")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
953 elif isinstance(cls, valid_types):
29880
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
954 suite.addTest(cls)
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
955 else:
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
956 suite.addTest(unittest.makeSuite(cls))
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
957 _run_suite(suite)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
958
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
959
19817
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
960 #=======================================================================
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
961 # doctest driver.
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
962
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
963 def run_doctest(module, verbosity=None):
20227
92f86436b6be SF bug [#467336] doctest failures w/ new-style classes.
Tim Peters <tim.peters@gmail.com>
parents: 20091
diff changeset
964 """Run doctest on the given module. Return (#failures, #tests).
19817
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
965
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
966 If optional argument verbosity is not specified (or is None), pass
47201
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 47067
diff changeset
967 support's belief about verbosity on to doctest. Else doctest's
19819
53e0cae3cf6c Repair late-night doc typos.
Tim Peters <tim.peters@gmail.com>
parents: 19817
diff changeset
968 usual behavior is used (it searches sys.argv for -v).
19817
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
969 """
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
970
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
971 import doctest
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
972
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
973 if verbosity is None:
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
974 verbosity = verbose
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
975 else:
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
976 verbosity = None
b7396287cf65 Teach regrtest how to pass on doctest failure msgs. This is done via a
Tim Peters <tim.peters@gmail.com>
parents: 19807
diff changeset
977
20088
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
978 # Direct doctest output (normally just errors) to real stdout; doctest
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
979 # output shouldn't be compared by regrtest.
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
980 save_stdout = sys.stdout
20091
40d4d1cd6c84 Guido points out that sys.__stdout__ is a bit bucket under IDLE. So keep
Tim Peters <tim.peters@gmail.com>
parents: 20088
diff changeset
981 sys.stdout = get_original_stdout()
20088
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
982 try:
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
983 f, t = doctest.testmod(module, verbose=verbosity)
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
984 if f:
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
985 raise TestFailed("%d of %d doctests failed" % (f, t))
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
986 finally:
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
987 sys.stdout = save_stdout
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
988 if verbose:
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
989 print('doctest (%s) ... %d tests with zero failures' %
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
990 (module.__name__, t))
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
991 return f, t
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
992
57215
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
993
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
994 #=======================================================================
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
995 # Support for saving and restoring the imported modules.
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
996
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
997 def modules_setup():
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
998 return sys.modules.copy(),
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
999
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1000 def modules_cleanup(oldmodules):
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1001 # Encoders/decoders are registered permanently within the internal
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1002 # codec cache. If we destroy the corresponding modules their
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1003 # globals will be set to None which will trip up the cached functions.
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1004 encodings = [(k, v) for k, v in sys.modules.items()
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1005 if k.startswith('encodings.')]
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1006 sys.modules.clear()
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1007 sys.modules.update(encodings)
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1008 sys.modules.update(oldmodules)
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1009
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1010 #=======================================================================
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1011 # Threading support to prevent reporting refleaks when running regrtest.py -R
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1012
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1013 def threading_setup():
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1014 import threading
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1015 return len(threading._active), len(threading._limbo)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1016
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1017 def threading_cleanup(num_active, num_limbo):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1018 import threading
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1019 import time
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1020
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1021 _MAX_COUNT = 10
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1022 count = 0
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1023 while len(threading._active) != num_active and count < _MAX_COUNT:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1024 count += 1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1025 time.sleep(0.1)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1026
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1027 count = 0
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1028 while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1029 count += 1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1030 time.sleep(0.1)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1031
54501
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1032 def reap_threads(func):
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1033 @functools.wraps(func)
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1034 def decorator(*args):
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1035 key = threading_setup()
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1036 try:
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1037 return func(*args)
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1038 finally:
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1039 threading_cleanup(*key)
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1040 return decorator
ced380b40004 Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53646
diff changeset
1041
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1042 def reap_children():
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1043 """Use this function at the end of test_main() whenever sub-processes
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1044 are started. This will help ensure that no extra children (zombies)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1045 stick around to hog resources and create problems when looking
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1046 for refleaks.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1047 """
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1048
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1049 # Reap all our dead child processes so we don't leave zombies around.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1050 # These hog resources and might be causing some of the buildbots to die.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1051 if hasattr(os, 'waitpid'):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1052 any_process = -1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1053 while True:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1054 try:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1055 # This will raise an exception on Windows. That's ok.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1056 pid, status = os.waitpid(any_process, os.WNOHANG)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1057 if pid == 0:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1058 break
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1059 except:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1060 break
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1061
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1062 def strip_python_stderr(stderr):
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1063 """Strip the stderr of a Python process from potential debug output
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1064 emitted by the interpreter.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1065
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1066 This will typically be run on the result of the communicate() method
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1067 of a subprocess.Popen object.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1068 """
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1069 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1070 return stderr